You are here

public function CommentTest::testPostIndividualDxWithoutCriticalBaseFields in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/jsonapi/tests/src/Functional/CommentTest.php \Drupal\Tests\jsonapi\Functional\CommentTest::testPostIndividualDxWithoutCriticalBaseFields()

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:

File

core/modules/jsonapi/tests/src/Functional/CommentTest.php, line 320

Class

CommentTest
JSON:API integration test for the "Comment" content entity type.

Namespace

Drupal\Tests\jsonapi\Functional

Code

public function testPostIndividualDxWithoutCriticalBaseFields() {
  $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');
}