diff --git a/tests/src/Functional/IndexResourceTest.php b/tests/src/Functional/IndexResourceTest.php index da40019caea89bb9defe949af4c9821d4836d4a6..2c8430eff80d54c0487351210257f9d0a448279d 100644 --- a/tests/src/Functional/IndexResourceTest.php +++ b/tests/src/Functional/IndexResourceTest.php @@ -65,103 +65,112 @@ final class IndexResourceTest extends BrowserTestBase { /** * Tests the results contain the index values. + * + * @param array $query + * The URL query params. + * @param int $expected_count + * The expected document count. + * @param array $expected_ids + * The expected entity IDs. + * @param array $expected_links_keys + * The expected pagination link keys. + * + * @dataProvider noQueryDataProvider + * @dataProvider paginationDataProvider + * @dataProvider fulltextDataProvider */ - public function testCollection() { - $url = Url::fromRoute('jsonapi_search_api.index_database_search_index'); + public function testCollection(array $query, int $expected_count, array $expected_ids, array $expected_links_keys): void { $request_options = []; $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; + + $url = Url::fromRoute('jsonapi_search_api.index_database_search_index', [], [ + 'query' => $query, + ]); $response = $this->request('GET', $url, $request_options); $this->assertSame(200, $response->getStatusCode(), var_export(Json::decode((string) $response->getBody()), TRUE)); $response_document = Json::decode((string) $response->getBody()); - $this->assertCount(count($this->entities), $response_document['data'], var_export($response_document, TRUE)); - $this->assertSame(array_keys($this->entities), array_map(static function (array $data) { + $this->assertCount($expected_count, $response_document['data'], var_export($response_document, TRUE)); + $this->assertSame($expected_ids, array_map(static function (array $data) { return $data['attributes']['drupal_internal__id']; }, $response_document['data'])); + foreach ($expected_links_keys as $links_key) { + $this->assertArrayHasKey($links_key, $response_document['links'], var_export($response_document['links'], TRUE)); + } } /** - * Tests the results contain the index values. + * No query data provider. + * + * @return \Generator + * The data. */ - public function testCollectionPagination() { - $request_options = []; - $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; + public function noQueryDataProvider(): \Generator { + yield [ + [], + 5, + [1, 2, 3, 4, 5], + [], + ]; + } - $url = Url::fromRoute('jsonapi_search_api.index_database_search_index', [], [ - 'query' => [ + /** + * Pagination data provider. + * + * @return \Generator + * The data. + */ + public function paginationDataProvider(): \Generator { + yield [ + [ 'page' => [ 'limit' => 2, 'offset' => 0, ], ], - ]); - $response = $this->request('GET', $url, $request_options); - $this->assertSame(200, $response->getStatusCode(), var_export(Json::decode((string) $response->getBody()), TRUE)); - $response_document = Json::decode((string) $response->getBody()); - $this->assertCount(2, $response_document['data'], var_export($response_document, TRUE)); - $this->assertSame([1, 2], array_map(static function (array $data) { - return $data['attributes']['drupal_internal__id']; - }, $response_document['data'])); - $this->assertArrayHasKey('next', $response_document['links']); - $this->assertArrayHasKey('last', $response_document['links']); - - $url = Url::fromRoute('jsonapi_search_api.index_database_search_index', [], [ - 'query' => [ + 2, + [1, 2], + ['next', 'last'], + ]; + yield [ + [ 'page' => [ 'limit' => 2, 'offset' => 2, ], ], - ]); - $response = $this->request('GET', $url, $request_options); - $this->assertSame(200, $response->getStatusCode(), var_export(Json::decode((string) $response->getBody()), TRUE)); - $response_document = Json::decode((string) $response->getBody()); - $this->assertCount(2, $response_document['data'], var_export($response_document, TRUE)); - $this->assertSame([3, 4], array_map(static function (array $data) { - return $data['attributes']['drupal_internal__id']; - }, $response_document['data'])); - $this->assertArrayHasKey('next', $response_document['links']); - $this->assertArrayHasKey('last', $response_document['links']); - $this->assertArrayHasKey('prev', $response_document['links']); - $this->assertArrayHasKey('first', $response_document['links']); + 2, + [3, 4], + ['next', 'last', 'prev', 'first'], + ]; } /** - * Tests the results contain the index values. + * Fulltext data provider. + * + * @return \Generator + * The data. */ - public function testCollectionFulltext() { - $url = Url::fromRoute('jsonapi_search_api.index_database_search_index', [], [ - 'query' => [ + public function fulltextDataProvider(): \Generator { + yield [ + [ 'filter' => [ 'fulltext' => 'föö', ], ], - ]); - $request_options = []; - $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; - $response = $this->request('GET', $url, $request_options); - $this->assertSame(200, $response->getStatusCode(), var_export(Json::decode((string) $response->getBody()), TRUE)); - $response_document = Json::decode((string) $response->getBody()); - $this->assertCount(1, $response_document['data'], var_export($response_document, TRUE)); - $this->assertSame([1], array_map(static function (array $data) { - return $data['attributes']['drupal_internal__id']; - }, $response_document['data'])); - - $url = Url::fromRoute('jsonapi_search_api.index_database_search_index', [], [ - 'query' => [ + 1, + [1], + [], + ]; + yield [ + [ 'filter' => [ 'fulltext' => 'foo', ], ], - ]); - $request_options = []; - $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; - $response = $this->request('GET', $url, $request_options); - $this->assertSame(200, $response->getStatusCode(), var_export(Json::decode((string) $response->getBody()), TRUE)); - $response_document = Json::decode((string) $response->getBody()); - $this->assertCount(4, $response_document['data'], var_export($response_document, TRUE)); - $this->assertSame([1, 2, 4, 5], array_map(static function (array $data) { - return $data['attributes']['drupal_internal__id']; - }, $response_document['data'])); + 4, + [1, 2, 4, 5], + [], + ]; } }