From 912146269cb62a7c5570f630d7299eb1408643d0 Mon Sep 17 00:00:00 2001 From: nod_ Date: Sun, 25 Aug 2024 07:29:21 +0200 Subject: [PATCH] Issue #3469819 by catch: Split up jsonapi CommentTest --- .../src/Functional/CommentExtrasTest.php | 112 ++++++++++++++++++ .../tests/src/Functional/CommentTest.php | 85 ------------- 2 files changed, 112 insertions(+), 85 deletions(-) create mode 100644 core/modules/jsonapi/tests/src/Functional/CommentExtrasTest.php diff --git a/core/modules/jsonapi/tests/src/Functional/CommentExtrasTest.php b/core/modules/jsonapi/tests/src/Functional/CommentExtrasTest.php new file mode 100644 index 00000000000..4de862de7fc --- /dev/null +++ b/core/modules/jsonapi/tests/src/Functional/CommentExtrasTest.php @@ -0,0 +1,112 @@ +name())) { + $this->markTestSkipped(); + } + parent::setUp(); + } + + /** + * Tests POSTing a comment without critical base fields. + * + * Note that testPostIndividual() is testing with the most minimal + * normalization possible: the one returned by ::getNormalizedPostEntity(). + * + * But Comment entities have some very special edge cases: + * - base fields that are not marked as required in + * \Drupal\comment\Entity\Comment::baseFieldDefinitions() yet in fact are + * required. + * - base fields that are marked as required, but yet can still result in + * validation errors other than "missing required field". + */ + public function testPostIndividualDxWithoutCriticalBaseFields(): void { + $this->setUpAuthorization('POST'); + $this->config('jsonapi.settings')->set('read_only', FALSE)->save(TRUE); + + $url = Url::fromRoute(sprintf('jsonapi.%s.collection.post', static::$resourceTypeName)); + $request_options = []; + $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; + $request_options[RequestOptions::HEADERS]['Content-Type'] = 'application/vnd.api+json'; + $request_options = NestedArray::mergeDeep($request_options, $this->getAuthenticationRequestOptions()); + + $remove_field = function (array $normalization, $type, $attribute_name) { + unset($normalization['data'][$type][$attribute_name]); + return $normalization; + }; + + // DX: 422 when missing 'entity_type' field. + $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'attributes', 'entity_type')); + $response = $this->request('POST', $url, $request_options); + $this->assertResourceErrorResponse(422, 'entity_type: This value should not be null.', NULL, $response, '/data/attributes/entity_type'); + + // DX: 422 when missing 'entity_id' field. + $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'relationships', 'entity_id')); + // @todo Remove the try/catch in https://www.drupal.org/node/2820364. + try { + $response = $this->request('POST', $url, $request_options); + $this->assertResourceErrorResponse(422, 'entity_id: This value should not be null.', NULL, $response, '/data/attributes/entity_id'); + } + catch (\Exception $e) { + $this->assertSame("Error: Call to a member function get() on null\nDrupal\\comment\\Plugin\\Validation\\Constraint\\CommentNameConstraintValidator->getAnonymousContactDetailsSetting()() (Line: 96)\n", $e->getMessage()); + } + + // DX: 422 when missing 'field_name' field. + $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'attributes', 'field_name')); + $response = $this->request('POST', $url, $request_options); + $this->assertResourceErrorResponse(422, 'field_name: This value should not be null.', NULL, $response, '/data/attributes/field_name'); + } + + /** + * Tests POSTing a comment with and without 'skip comment approval'. + */ + public function testPostIndividualSkipCommentApproval(): void { + $this->setUpAuthorization('POST'); + $this->config('jsonapi.settings')->set('read_only', FALSE)->save(TRUE); + + // Create request. + $request_options = []; + $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; + $request_options[RequestOptions::HEADERS]['Content-Type'] = 'application/vnd.api+json'; + $request_options = NestedArray::mergeDeep($request_options, $this->getAuthenticationRequestOptions()); + $request_options[RequestOptions::BODY] = Json::encode($this->getPostDocument()); + + $url = Url::fromRoute('jsonapi.comment--comment.collection.post'); + + // Status should be FALSE when posting as anonymous. + $response = $this->request('POST', $url, $request_options); + $document = $this->getDocumentFromResponse($response); + $this->assertResourceResponse(201, FALSE, $response); + $this->assertFalse($document['data']['attributes']['status']); + $this->assertFalse($this->entityStorage->loadUnchanged(2)->isPublished()); + + // Grant anonymous permission to skip comment approval. + $this->grantPermissionsToTestedRole(['skip comment approval']); + + // Status must be TRUE when posting as anonymous and skip comment approval. + $response = $this->request('POST', $url, $request_options); + $document = $this->getDocumentFromResponse($response); + $this->assertResourceResponse(201, FALSE, $response); + $this->assertTrue($document['data']['attributes']['status']); + $this->assertTrue($this->entityStorage->loadUnchanged(3)->isPublished()); + } + +} diff --git a/core/modules/jsonapi/tests/src/Functional/CommentTest.php b/core/modules/jsonapi/tests/src/Functional/CommentTest.php index b873d5b7f86..6078d3d6f0d 100644 --- a/core/modules/jsonapi/tests/src/Functional/CommentTest.php +++ b/core/modules/jsonapi/tests/src/Functional/CommentTest.php @@ -8,7 +8,6 @@ use Drupal\comment\Entity\Comment; use Drupal\comment\Entity\CommentType; use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; use Drupal\comment\Tests\CommentTestTrait; -use Drupal\Component\Serialization\Json; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\EntityInterface; @@ -309,90 +308,6 @@ class CommentTest extends ResourceTestBase { } } - /** - * Tests POSTing a comment without critical base fields. - * - * Note that testPostIndividual() is testing with the most minimal - * normalization possible: the one returned by ::getNormalizedPostEntity(). - * - * But Comment entities have some very special edge cases: - * - base fields that are not marked as required in - * \Drupal\comment\Entity\Comment::baseFieldDefinitions() yet in fact are - * required. - * - base fields that are marked as required, but yet can still result in - * validation errors other than "missing required field". - */ - public function testPostIndividualDxWithoutCriticalBaseFields(): void { - $this->setUpAuthorization('POST'); - $this->config('jsonapi.settings')->set('read_only', FALSE)->save(TRUE); - - $url = Url::fromRoute(sprintf('jsonapi.%s.collection.post', static::$resourceTypeName)); - $request_options = []; - $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; - $request_options[RequestOptions::HEADERS]['Content-Type'] = 'application/vnd.api+json'; - $request_options = NestedArray::mergeDeep($request_options, $this->getAuthenticationRequestOptions()); - - $remove_field = function (array $normalization, $type, $attribute_name) { - unset($normalization['data'][$type][$attribute_name]); - return $normalization; - }; - - // DX: 422 when missing 'entity_type' field. - $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'attributes', 'entity_type')); - $response = $this->request('POST', $url, $request_options); - $this->assertResourceErrorResponse(422, 'entity_type: This value should not be null.', NULL, $response, '/data/attributes/entity_type'); - - // DX: 422 when missing 'entity_id' field. - $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'relationships', 'entity_id')); - // @todo Remove the try/catch in https://www.drupal.org/node/2820364. - try { - $response = $this->request('POST', $url, $request_options); - $this->assertResourceErrorResponse(422, 'entity_id: This value should not be null.', NULL, $response, '/data/attributes/entity_id'); - } - catch (\Exception $e) { - $this->assertSame("Error: Call to a member function get() on null\nDrupal\\comment\\Plugin\\Validation\\Constraint\\CommentNameConstraintValidator->getAnonymousContactDetailsSetting()() (Line: 96)\n", $e->getMessage()); - } - - // DX: 422 when missing 'field_name' field. - $request_options[RequestOptions::BODY] = Json::encode($remove_field($this->getPostDocument(), 'attributes', 'field_name')); - $response = $this->request('POST', $url, $request_options); - $this->assertResourceErrorResponse(422, 'field_name: This value should not be null.', NULL, $response, '/data/attributes/field_name'); - } - - /** - * Tests POSTing a comment with and without 'skip comment approval'. - */ - public function testPostIndividualSkipCommentApproval(): void { - $this->setUpAuthorization('POST'); - $this->config('jsonapi.settings')->set('read_only', FALSE)->save(TRUE); - - // Create request. - $request_options = []; - $request_options[RequestOptions::HEADERS]['Accept'] = 'application/vnd.api+json'; - $request_options[RequestOptions::HEADERS]['Content-Type'] = 'application/vnd.api+json'; - $request_options = NestedArray::mergeDeep($request_options, $this->getAuthenticationRequestOptions()); - $request_options[RequestOptions::BODY] = Json::encode($this->getPostDocument()); - - $url = Url::fromRoute('jsonapi.comment--comment.collection.post'); - - // Status should be FALSE when posting as anonymous. - $response = $this->request('POST', $url, $request_options); - $document = $this->getDocumentFromResponse($response); - $this->assertResourceResponse(201, FALSE, $response); - $this->assertFalse($document['data']['attributes']['status']); - $this->assertFalse($this->entityStorage->loadUnchanged(2)->isPublished()); - - // Grant anonymous permission to skip comment approval. - $this->grantPermissionsToTestedRole(['skip comment approval']); - - // Status must be TRUE when posting as anonymous and skip comment approval. - $response = $this->request('POST', $url, $request_options); - $document = $this->getDocumentFromResponse($response); - $this->assertResourceResponse(201, FALSE, $response); - $this->assertTrue($document['data']['attributes']['status']); - $this->assertTrue($this->entityStorage->loadUnchanged(3)->isPublished()); - } - /** * {@inheritdoc} */