You are here

protected function ResourceTestBase::getExpectedGetRelationshipDocumentData in Drupal 10

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

Gets the expected document data for the given relationship.

Parameters

string $relationship_field_name: The relationship for which to get an expected response.

\Drupal\Core\Entity\EntityInterface|null $entity: (optional) The entity for which to get expected relationship data.

Return value

mixed The expected document data.

File

core/modules/jsonapi/tests/src/Functional/ResourceTestBase.php, line 1759

Class

ResourceTestBase
Subclass this for every JSON:API resource type.

Namespace

Drupal\Tests\jsonapi\Functional

Code

protected function getExpectedGetRelationshipDocumentData($relationship_field_name, EntityInterface $entity = NULL) {
  $entity = $entity ?: $this->entity;
  $internal_field_name = $this->resourceType
    ->getInternalName($relationship_field_name);

  /** @var \Drupal\Core\Field\FieldItemListInterface $field */
  $field = $entity->{$internal_field_name};
  $is_multiple = $field
    ->getFieldDefinition()
    ->getFieldStorageDefinition()
    ->getCardinality() !== 1;
  if ($field
    ->isEmpty()) {
    return $is_multiple ? [] : NULL;
  }
  if (!$is_multiple) {
    $target_entity = $field->entity;
    if (is_null($target_entity)) {
      return NULL;
    }
    $resource_identifier = static::toResourceIdentifier($target_entity);
    $resource_identifier = static::decorateResourceIdentifierWithDrupalInternalTargetId($field, $resource_identifier);
    return $resource_identifier;
  }
  else {
    $arity_counter = [];
    $relation_list = array_filter(array_map(function ($item) use (&$arity_counter) {
      $target_entity = $item->entity;
      if (is_null($target_entity)) {
        return NULL;
      }
      $resource_identifier = static::toResourceIdentifier($target_entity);
      $resource_identifier = static::decorateResourceIdentifierWithDrupalInternalTargetId($item, $resource_identifier);
      $type = $resource_identifier['type'];
      $id = $resource_identifier['id'];

      // Start the count of identifiers sharing a single type and ID at 1.
      if (!isset($arity_counter[$type][$id])) {
        $arity_counter[$type][$id] = 1;
      }
      else {
        $arity_counter[$type][$id] += 1;
      }
      return $resource_identifier;
    }, iterator_to_array($field)));
    $arity_map = [];
    $relation_list = array_map(function ($identifier) use ($arity_counter, &$arity_map) {
      $type = $identifier['type'];
      $id = $identifier['id'];

      // Only add an arity value if there are two or more resource identifiers
      // with the same type and ID.
      if (($arity_counter[$type][$id] ?? 0) > 1) {

        // Arity is indexed from 0. If the array key isn't set, 1 + (-1) = 0.
        if (!isset($arity_map[$type][$id])) {
          $arity_map[$type][$id] = 0;
        }
        else {
          $arity_map[$type][$id] += 1;
        }
        $identifier['meta']['arity'] = $arity_map[$type][$id];
      }
      return $identifier;
    }, $relation_list);
    return $relation_list;
  }
}