Skip to content

Commit 5b8b694

Browse files
committed
Add OpenSearch integration tests
1 parent 0862f00 commit 5b8b694

3 files changed

Lines changed: 103 additions & 2 deletions

File tree

.github/workflows/run-tests.yml

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ on:
88
jobs:
99
test:
1010
runs-on: ${{ matrix.os }}
11+
services:
12+
opensearch:
13+
image: opensearchproject/opensearch:2.13.0
14+
env:
15+
discovery.type: single-node
16+
plugins.security.disabled: true
17+
OPENSEARCH_JAVA_OPTS: -Xms512m -Xmx512m
18+
ports:
19+
- 9200:9200
20+
1121
strategy:
1222
fail-fast: true
1323
matrix:
@@ -29,5 +39,21 @@ jobs:
2939
- name: Install dependencies
3040
run: composer update --prefer-dist --no-interaction
3141

42+
- name: Wait for OpenSearch
43+
run: |
44+
for attempt in {1..60}; do
45+
if curl --fail --silent http://127.0.0.1:9200 > /dev/null; then
46+
exit 0
47+
fi
48+
49+
sleep 1
50+
done
51+
52+
echo "OpenSearch did not become available in time."
53+
docker logs "${{ job.services.opensearch.id }}"
54+
exit 1
55+
3256
- name: Execute tests
33-
run: vendor/bin/pest --ci
57+
run: vendor/bin/pest tests/Integration tests/Unit --ci
58+
env:
59+
OPENSEARCH_HOST: http://127.0.0.1:9200
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
use DirectoryTree\OpenSearchAdapter\Documents\Document;
4+
use DirectoryTree\OpenSearchAdapter\Documents\DocumentManager;
5+
use DirectoryTree\OpenSearchAdapter\Indices\Alias;
6+
use DirectoryTree\OpenSearchAdapter\Indices\IndexBlueprint;
7+
use DirectoryTree\OpenSearchAdapter\Indices\IndexManager;
8+
use DirectoryTree\OpenSearchAdapter\Search\SearchRequest;
9+
use OpenSearch\Client;
10+
use OpenSearch\GuzzleClientFactory;
11+
12+
it('manages indices documents aliases and searches against opensearch', function (): void {
13+
$client = openSearchClient();
14+
$indexManager = new IndexManager($client);
15+
$documentManager = new DocumentManager($client);
16+
17+
$indexName = sprintf('adapter_integration_%s', bin2hex(random_bytes(4)));
18+
$aliasName = $indexName.'_alias';
19+
20+
try {
21+
$indexManager->create(new IndexBlueprint($indexName));
22+
23+
expect($indexManager->exists($indexName))->toBeTrue();
24+
25+
$documentManager->index($indexName, [
26+
new Document('1', ['title' => 'Laravel OpenSearch adapter', 'status' => 'published']),
27+
new Document('2', ['title' => 'Draft document', 'status' => 'draft']),
28+
], refresh: true);
29+
30+
$response = $documentManager->search($indexName, new SearchRequest([
31+
'match' => [
32+
'title' => 'Laravel',
33+
],
34+
]));
35+
36+
expect($response->total())->toBe(1)
37+
->and($response->hits()[0]->document()->id())->toBe('1')
38+
->and($response->hits()[0]->document()->content('status'))->toBe('published');
39+
40+
$indexManager->putAlias($indexName, new Alias($aliasName, [
41+
'term' => ['status' => 'published'],
42+
]));
43+
44+
$aliases = $indexManager->getAliases($indexName);
45+
46+
expect($aliases)->toHaveKey($aliasName)
47+
->and($aliases[$aliasName]->filter())->toBe(['term' => ['status' => 'published']]);
48+
49+
$indexManager->deleteAlias($indexName, $aliasName);
50+
51+
expect($indexManager->getAliases($indexName))->not->toHaveKey($aliasName);
52+
53+
$documentManager->delete($indexName, ['1'], refresh: true);
54+
55+
expect($documentManager->search($indexName, new SearchRequest([
56+
'match' => [
57+
'title' => 'Laravel',
58+
],
59+
]))->total())->toBe(0);
60+
} finally {
61+
if ($indexManager->exists($indexName)) {
62+
$indexManager->drop($indexName);
63+
}
64+
}
65+
});
66+
67+
/**
68+
* Create an OpenSearch client for integration tests.
69+
*/
70+
function openSearchClient(): Client
71+
{
72+
return (new GuzzleClientFactory)->create([
73+
'base_uri' => getenv('OPENSEARCH_HOST') ?: 'http://127.0.0.1:9200',
74+
]);
75+
}

tests/Pest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
use PHPUnit\Framework\TestCase;
44

5-
uses(TestCase::class)->in('Unit');
5+
uses(TestCase::class)->in('Integration', 'Unit');

0 commit comments

Comments
 (0)