GetDocumentFromResponseTrait.php

Same filename and directory in other branches
  1. 10 core/modules/jsonapi/tests/src/Traits/GetDocumentFromResponseTrait.php
  2. 11.x core/modules/jsonapi/tests/src/Traits/GetDocumentFromResponseTrait.php

Namespace

Drupal\Tests\jsonapi\Traits

File

core/modules/jsonapi/tests/src/Traits/GetDocumentFromResponseTrait.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\jsonapi\Traits;

use Drupal\Component\Serialization\Json;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ResponseInterface;

/**
 * Test trait for retrieving the JSON:API document from a response.
 */
trait GetDocumentFromResponseTrait {
  
  /**
   * Retrieve document from response, with basic validation.
   *
   * @param \Psr\Http\Message\ResponseInterface $response
   *   Response to extract JSON:API document from.
   * @param bool $validate
   *   Determines whether the data is validated or not. Defaults to TRUE.
   *
   * @return ?array
   *   JSON:API document extracted from the response, or NULL.
   *
   * @throws \PHPUnit\Framework\AssertionFailedError
   *   Thrown when the document does not pass basic validation against the spec.
   */
  protected function getDocumentFromResponse(ResponseInterface $response, bool $validate = TRUE) : ?array {
    assert($this instanceof TestCase);
    $document = Json::decode((string) $response->getBody());
    if (isset($document['data']) && isset($document['errors'])) {
      $this->fail('Document contains both data and errors members; only one is allowed.');
    }
    if ($validate === TRUE && !isset($document['data'])) {
      if (isset($document['errors'])) {
        $errors = [];
        foreach ($document['errors'] as $error) {
          $errors[] = $error['title'] . ' (' . $error['status'] . '): ' . $error['detail'];
        }
        $this->fail('Missing expected data member in document. Error(s): ' . PHP_EOL . '  ' . implode('  ' . PHP_EOL, $errors));
      }
      $this->fail('Missing both data and errors members in document; either is required. Response body: ' . PHP_EOL . '  ' . $response->getBody());
    }
    return $document;
  }

}

Traits

Title Deprecated Summary
GetDocumentFromResponseTrait Test trait for retrieving the JSON:API document from a response.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.