Skip to content

Commit 16f3ee8

Browse files
committed
Added missing search query request.
1 parent 9786bf4 commit 16f3ee8

File tree

5 files changed

+331
-0
lines changed

5 files changed

+331
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Added
6+
7+
- Added missing search query request.
8+
59
### Changed
610

711
- Classes `Item`, `Recipe` and `Mod` now extend the `GenericEntity`.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FactorioItemBrowser\Api\Client\Request\Search;
6+
7+
use FactorioItemBrowser\Api\Client\Request\RequestInterface;
8+
use FactorioItemBrowser\Api\Client\Response\AbstractResponse;
9+
use FactorioItemBrowser\Api\Client\Response\PendingResponse;
10+
use FactorioItemBrowser\Api\Client\Response\Search\SearchQueryResponse;
11+
12+
/**
13+
* The request for the search query.
14+
*
15+
* @author BluePsyduck <[email protected]>
16+
* @license http://opensource.org/licenses/GPL-3.0 GPL v3
17+
*/
18+
class SearchQueryRequest implements RequestInterface
19+
{
20+
/**
21+
* The query to search for.
22+
* @var string
23+
*/
24+
protected $query = '';
25+
26+
/**
27+
* The number of results to return.
28+
* @var int
29+
*/
30+
protected $numberOfResults = 10;
31+
32+
/**
33+
* The 0-based index of the first result to return.
34+
* @var int
35+
*/
36+
protected $indexOfFirstResult = 0;
37+
38+
/**
39+
* The number pf recipes to return for each result.
40+
* @var int
41+
*/
42+
protected $numberOfRecipesPerResult = 3;
43+
44+
/**
45+
* Sets the query to search for.
46+
* @param string $query
47+
* @return $this
48+
*/
49+
public function setQuery(string $query)
50+
{
51+
$this->query = $query;
52+
return $this;
53+
}
54+
55+
/**
56+
* Sets the number of results to return.
57+
* @param int $numberOfResults
58+
* @return $this
59+
*/
60+
public function setNumberOfResults(int $numberOfResults)
61+
{
62+
$this->numberOfResults = $numberOfResults;
63+
return $this;
64+
}
65+
66+
/**
67+
* Sets the 0-based index of the first result to return.
68+
* @param int $indexOfFirstResult
69+
* @return $this
70+
*/
71+
public function setIndexOfFirstResult(int $indexOfFirstResult)
72+
{
73+
$this->indexOfFirstResult = $indexOfFirstResult;
74+
return $this;
75+
}
76+
77+
/**
78+
* Sets the number pf recipes to return for each result.
79+
* @param int $numberOfRecipesPerResult
80+
* @return $this
81+
*/
82+
public function setNumberOfRecipesPerResult(int $numberOfRecipesPerResult)
83+
{
84+
$this->numberOfRecipesPerResult = $numberOfRecipesPerResult;
85+
return $this;
86+
}
87+
88+
/**
89+
* Returns the path of the request, relative to the API URL.
90+
* @return string
91+
*/
92+
public function getRequestPath(): string
93+
{
94+
return '/search/query';
95+
}
96+
97+
/**
98+
* Returns the actual data of the request.
99+
* @return array
100+
*/
101+
public function getRequestData(): array
102+
{
103+
return [
104+
'query' => $this->query,
105+
'numberOfResults' => $this->numberOfResults,
106+
'indexOfFirstResult' => $this->indexOfFirstResult,
107+
'numberOfRecipesPerResult' => $this->numberOfRecipesPerResult
108+
];
109+
}
110+
111+
/**
112+
* Creates the response instance matching the request.
113+
* @param PendingResponse $pendingResponse
114+
* @return AbstractResponse
115+
*/
116+
public function createResponse(PendingResponse $pendingResponse): AbstractResponse
117+
{
118+
return new SearchQueryResponse($pendingResponse);
119+
}
120+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FactorioItemBrowser\Api\Client\Response\Search;
6+
7+
use BluePsyduck\Common\Data\DataContainer;
8+
use FactorioItemBrowser\Api\Client\Entity\GenericEntityWithRecipes;
9+
use FactorioItemBrowser\Api\Client\Response\AbstractResponse;
10+
11+
/**
12+
* The response of the search query request.
13+
*
14+
* @author BluePsyduck <[email protected]>
15+
* @license http://opensource.org/licenses/GPL-3.0 GPL v3
16+
*/
17+
class SearchQueryResponse extends AbstractResponse
18+
{
19+
/**
20+
* The results of the search.
21+
* @var array|GenericEntityWithRecipes[]
22+
*/
23+
protected $results;
24+
25+
/**
26+
* The total number of results of the search.
27+
* @var int
28+
*/
29+
protected $totalNumberOfResults;
30+
31+
/**
32+
* Returns the results of the search.
33+
* @return array|GenericEntityWithRecipes[]
34+
*/
35+
public function getResults(): array
36+
{
37+
$this->checkPendingResponse();
38+
return $this->results;
39+
}
40+
41+
/**
42+
* Returns the total number of results of the search.
43+
* @return int
44+
*/
45+
public function getTotalNumberOfResults(): int
46+
{
47+
$this->checkPendingResponse();
48+
return $this->totalNumberOfResults;
49+
}
50+
51+
/**
52+
* Maps the response data.
53+
* @param DataContainer $responseData
54+
* @return $this
55+
*/
56+
protected function mapResponse(DataContainer $responseData)
57+
{
58+
parent::mapResponse($responseData);
59+
$this->results = [];
60+
foreach ($responseData->getObjectArray('results') as $resultData) {
61+
$this->results[] = (new GenericEntityWithRecipes())->readData($resultData);
62+
}
63+
$this->totalNumberOfResults = $responseData->getInteger('totalNumberOfResults');
64+
return $this;
65+
}
66+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FactorioItemBrowserTest\Api\Client\Request\Search;
6+
7+
use FactorioItemBrowser\Api\Client\Request\Search\SearchQueryRequest;
8+
use FactorioItemBrowser\Api\Client\Response\Search\SearchQueryResponse;
9+
use FactorioItemBrowserTestAsset\Api\Client\Response\TestPendingResponse;
10+
use PHPUnit\Framework\TestCase;
11+
12+
/**
13+
* The PHPUnit test of the search query request class.
14+
*
15+
* @author BluePsyduck <[email protected]>
16+
* @license http://opensource.org/licenses/GPL-3.0 GPL v3
17+
* @coversDefaultClass \FactorioItemBrowser\Api\Client\Request\Search\SearchQueryRequest
18+
*/
19+
class SearchQueryRequestTest extends TestCase
20+
{
21+
/**
22+
* Tests getting the request path.
23+
* @covers ::getRequestPath
24+
*/
25+
public function testGetRequestPath()
26+
{
27+
$request = new SearchQueryRequest();
28+
$this->assertEquals('/search/query', $request->getRequestPath());
29+
}
30+
31+
/**
32+
* Tests getting the request data.
33+
* @covers ::getRequestData
34+
* @covers ::setQuery
35+
* @covers ::setNumberOfResults
36+
* @covers ::setIndexOfFirstResult
37+
* @covers ::setNumberOfRecipesPerResult
38+
*/
39+
public function testGetRequestData()
40+
{
41+
$request = new SearchQueryRequest();
42+
$this->assertEquals($request, $request->setQuery('abc'));
43+
$this->assertEquals($request, $request->setNumberOfResults(42));
44+
$this->assertEquals($request, $request->setIndexOfFirstResult(21));
45+
$this->assertEquals($request, $request->setNumberOfRecipesPerResult(1337));
46+
47+
$expectedData = [
48+
'query' => 'abc',
49+
'numberOfResults' => 42,
50+
'indexOfFirstResult' => 21,
51+
'numberOfRecipesPerResult' => 1337
52+
];
53+
$this->assertEquals($expectedData, $request->getRequestData());
54+
}
55+
56+
/**
57+
* Tests creating the response.
58+
* @covers ::createResponse
59+
*/
60+
public function testCreateResponse()
61+
{
62+
$request = new SearchQueryRequest();
63+
$this->assertInstanceOf(SearchQueryResponse::class, $request->createResponse(new TestPendingResponse()));
64+
}
65+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FactorioItemBrowserTest\Api\Client\Response\Search;
6+
7+
use FactorioItemBrowser\Api\Client\Entity\GenericEntityWithRecipes;
8+
use FactorioItemBrowser\Api\Client\Entity\Meta;
9+
use FactorioItemBrowser\Api\Client\Response\Search\SearchQueryResponse;
10+
use FactorioItemBrowserTestAsset\Api\Client\Response\TestPendingResponse;
11+
use PHPUnit\Framework\TestCase;
12+
13+
/**
14+
* The PHPUnit test of the search query response class.
15+
*
16+
* @author BluePsyduck <[email protected]>
17+
* @license http://opensource.org/licenses/GPL-3.0 GPL v3
18+
* @coversDefaultClass \FactorioItemBrowser\Api\Client\Response\Search\SearchQueryResponse
19+
*/
20+
class SearchQueryResponseTest extends TestCase
21+
{
22+
/**
23+
* Tests mapping and getting the results.
24+
* @covers ::getResults
25+
* @covers ::mapResponse
26+
*/
27+
public function testGetResults()
28+
{
29+
$responseData = [
30+
'results' => [
31+
['name' => 'abc'],
32+
['name' => 'def']
33+
]
34+
];
35+
$entity1 = new GenericEntityWithRecipes();
36+
$entity1->setName('abc');
37+
$entity2 = new GenericEntityWithRecipes();
38+
$entity2->setName('def');
39+
40+
$response = new SearchQueryResponse(new TestPendingResponse($responseData));
41+
$this->assertEquals([$entity1, $entity2], $response->getResults());
42+
}
43+
44+
/**
45+
* Tests mapping and getting the total number of results.
46+
* @covers ::getTotalNumberOfResults
47+
* @covers ::mapResponse
48+
*/
49+
public function testGetTotalNumberOfResults()
50+
{
51+
$responseData = [
52+
'totalNumberOfResults' => 42
53+
];
54+
55+
$response = new SearchQueryResponse(new TestPendingResponse($responseData));
56+
$this->assertEquals(42, $response->getTotalNumberOfResults());
57+
}
58+
59+
/**
60+
* Tests mapping and getting the meta data.
61+
* @coversNothing
62+
*/
63+
public function testGetMeta()
64+
{
65+
$responseData = [
66+
'meta' => [
67+
'executionTime' => 13.37
68+
]
69+
];
70+
$expectedMeta = new Meta();
71+
$expectedMeta->setExecutionTime(13.37);
72+
73+
$response = new SearchQueryResponse(new TestPendingResponse($responseData));
74+
$this->assertEquals($expectedMeta, $response->getMeta());
75+
}
76+
}

0 commit comments

Comments
 (0)