diff --git a/tests/src/Functional/JsonApiFunctionalTest.php b/tests/src/Functional/JsonApiFunctionalTest.php index 766b864..6da6396 100644 --- a/tests/src/Functional/JsonApiFunctionalTest.php +++ b/tests/src/Functional/JsonApiFunctionalTest.php @@ -244,61 +244,137 @@ class JsonApiFunctionalTest extends JsonApiFunctionalTestBase { ])); $this->assertSession()->statusCodeEquals(200); $this->assertGreaterThanOrEqual(1, count($single_output['data'])); - // 19. Test filtering with OR and AND group (Grouping grouped filters). + // 19. Test non-existing route without 'Accept' header. + $this->drupalGet('/jsonapi/node/article/broccoli'); + $this->assertSession()->statusCodeEquals(404); + // Without the 'Accept' header we cannot know we want the 404 error + // formatted as JSON API. + $this->assertSession()->responseHeaderContains('Content-Type', 'text/html'); + // 20. Test non-existing route with 'Accept' header. + $single_output = Json::decode($this->drupalGet('/jsonapi/node/article/broccoli', [], [ + 'Accept' => 'application/vnd.api+json', + ])); + $this->assertEquals(404, $single_output['errors'][0]['status']); + $this->assertSession()->statusCodeEquals(404); + // With the 'Accept' header we can know we want the 404 error formatted as + // JSON API. + $this->assertSession()->responseHeaderContains('Content-Type', 'application/vnd.api+json'); + + // Test documentation filtering examples. + // 1. Only get published nodes. $filter = [ - 'and-group' => [ - 'group' => [ - 'conjunction' => 'AND', + 'status-filter' => [ + 'condition' => [ + 'path' => 'status', + 'value' => 1, ], ], - 'or-group' => [ - 'group' => [ - 'conjunction' => 'OR', - 'memberOf' => 'and-group', + ]; + $collection_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ + 'query' => ['filter' => $filter], + ])); + $this->assertSession()->statusCodeEquals(200); + $this->assertGreaterThanOrEqual(OffsetPage::$maxSize, count($collection_output['data'])); + // 2. Nested Filters: Get nodes created by user admin. + $filter = [ + 'name-filter' => [ + 'condition' => [ + 'path' => 'uid.name', + 'value' => $this->user->getAccountName(), ], ], - 'admin-filter' => [ + ]; + $collection_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ + 'query' => ['filter' => $filter], + ])); + $this->assertSession()->statusCodeEquals(200); + $this->assertGreaterThanOrEqual(OffsetPage::$maxSize, count($collection_output['data'])); + // 3. Filtering with arrays: Get nodes created by users [admin, john]. + $filter = [ + 'name-filter' => [ 'condition' => [ 'path' => 'uid.name', - 'value' => $this->user->getAccountName(), - 'memberOf' => 'and-group', + 'operator' => 'IN', + 'value' => [ + $this->user->getAccountName(), + $this->getRandomGenerator()->name(), + ], + ], + ], + ]; + $collection_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ + 'query' => ['filter' => $filter], + ])); + $this->assertSession()->statusCodeEquals(200); + $this->assertGreaterThanOrEqual(OffsetPage::$maxSize, count($collection_output['data'])); + // 4. Grouping filters: Get nodes that are published and create by admin. + $filter = [ + 'and-group' => [ + 'group' => [ + 'conjunction' => 'AND', ], ], - 'sticky-filter' => [ + 'name-filter' => [ 'condition' => [ - 'path' => 'sticky', - 'value' => 1, - 'memberOf' => 'or-group', + 'path' => 'uid.name', + 'value' => $this->user->getAccountName(), + 'memberOf' => 'and-group', ], ], - 'promote-filter' => [ + 'status-filter' => [ 'condition' => [ - 'path' => 'promote', + 'path' => 'status', 'value' => 1, - 'memberOf' => 'or-group', + 'memberOf' => 'and-group', ], ], ]; - $single_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ + $collection_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ 'query' => ['filter' => $filter], ])); $this->assertSession()->statusCodeEquals(200); - $this->assertGreaterThanOrEqual(0, count($single_output['data'])); - // 20. Test non-existing route without 'Accept' header. - $this->drupalGet('/jsonapi/node/article/broccoli'); - $this->assertSession()->statusCodeEquals(404); - // Without the 'Accept' header we cannot know we want the 404 error - // formatted as JSON API. - $this->assertSession()->responseHeaderContains('Content-Type', 'text/html'); - // 21. Test non-existing route with 'Accept' header. - $single_output = Json::decode($this->drupalGet('/jsonapi/node/article/broccoli', [], [ - 'Accept' => 'application/vnd.api+json', - ])); - $this->assertEquals(404, $single_output['errors'][0]['status']); - $this->assertSession()->statusCodeEquals(404); - // With the 'Accept' header we can know we want the 404 error formatted as - // JSON API. - $this->assertSession()->responseHeaderContains('Content-Type', 'application/vnd.api+json'); + $this->assertGreaterThanOrEqual(OffsetPage::$maxSize, count($collection_output['data'])); + // 5. Grouping grouped filters: Get nodes that are promoted or sticky and + // created by admin. +// $filter = [ +// 'and-group' => [ +// 'group' => [ +// 'conjunction' => 'AND', +// ], +// ], +// 'or-group' => [ +// 'group' => [ +// 'conjunction' => 'OR', +// 'memberOf' => 'and-group', +// ], +// ], +// 'admin-filter' => [ +// 'condition' => [ +// 'path' => 'uid.name', +// 'value' => $this->user->getAccountName(), +// 'memberOf' => 'and-group', +// ], +// ], +// 'sticky-filter' => [ +// 'condition' => [ +// 'path' => 'sticky', +// 'value' => 1, +// 'memberOf' => 'or-group', +// ], +// ], +// 'promote-filter' => [ +// 'condition' => [ +// 'path' => 'promote', +// 'value' => 1, +// 'memberOf' => 'or-group', +// ], +// ], +// ]; +// $collection_output = Json::decode($this->drupalGet('/jsonapi/node/article', [ +// 'query' => ['filter' => $filter], +// ])); +// $this->assertSession()->statusCodeEquals(200); +// $this->assertEquals(0, count($collection_output['data'])); } /**