Skip to content

Commit ec47309

Browse files
committed
NTR - add SimilarSearch API Endpoint
1 parent b276ee9 commit ec47309

File tree

8 files changed

+272
-0
lines changed

8 files changed

+272
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use BatteryIncludedSdk\Client\ApiClient;
6+
use BatteryIncludedSdk\Client\CurlHttpClient;
7+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchService;
8+
9+
require_once __DIR__ . '/../../vendor/autoload.php';
10+
require_once __DIR__ . '/../credentials.php';
11+
12+
$apiClient = new ApiClient(
13+
new CurlHttpClient(),
14+
'https://api.batteryincluded.io/api/v1/collections/',
15+
$collection,
16+
$apiKey
17+
);
18+
19+
$similarService = new SimilarSearchService($apiClient);
20+
21+
echo '<pre>';
22+
print_r($similarService->search('Apple', 'DE')->getSimilarSearches());
23+
echo '</pre>';
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BatteryIncludedSdk\SimilarSearch;
6+
7+
class SimilarSearchDto
8+
{
9+
public function __construct(
10+
private string $query,
11+
private int $count,
12+
private int $hits,
13+
private string $highlighted,
14+
) {
15+
}
16+
17+
public function getQuery(): string
18+
{
19+
return $this->query;
20+
}
21+
22+
public function getCount(): int
23+
{
24+
return $this->count;
25+
}
26+
27+
public function getHits(): int
28+
{
29+
return $this->hits;
30+
}
31+
32+
public function getHighlighted(): string
33+
{
34+
return $this->highlighted;
35+
}
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BatteryIncludedSdk\SimilarSearch;
6+
7+
use BatteryIncludedSdk\Service\Response;
8+
9+
class SimilarSearchResponse extends Response
10+
{
11+
private array $similarSearches;
12+
13+
public function __construct(string $responseRaw)
14+
{
15+
parent::__construct($responseRaw);
16+
$this->similarSearches = [];
17+
foreach ($this->getBody()['searches'] as $similarSearch) {
18+
$this->similarSearches[] = new SimilarSearchDto(
19+
$similarSearch['q'] ?? '',
20+
(int) ($similarSearch['count'] ?? 0),
21+
(int) ($similarSearch['hits'] ?? 0),
22+
$similarSearch['highlighted'] ?? ''
23+
);
24+
}
25+
}
26+
27+
/**
28+
* @return array<SimilarSearchDto>
29+
*/
30+
public function getSimilarSearches(): array
31+
{
32+
return $this->similarSearches;
33+
}
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BatteryIncludedSdk\SimilarSearch;
6+
7+
use BatteryIncludedSdk\Client\ApiClient;
8+
9+
class SimilarSearchService
10+
{
11+
public function __construct(private ApiClient $apiClient)
12+
{
13+
}
14+
15+
public function search(string $query, string $locale = 'DE'): SimilarSearchResponse
16+
{
17+
$query = http_build_query(
18+
[
19+
'q' => $query,
20+
'v[locale]' => $locale,
21+
]
22+
);
23+
24+
$response = $this->apiClient->getJson(
25+
'/documents/similar-search?' . $query,
26+
[]
27+
);
28+
29+
return new SimilarSearchResponse($response->getRawResponse());
30+
}
31+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Shop;
6+
7+
use BatteryIncludedSdk\Shop\FacetCategoryDto;
8+
use BatteryIncludedSdk\Shop\FacetDto;
9+
use PHPUnit\Framework\Attributes\CoversClass;
10+
use PHPUnit\Framework\TestCase;
11+
12+
#[CoversClass(FacetDto::class)]
13+
#[CoversClass(FacetCategoryDto::class)]
14+
class FacetCategoryDtoTest extends TestCase
15+
{
16+
public function testBuildCategoryTreeSetsCheckedAndBuildsTree(): void
17+
{
18+
$data = [
19+
'field_name' => 'category',
20+
'counts' => [
21+
['value' => 'A', 'count' => 5],
22+
['value' => 'A > B', 'count' => 3],
23+
['value' => 'A > B > C', 'count' => 1],
24+
['value' => 'D', 'count' => 2],
25+
],
26+
];
27+
$appliedFilterValues = [
28+
'category' => ['A > B'],
29+
];
30+
31+
$dto = new FacetCategoryDto($data, $appliedFilterValues);
32+
$categories = $dto->getCategories();
33+
34+
35+
$this->assertArrayHasKey('A', $categories);
36+
$this->assertArrayHasKey('B', $categories['A']['childs']);
37+
$this->assertTrue($categories['A']['checked'] ?? false);
38+
$this->assertTrue($categories['A']['childs']['B']['checked'] ?? false);
39+
$this->assertFalse($categories['A']['childs']['B']['childs']['C']['checked'] ?? true);
40+
$this->assertSame(3, $categories['A']['childs']['B']['count']);
41+
$this->assertSame(5, $categories['A']['count']);
42+
}
43+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BatteryIncludedSdkTests\SimilarSearch;
6+
7+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchDto;
8+
use PHPUnit\Framework\Attributes\CoversClass;
9+
use PHPUnit\Framework\TestCase;
10+
11+
#[CoversClass(SimilarSearchDto::class)]
12+
class SimilarSearchDtoTest extends TestCase
13+
{
14+
public function testGettersReturnConstructorValues(): void
15+
{
16+
$dto = new SimilarSearchDto('test-query', 5, 10, 'highlighted-text');
17+
18+
$this->assertSame('test-query', $dto->getQuery());
19+
$this->assertSame(5, $dto->getCount());
20+
$this->assertSame(10, $dto->getHits());
21+
$this->assertSame('highlighted-text', $dto->getHighlighted());
22+
}
23+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace BatteryIncludedSdkTests\SimilarSearch;
6+
7+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchDto;
8+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchResponse;
9+
use PHPUnit\Framework\Attributes\CoversClass;
10+
use PHPUnit\Framework\TestCase;
11+
12+
#[CoversClass(SimilarSearchResponse::class)]
13+
#[CoversClass(SimilarSearchDto::class)]
14+
class SimilarSearchResponseTest extends TestCase
15+
{
16+
public function testSimilarSearchesAreParsedCorrectly(): void
17+
{
18+
$responseRaw = json_encode([
19+
'searches' => [
20+
[
21+
'q' => 'test1',
22+
'count' => 5,
23+
'hits' => 10,
24+
'highlighted' => 'highlight1',
25+
],
26+
[
27+
'q' => 'test2',
28+
'count' => 3,
29+
'hits' => 7,
30+
'highlighted' => 'highlight2',
31+
],
32+
],
33+
]);
34+
35+
$response = new SimilarSearchResponse($responseRaw);
36+
37+
$similarSearches = $response->getSimilarSearches();
38+
39+
$this->assertCount(2, $similarSearches);
40+
$this->assertInstanceOf(SimilarSearchDto::class, $similarSearches[0]);
41+
$this->assertSame('test1', $similarSearches[0]->getQuery());
42+
$this->assertSame(5, $similarSearches[0]->getCount());
43+
$this->assertSame(10, $similarSearches[0]->getHits());
44+
$this->assertSame('highlight1', $similarSearches[0]->getHighlighted());
45+
}
46+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimilarSearch;
6+
7+
use BatteryIncludedSdk\Client\ApiClient;
8+
use BatteryIncludedSdk\Client\CurlHttpClient;
9+
use BatteryIncludedSdk\Service\AbstractService;
10+
use BatteryIncludedSdk\Service\Response;
11+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchDto;
12+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchResponse;
13+
use BatteryIncludedSdk\SimilarSearch\SimilarSearchService;
14+
use BatteryIncludedSdkTests\Helper;
15+
use PHPUnit\Framework\Attributes\CoversClass;
16+
use PHPUnit\Framework\Attributes\UsesClass;
17+
use PHPUnit\Framework\TestCase;
18+
19+
#[CoversClass(SimilarSearchResponse::class)]
20+
#[CoversClass(SimilarSearchService::class)]
21+
#[UsesClass(ApiClient::class)]
22+
#[UsesClass(CurlHttpClient::class)]
23+
#[UsesClass(Response::class)]
24+
#[UsesClass(AbstractService::class)]
25+
class SimilarSearchServiceTest extends TestCase
26+
{
27+
public function testSimilarSearchMethodAgainstLiveApi()
28+
{
29+
$browseService = new SimilarSearchService(Helper::getApiClient());
30+
$result = $browseService->search('iPhone');
31+
32+
$this->assertContainsOnlyInstancesOf(SimilarSearchDto::class, $result->getSimilarSearches());
33+
34+
$this->assertInstanceOf(SimilarSearchResponse::class, $result);
35+
}
36+
}

0 commit comments

Comments
 (0)