Drupal 8.0.0 beta 12. More info: https://www.drupal.org/node/2514176
This commit is contained in:
commit
9921556621
13277 changed files with 1459781 additions and 0 deletions
6
core/modules/serialization/serialization.info.yml
Normal file
6
core/modules/serialization/serialization.info.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
name: Serialization
|
||||
type: module
|
||||
description: Provides a service for (de)serializing data to/from formats such as JSON and XML
|
||||
package: Web services
|
||||
version: VERSION
|
||||
core: 8.x
|
25
core/modules/serialization/serialization.module
Normal file
25
core/modules/serialization/serialization.module
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Provides a service for (de)serializing data to/from formats such as JSON and XML.
|
||||
*/
|
||||
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
|
||||
/**
|
||||
* Implements hook_help().
|
||||
*/
|
||||
function serialization_help($route_name, RouteMatchInterface $route_match) {
|
||||
switch ($route_name) {
|
||||
case 'help.page.serialization':
|
||||
$output = '';
|
||||
$output .= '<h3>' . t('About') . '</h3>';
|
||||
$output .= '<p>' . t('The Serialization module provides a service for serializing and deserializing data to and from formats such as JSON and XML.') . '</p>';
|
||||
$output .= '<p>' . t('Serialization is the process of converting data structures like arrays and objects into a string. This allows the data to be represented in a way that is easy to exchange and store (for example, for transmission over the Internet or for storage in a local file system). These representations can then be deserialized to get back to the original data structures.') . '</p>';
|
||||
$output .= '<p>' . t('The serializer splits this process into two parts. Normalization converts an object to a normalized array structure. Encoding takes that array and converts it to a string.') . '</p>';
|
||||
$output .= '<p>' . t('This module does not have a user interface. It is used by other modules which need to serialize data, such as <a href="!rest">REST</a>.', array('!rest' => (\Drupal::moduleHandler()->moduleExists('rest')) ? \Drupal::url('help.page', array('name' => 'rest')) : '#')) . '</p>';
|
||||
$output .= '<p>' . t('For more information, see the <a href="!doc_url">online documentation for the Serialization module</a>.', array('!doc_url' => 'https://www.drupal.org/documentation/modules/serialization')) . '</p>';
|
||||
return $output;
|
||||
}
|
||||
}
|
55
core/modules/serialization/serialization.services.yml
Normal file
55
core/modules/serialization/serialization.services.yml
Normal file
|
@ -0,0 +1,55 @@
|
|||
services:
|
||||
serializer:
|
||||
class: Symfony\Component\Serializer\Serializer
|
||||
arguments: [{ }, { }]
|
||||
serializer.normalizer.config_entity:
|
||||
class: Drupal\serialization\Normalizer\ConfigEntityNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
arguments: ['@entity.manager']
|
||||
serializer.normalizer.content_entity:
|
||||
class: Drupal\serialization\Normalizer\ContentEntityNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
arguments: ['@entity.manager']
|
||||
serializer.normalizer.entity:
|
||||
class: Drupal\serialization\Normalizer\EntityNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
arguments: ['@entity.manager']
|
||||
serializer.normalizer.complex_data:
|
||||
class: Drupal\serialization\Normalizer\ComplexDataNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
serializer.normalizer.list:
|
||||
class: Drupal\serialization\Normalizer\ListNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
serializer.normalizer.password_field_item:
|
||||
class: Drupal\serialization\Normalizer\NullNormalizer
|
||||
arguments: ['Drupal\Core\Field\Plugin\Field\FieldType\PasswordItem']
|
||||
tags:
|
||||
- { name: normalizer, priority: 20 }
|
||||
serializer.normalizer.typed_data:
|
||||
class: Drupal\serialization\Normalizer\TypedDataNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
serializer.encoder.json:
|
||||
class: Drupal\serialization\Encoder\JsonEncoder
|
||||
tags:
|
||||
- { name: encoder, format: json }
|
||||
serializer.encoder.xml:
|
||||
class: Drupal\serialization\Encoder\XmlEncoder
|
||||
tags:
|
||||
- { name: encoder, format: xml }
|
||||
serializer.entity_resolver:
|
||||
class: Drupal\serialization\EntityResolver\ChainEntityResolver
|
||||
serializer.entity_resolver.uuid:
|
||||
class: Drupal\serialization\EntityResolver\UuidResolver
|
||||
tags:
|
||||
- { name: entity_resolver}
|
||||
arguments: ['@entity.manager']
|
||||
serialization.entity_resolver.target_id:
|
||||
class: Drupal\serialization\EntityResolver\TargetIdResolver
|
||||
tags:
|
||||
- { name: entity_resolver}
|
40
core/modules/serialization/src/Encoder/JsonEncoder.php
Normal file
40
core/modules/serialization/src/Encoder/JsonEncoder.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Encoder\JsonEncoder.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Encoder;
|
||||
|
||||
use Symfony\Component\Serializer\Encoder\DecoderInterface;
|
||||
use Symfony\Component\Serializer\Encoder\EncoderInterface;
|
||||
use Symfony\Component\Serializer\Encoder\JsonEncoder as BaseJsonEncoder;
|
||||
|
||||
/**
|
||||
* Adds 'ajax to the supported content types of the JSON encoder'
|
||||
*/
|
||||
class JsonEncoder extends BaseJsonEncoder implements EncoderInterface, DecoderInterface {
|
||||
|
||||
/**
|
||||
* The formats that this Encoder supports.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $format = array('json', 'ajax');
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function supportsEncoding($format) {
|
||||
return in_array($format, static::$format);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function supportsDecoding($format) {
|
||||
return in_array($format, static::$format);
|
||||
}
|
||||
|
||||
}
|
86
core/modules/serialization/src/Encoder/XmlEncoder.php
Normal file
86
core/modules/serialization/src/Encoder/XmlEncoder.php
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Encoder\XmlEncoder.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Encoder;
|
||||
|
||||
use Symfony\Component\Serializer\Encoder\EncoderInterface;
|
||||
use Symfony\Component\Serializer\Encoder\DecoderInterface;
|
||||
use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder;
|
||||
|
||||
/**
|
||||
* Adds XML support for serializer.
|
||||
*
|
||||
* This acts as a wrapper class for Symfony's XmlEncoder so that it is not
|
||||
* implementing NormalizationAwareInterface, and can be normalized externally.
|
||||
*/
|
||||
class XmlEncoder implements EncoderInterface, DecoderInterface {
|
||||
|
||||
/**
|
||||
* The formats that this Encoder supports.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static protected $format = array('xml');
|
||||
|
||||
/**
|
||||
* An instance of the Symfony XmlEncoder to perform the actual encoding.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\Encoder\XmlEncoder
|
||||
*/
|
||||
protected $baseEncoder;
|
||||
|
||||
/**
|
||||
* Gets the base encoder instance.
|
||||
*
|
||||
* @return \Symfony\Component\Serializer\Encoder\XmlEncoder
|
||||
* The base encoder.
|
||||
*/
|
||||
public function getBaseEncoder() {
|
||||
if (!isset($this->baseEncoder)) {
|
||||
$this->baseEncoder = new BaseXmlEncoder();
|
||||
}
|
||||
|
||||
return $this->baseEncoder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the base encoder instance.
|
||||
*
|
||||
* @param \Symfony\Component\Serializer\Encoder\XmlEncoder $encoder
|
||||
*/
|
||||
public function setBaseEncoder($encoder) {
|
||||
$this->baseEncoder = $encoder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::encode().
|
||||
*/
|
||||
public function encode($data, $format, array $context = array()){
|
||||
return $this->getBaseEncoder()->encode($data, $format, $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\JsonEncoder::supportsEncoding().
|
||||
*/
|
||||
public function supportsEncoding($format) {
|
||||
return in_array($format, static::$format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::decode().
|
||||
*/
|
||||
public function decode($data, $format, array $context = array()){
|
||||
return $this->getBaseEncoder()->decode($data, $format, $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\JsonEncoder::supportsDecoding().
|
||||
*/
|
||||
public function supportsDecoding($format) {
|
||||
return in_array($format, static::$format);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\ChainEntityResolver.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
/**
|
||||
* Resolver delegating the entity resolution to a chain of resolvers.
|
||||
*/
|
||||
class ChainEntityResolver implements ChainEntityResolverInterface {
|
||||
|
||||
/**
|
||||
* The concrete resolvers.
|
||||
*
|
||||
* @var \Drupal\serialization\EntityResolver\EntityResolverInterface[]
|
||||
*/
|
||||
protected $resolvers = array();
|
||||
|
||||
/**
|
||||
* Constructs a ChainEntityResolver object.
|
||||
*
|
||||
* @param \Drupal\serialization\EntityResolver\EntityResolverInterface[] $resolvers
|
||||
* The array of concrete resolvers.
|
||||
*/
|
||||
public function __construct(array $resolvers = array()) {
|
||||
$this->resolvers = $resolvers;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function addResolver(EntityResolverInterface $resolver) {
|
||||
$this->resolvers[] = $resolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function resolve(NormalizerInterface $normalizer, $data, $entity_type) {
|
||||
foreach ($this->resolvers as $resolver) {
|
||||
$resolved = $resolver->resolve($normalizer, $data, $entity_type);
|
||||
if (isset($resolved)) {
|
||||
return $resolved;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\ChainEntityResolverInterface.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
/**
|
||||
* An interface for delegating a entity resolution to a chain of resolvers.
|
||||
*/
|
||||
interface ChainEntityResolverInterface extends EntityResolverInterface {
|
||||
|
||||
/**
|
||||
* Adds an entity resolver.
|
||||
*
|
||||
* @param \Drupal\serialization\EntityResolver\EntityResolverInterface $resolver
|
||||
* The entity resolver to add.
|
||||
*/
|
||||
public function addResolver(EntityResolverInterface $resolver);
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\EntityResolverInterface.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
interface EntityResolverInterface {
|
||||
|
||||
/**
|
||||
* Returns the local ID of an entity referenced by serialized data.
|
||||
*
|
||||
* Drupal entities are loaded by and internally referenced by a local ID.
|
||||
* Because different websites can use the same local ID to refer to different
|
||||
* entities (e.g., node "1" can be a different node on foo.com and bar.com, or
|
||||
* on example.com and staging.example.com), it is generally unsuitable for use
|
||||
* in hypermedia data exchanges. Instead, UUIDs, URIs, or other globally
|
||||
* unique IDs are preferred.
|
||||
*
|
||||
* This function takes a $data array representing partially deserialized data
|
||||
* for an entity reference, and resolves it to a local entity ID. For example,
|
||||
* depending on the data specification being used, $data might contain a
|
||||
* 'uuid' key, a 'uri' key, a 'href' key, or some other data identifying the
|
||||
* entity, and it is up to the implementor of this interface to resolve that
|
||||
* appropriately for the specification being used.
|
||||
*
|
||||
* @param \Symfony\Component\Serializer\Normalizer\NormalizerInterface $normalizer
|
||||
* The Normalizer which is handling the data.
|
||||
* @param array $data
|
||||
* The data passed into the calling Normalizer.
|
||||
* @param string $entity_type
|
||||
* The type of entity being resolved; e.g., 'node' or 'user'.
|
||||
*
|
||||
* @return string|null
|
||||
* Returns the local entity ID, if found. Otherwise, returns NULL.
|
||||
*/
|
||||
public function resolve(NormalizerInterface $normalizer, $data, $entity_type);
|
||||
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\TargetIdResolver.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
/**
|
||||
* Resolves entities from data that contains an entity target ID.
|
||||
*/
|
||||
class TargetIdResolver implements EntityResolverInterface {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function resolve(NormalizerInterface $normalizer, $data, $entity_type) {
|
||||
if (isset($data['target_id'])) {
|
||||
return $data['target_id'];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\UuidReferenceInterface.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
/**
|
||||
* Interface for extracting UUID from entity reference data when denormalizing.
|
||||
*/
|
||||
interface UuidReferenceInterface extends NormalizerInterface {
|
||||
|
||||
/**
|
||||
* Get the uuid from the data array.
|
||||
*
|
||||
* @param array $data
|
||||
* The data, as was passed into the Normalizer.
|
||||
*
|
||||
* @return string
|
||||
* A UUID.
|
||||
*/
|
||||
public function getUuid($data);
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\EntityResolver\UuidResolver.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\EntityResolver;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
/**
|
||||
* Resolves entities from data that contains an entity UUID.
|
||||
*/
|
||||
class UuidResolver implements EntityResolverInterface {
|
||||
|
||||
/**
|
||||
* The entity manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* Constructs a UuidResolver object.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
|
||||
* The entity manager.
|
||||
*/
|
||||
public function __construct(EntityManagerInterface $entity_manager) {
|
||||
$this->entityManager = $entity_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function resolve(NormalizerInterface $normalizer, $data, $entity_type) {
|
||||
// The normalizer is what knows the specification of the data being
|
||||
// deserialized. If it can return a UUID from that data, and if there's an
|
||||
// entity with that UUID, then return its ID.
|
||||
if (($normalizer instanceof UuidReferenceInterface) && ($uuid = $normalizer->getUuid($data))) {
|
||||
if ($entity = $this->entityManager->loadEntityByUuid($entity_type, $uuid)) {
|
||||
return $entity->id();
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\ComplexDataNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
use Symfony\Component\Serializer\Exception\RuntimeException;
|
||||
|
||||
/**
|
||||
* Converts the Drupal entity object structures to a normalized array.
|
||||
*
|
||||
* This is the default Normalizer for entities. All formats that have Encoders
|
||||
* registered with the Serializer in the DIC will be normalized with this
|
||||
* class unless another Normalizer is registered which supersedes it. If a
|
||||
* module wants to use format-specific or class-specific normalization, then
|
||||
* that module can register a new Normalizer and give it a higher priority than
|
||||
* this one.
|
||||
*/
|
||||
class ComplexDataNormalizer extends NormalizerBase {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = 'Drupal\Core\TypedData\ComplexDataInterface';
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize().
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
$attributes = array();
|
||||
foreach ($object as $name => $field) {
|
||||
$attributes[$name] = $this->serializer->normalize($field, $format);
|
||||
}
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\ConfigEntityNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
/**
|
||||
* Normalizes/denormalizes Drupal config entity objects into an array structure.
|
||||
*/
|
||||
class ConfigEntityNormalizer extends EntityNormalizer {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = array('Drupal\Core\Config\Entity\ConfigEntityInterface');
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
return $object->toArray();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\ContentEntityNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
/**
|
||||
* Normalizes/denormalizes Drupal content entities into an array structure.
|
||||
*/
|
||||
class ContentEntityNormalizer extends EntityNormalizer {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = ['Drupal\Core\Entity\ContentEntityInterface'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
$context += array(
|
||||
'account' => NULL,
|
||||
);
|
||||
|
||||
$attributes = [];
|
||||
foreach ($object as $name => $field) {
|
||||
if ($field->access('view', $context['account'])) {
|
||||
$attributes[$name] = $this->serializer->normalize($field, $format, $context);
|
||||
}
|
||||
}
|
||||
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\EntityNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||
|
||||
/**
|
||||
* Normalizes/denormalizes Drupal entity objects into an array structure.
|
||||
*/
|
||||
class EntityNormalizer extends ComplexDataNormalizer implements DenormalizerInterface {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = array('Drupal\Core\Entity\EntityInterface');
|
||||
|
||||
/**
|
||||
* The entity manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* Constructs an EntityNormalizer object.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
|
||||
* The entity manager.
|
||||
*/
|
||||
public function __construct(EntityManagerInterface $entity_manager) {
|
||||
$this->entityManager = $entity_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function denormalize($data, $class, $format = NULL, array $context = array()) {
|
||||
if (empty($context['entity_type'])) {
|
||||
throw new UnexpectedValueException('Entity type parameter must be included in context.');
|
||||
}
|
||||
|
||||
$entity_type = $this->entityManager->getDefinition($context['entity_type']);
|
||||
|
||||
// The bundle property behaves differently from other entity properties.
|
||||
// i.e. the nested structure with a 'value' key does not work.
|
||||
if ($entity_type->hasKey('bundle')) {
|
||||
$bundle_key = $entity_type->getKey('bundle');
|
||||
$type = $data[$bundle_key][0]['value'];
|
||||
$data[$bundle_key] = $type;
|
||||
}
|
||||
|
||||
return $this->entityManager->getStorage($context['entity_type'])->create($data);
|
||||
}
|
||||
|
||||
}
|
41
core/modules/serialization/src/Normalizer/ListNormalizer.php
Normal file
41
core/modules/serialization/src/Normalizer/ListNormalizer.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\ListNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
use Symfony\Component\Serializer\Exception\RuntimeException;
|
||||
|
||||
/**
|
||||
* Converts list objects to arrays.
|
||||
*
|
||||
* Ordinarily, this would be handled automatically by Serializer, but since
|
||||
* there is a TypedDataNormalizer and the Field class extends TypedData, any
|
||||
* Field will be handled by that Normalizer instead of being traversed. This
|
||||
* class ensures that TypedData classes that also implement ListInterface are
|
||||
* traversed instead of simply returning getValue().
|
||||
*/
|
||||
class ListNormalizer extends NormalizerBase {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = 'Drupal\Core\TypedData\ListInterface';
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize().
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
$attributes = array();
|
||||
foreach ($object as $fieldItem) {
|
||||
$attributes[] = $this->serializer->normalize($fieldItem, $format);
|
||||
}
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
}
|
82
core/modules/serialization/src/Normalizer/NormalizerBase.php
Normal file
82
core/modules/serialization/src/Normalizer/NormalizerBase.php
Normal file
|
@ -0,0 +1,82 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\NormalizerBase.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
|
||||
|
||||
/**
|
||||
* Base class for Normalizers.
|
||||
*/
|
||||
abstract class NormalizerBase extends SerializerAwareNormalizer implements NormalizerInterface {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var string|array
|
||||
*/
|
||||
protected $supportedInterfaceOrClass;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function supportsNormalization($data, $format = NULL) {
|
||||
// If we aren't dealing with an object or the format is not supported return
|
||||
// now.
|
||||
if (!is_object($data) || !$this->checkFormat($format)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$supported = (array) $this->supportedInterfaceOrClass;
|
||||
|
||||
return (bool) array_filter($supported, function($name) use ($data) {
|
||||
return $data instanceof $name;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::supportsDenormalization()
|
||||
*
|
||||
* This class doesn't implement DenormalizerInterface, but most of its child
|
||||
* classes do, so this method is implemented at this level to reduce code
|
||||
* duplication.
|
||||
*/
|
||||
public function supportsDenormalization($data, $type, $format = NULL) {
|
||||
// If the format is not supported return now.
|
||||
if (!$this->checkFormat($format)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$supported = (array) $this->supportedInterfaceOrClass;
|
||||
|
||||
$subclass_check = function($name) use ($type) {
|
||||
return (class_exists($name) || interface_exists($name)) && is_subclass_of($type, $name, TRUE);
|
||||
};
|
||||
|
||||
return in_array($type, $supported) || array_filter($supported, $subclass_check);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the provided format is supported by this normalizer.
|
||||
*
|
||||
* @param string $format
|
||||
* The format to check.
|
||||
*
|
||||
* @return bool
|
||||
* TRUE if the format is supported, FALSE otherwise. If no format is
|
||||
* specified this will return TRUE.
|
||||
*/
|
||||
protected function checkFormat($format = NULL) {
|
||||
if (!isset($format) || !isset($this->format)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return in_array($format, (array) $this->format);
|
||||
}
|
||||
|
||||
}
|
32
core/modules/serialization/src/Normalizer/NullNormalizer.php
Normal file
32
core/modules/serialization/src/Normalizer/NullNormalizer.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\NullNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
/**
|
||||
* Null normalizer.
|
||||
*/
|
||||
class NullNormalizer extends NormalizerBase {
|
||||
|
||||
/**
|
||||
* Constructs a NullNormalizer object.
|
||||
*
|
||||
* @param string|array $supported_interface_of_class
|
||||
* The supported interface(s) or class(es).
|
||||
*/
|
||||
public function __construct($supported_interface_of_class) {
|
||||
$this->supportedInterfaceOrClass = $supported_interface_of_class;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Normalizer\TypedDataNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Normalizer;
|
||||
|
||||
use Symfony\Component\Serializer\Exception\RuntimeException;
|
||||
|
||||
/**
|
||||
* Converts typed data objects to arrays.
|
||||
*/
|
||||
class TypedDataNormalizer extends NormalizerBase {
|
||||
|
||||
/**
|
||||
* The interface or class that this Normalizer supports.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $supportedInterfaceOrClass = 'Drupal\Core\TypedData\TypedDataInterface';
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Normalizer\NormalizerInterface::normalize().
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
return $object->getValue();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\RegisterEntityResolversCompilerPass.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization;
|
||||
|
||||
use Symfony\Component\DependencyInjection\Reference;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||
|
||||
/**
|
||||
* Adds services tagged 'normalizer' and 'encoder' to the Serializer.
|
||||
*/
|
||||
class RegisterEntityResolversCompilerPass implements CompilerPassInterface {
|
||||
|
||||
/**
|
||||
* Adds services to the Serializer.
|
||||
*
|
||||
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
|
||||
* The container to process.
|
||||
*/
|
||||
public function process(ContainerBuilder $container) {
|
||||
$definition = $container->getDefinition('serializer.entity_resolver');
|
||||
$resolvers = array();
|
||||
|
||||
// Retrieve registered Normalizers and Encoders from the container.
|
||||
foreach ($container->findTaggedServiceIds('entity_resolver') as $id => $attributes) {
|
||||
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
|
||||
$resolvers[$priority][] = new Reference($id);
|
||||
}
|
||||
|
||||
// Add the registered concrete EntityResolvers to the ChainEntityResolver.
|
||||
foreach ($this->sort($resolvers) as $resolver) {
|
||||
$definition->addMethodCall('addResolver', array($resolver));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts by priority.
|
||||
*
|
||||
* Order services from highest priority number to lowest (reverse sorting).
|
||||
*
|
||||
* @param array $services
|
||||
* A nested array keyed on priority number. For each priority number, the
|
||||
* value is an array of Symfony\Component\DependencyInjection\Reference
|
||||
* objects, each a reference to a normalizer or encoder service.
|
||||
*
|
||||
* @return array
|
||||
* A flattened array of Reference objects from $services, ordered from high
|
||||
* to low priority.
|
||||
*/
|
||||
protected function sort($services) {
|
||||
$sorted = array();
|
||||
krsort($services);
|
||||
|
||||
// Flatten the array.
|
||||
foreach ($services as $a) {
|
||||
$sorted = array_merge($sorted, $a);
|
||||
}
|
||||
|
||||
return $sorted;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\RegisterSerializationClassesCompilerPass.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization;
|
||||
|
||||
use Symfony\Component\DependencyInjection\Reference;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||
|
||||
/**
|
||||
* Adds services tagged 'normalizer' and 'encoder' to the Serializer.
|
||||
*/
|
||||
class RegisterSerializationClassesCompilerPass implements CompilerPassInterface {
|
||||
|
||||
/**
|
||||
* Adds services to the Serializer.
|
||||
*
|
||||
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
|
||||
* The container to process.
|
||||
*/
|
||||
public function process(ContainerBuilder $container) {
|
||||
$definition = $container->getDefinition('serializer');
|
||||
|
||||
// Retrieve registered Normalizers and Encoders from the container.
|
||||
foreach ($container->findTaggedServiceIds('normalizer') as $id => $attributes) {
|
||||
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
|
||||
$normalizers[$priority][] = new Reference($id);
|
||||
}
|
||||
foreach ($container->findTaggedServiceIds('encoder') as $id => $attributes) {
|
||||
$priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
|
||||
$encoders[$priority][] = new Reference($id);
|
||||
}
|
||||
|
||||
// Add the registered Normalizers and Encoders to the Serializer.
|
||||
if (!empty($normalizers)) {
|
||||
$definition->replaceArgument(0, $this->sort($normalizers));
|
||||
}
|
||||
if (!empty($encoders)) {
|
||||
$definition->replaceArgument(1, $this->sort($encoders));
|
||||
}
|
||||
|
||||
// Find all serialization formats known.
|
||||
$formats = array();
|
||||
foreach ($container->findTaggedServiceIds('encoder') as $attributes) {
|
||||
$formats[] = $attributes[0]['format'];
|
||||
}
|
||||
$container->setParameter('serializer.formats', $formats);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts by priority.
|
||||
*
|
||||
* Order services from highest priority number to lowest (reverse sorting).
|
||||
*
|
||||
* @param array $services
|
||||
* A nested array keyed on priority number. For each priority number, the
|
||||
* value is an array of Symfony\Component\DependencyInjection\Reference
|
||||
* objects, each a reference to a normalizer or encoder service.
|
||||
*
|
||||
* @return array
|
||||
* A flattened array of Reference objects from $services, ordered from high
|
||||
* to low priority.
|
||||
*/
|
||||
protected function sort($services) {
|
||||
$sorted = array();
|
||||
krsort($services);
|
||||
|
||||
// Flatten the array.
|
||||
foreach ($services as $a) {
|
||||
$sorted = array_merge($sorted, $a);
|
||||
}
|
||||
|
||||
return $sorted;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\SerializationServiceProvider.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization;
|
||||
|
||||
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
||||
use Drupal\Core\DependencyInjection\ServiceProviderInterface;
|
||||
|
||||
/**
|
||||
* Serialization dependency injection container.
|
||||
*/
|
||||
class SerializationServiceProvider implements ServiceProviderInterface {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function register(ContainerBuilder $container) {
|
||||
// Add a compiler pass for adding Normalizers and Encoders to Serializer.
|
||||
$container->addCompilerPass(new RegisterSerializationClassesCompilerPass());
|
||||
// Add a compiler pass for adding concrete Resolvers to chain Resolver.
|
||||
$container->addCompilerPass(new RegisterEntityResolversCompilerPass());
|
||||
}
|
||||
}
|
99
core/modules/serialization/src/Tests/EntityResolverTest.php
Normal file
99
core/modules/serialization/src/Tests/EntityResolverTest.php
Normal file
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Tests\EntityResolverTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Tests;
|
||||
|
||||
use Drupal\Core\Url;
|
||||
|
||||
/**
|
||||
* Tests that entities references can be resolved.
|
||||
*
|
||||
* @group serialization
|
||||
*/
|
||||
class EntityResolverTest extends NormalizerTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('entity_reference', 'hal', 'rest');
|
||||
|
||||
/**
|
||||
* The format being tested.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $format = 'hal_json';
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
\Drupal::service('router.builder')->rebuild();
|
||||
|
||||
// Create the test field storage.
|
||||
entity_create('field_storage_config', array(
|
||||
'entity_type' => 'entity_test_mulrev',
|
||||
'field_name' => 'field_test_entity_reference',
|
||||
'type' => 'entity_reference',
|
||||
'settings' => array(
|
||||
'target_type' => 'entity_test_mulrev',
|
||||
),
|
||||
))->save();
|
||||
|
||||
// Create the test field.
|
||||
entity_create('field_config', array(
|
||||
'entity_type' => 'entity_test_mulrev',
|
||||
'field_name' => 'field_test_entity_reference',
|
||||
'bundle' => 'entity_test_mulrev',
|
||||
))->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that fields referencing UUIDs can be denormalized.
|
||||
*/
|
||||
function testUuidEntityResolver() {
|
||||
// Create an entity to get the UUID from.
|
||||
$entity = entity_create('entity_test_mulrev', array('type' => 'entity_test_mulrev'));
|
||||
$entity->set('name', 'foobar');
|
||||
$entity->set('field_test_entity_reference', array(array('target_id' => 1)));
|
||||
$entity->save();
|
||||
|
||||
$field_uri = Url::fromUri('base:rest/relation/entity_test_mulrev/entity_test_mulrev/field_test_entity_reference', array('absolute' => TRUE))->toString();
|
||||
|
||||
$data = array(
|
||||
'_links' => array(
|
||||
'type' => array(
|
||||
'href' => Url::fromUri('base:rest/type/entity_test_mulrev/entity_test_mulrev', array('absolute' => TRUE))->toString(),
|
||||
),
|
||||
$field_uri => array(
|
||||
array(
|
||||
'href' => $entity->url(),
|
||||
),
|
||||
),
|
||||
),
|
||||
'_embedded' => array(
|
||||
$field_uri => array(
|
||||
array(
|
||||
'_links' => array(
|
||||
'self' => $entity->url(),
|
||||
),
|
||||
'uuid' => array(
|
||||
array(
|
||||
'value' => $entity->uuid(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
$denormalized = $this->container->get('serializer')->denormalize($data, 'Drupal\entity_test\Entity\EntityTestMulRev', $this->format);
|
||||
$field_value = $denormalized->get('field_test_entity_reference')->getValue();
|
||||
$this->assertEqual($field_value[0]['target_id'], 1, 'Entity reference resolved using UUID.');
|
||||
}
|
||||
|
||||
}
|
215
core/modules/serialization/src/Tests/EntitySerializationTest.php
Normal file
215
core/modules/serialization/src/Tests/EntitySerializationTest.php
Normal file
|
@ -0,0 +1,215 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Tests\EntitySerializationTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Tests;
|
||||
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\Component\Utility\SafeMarkup;
|
||||
use Drupal\user\Entity\User;
|
||||
|
||||
/**
|
||||
* Tests that entities can be serialized to supported core formats.
|
||||
*
|
||||
* @group serialization
|
||||
*/
|
||||
class EntitySerializationTest extends NormalizerTestBase {
|
||||
|
||||
/**
|
||||
* Modules to install.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('serialization', 'system', 'field', 'entity_test', 'text', 'filter', 'user', 'entity_serialization_test');
|
||||
|
||||
/**
|
||||
* The test values.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $values;
|
||||
|
||||
/**
|
||||
* The test entity.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\ContentEntityBase
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The serializer service.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\Serializer.
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
/**
|
||||
* The class name of the test class.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $entityClass = 'Drupal\entity_test\Entity\EntityTest';
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// User create needs sequence table.
|
||||
$this->installSchema('system', array('sequences'));
|
||||
// Create a test entity to serialize.
|
||||
$this->values = array(
|
||||
'name' => $this->randomMachineName(),
|
||||
'user_id' => \Drupal::currentUser()->id(),
|
||||
'field_test_text' => array(
|
||||
'value' => $this->randomMachineName(),
|
||||
'format' => 'full_html',
|
||||
),
|
||||
);
|
||||
$this->entity = entity_create('entity_test_mulrev', $this->values);
|
||||
$this->entity->save();
|
||||
|
||||
$this->serializer = $this->container->get('serializer');
|
||||
|
||||
$this->installConfig(array('field'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the normalize function.
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$expected = array(
|
||||
'id' => array(
|
||||
array('value' => 1),
|
||||
),
|
||||
'uuid' => array(
|
||||
array('value' => $this->entity->uuid()),
|
||||
),
|
||||
'langcode' => array(
|
||||
array('value' => 'en'),
|
||||
),
|
||||
'name' => array(
|
||||
array('value' => $this->values['name']),
|
||||
),
|
||||
'type' => array(
|
||||
array('value' => 'entity_test_mulrev'),
|
||||
),
|
||||
'created' => array(
|
||||
array('value' => $this->entity->created->value),
|
||||
),
|
||||
'user_id' => array(
|
||||
array('target_id' => $this->values['user_id']),
|
||||
),
|
||||
'revision_id' => array(
|
||||
array('value' => 1),
|
||||
),
|
||||
'default_langcode' => array(
|
||||
array('value' => TRUE),
|
||||
),
|
||||
'field_test_text' => array(
|
||||
array(
|
||||
'value' => $this->values['field_test_text']['value'],
|
||||
'format' => $this->values['field_test_text']['format'],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
$normalized = $this->serializer->normalize($this->entity);
|
||||
|
||||
foreach (array_keys($expected) as $fieldName) {
|
||||
$this->assertEqual($expected[$fieldName], $normalized[$fieldName], "ComplexDataNormalizer produces expected array for $fieldName.");
|
||||
}
|
||||
$this->assertEqual(array_diff_key($normalized, $expected), array(), 'No unexpected data is added to the normalized array.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests user normalization, using the entity_serialization_test module to
|
||||
* override some default access controls.
|
||||
*/
|
||||
public function testUserNormalize() {
|
||||
$account = User::create([
|
||||
'name' => 'serialization_test_user',
|
||||
'mail' => 'foo@example.com',
|
||||
'pass' => '123456',
|
||||
]);
|
||||
$account->save();
|
||||
|
||||
// Test password isn't available.
|
||||
$normalized = $this->serializer->normalize($account);
|
||||
|
||||
$this->assertFalse(array_key_exists('pass', $normalized), '"pass" key does not exist in normalized user');
|
||||
$this->assertFalse(array_key_exists('mail', $normalized), '"mail" key does not exist in normalized user');
|
||||
|
||||
// Test again using our test user, so that our access control override will
|
||||
// allow password viewing.
|
||||
$normalized = $this->serializer->normalize($account, NULL, ['account' => $account]);
|
||||
|
||||
// The key 'pass' will now exist, but the password value should be
|
||||
// normalized to NULL.
|
||||
$this->assertIdentical($normalized['pass'], [NULL], '"pass" value is normalized to [NULL]');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test registered Serializer's entity serialization for core's formats.
|
||||
*/
|
||||
public function testSerialize() {
|
||||
// Test that Serializer responds using the ComplexDataNormalizer and
|
||||
// JsonEncoder. The output of ComplexDataNormalizer::normalize() is tested
|
||||
// elsewhere, so we can just assume that it works properly here.
|
||||
$normalized = $this->serializer->normalize($this->entity, 'json');
|
||||
$expected = json_encode($normalized);
|
||||
// Test 'json'.
|
||||
$actual = $this->serializer->serialize($this->entity, 'json');
|
||||
$this->assertIdentical($actual, $expected, 'Entity serializes to JSON when "json" is requested.');
|
||||
$actual = $this->serializer->serialize($normalized, 'json');
|
||||
$this->assertIdentical($actual, $expected, 'A normalized array serializes to JSON when "json" is requested');
|
||||
// Test 'ajax'.
|
||||
$actual = $this->serializer->serialize($this->entity, 'ajax');
|
||||
$this->assertIdentical($actual, $expected, 'Entity serializes to JSON when "ajax" is requested.');
|
||||
$actual = $this->serializer->serialize($normalized, 'ajax');
|
||||
$this->assertIdentical($actual, $expected, 'A normalized array serializes to JSON when "ajax" is requested');
|
||||
|
||||
// Generate the expected xml in a way that allows changes to entity property
|
||||
// order.
|
||||
$expected = array(
|
||||
'id' => '<id><value>' . $this->entity->id() . '</value></id>',
|
||||
'uuid' => '<uuid><value>' . $this->entity->uuid() . '</value></uuid>',
|
||||
'langcode' => '<langcode><value>en</value></langcode>',
|
||||
'name' => '<name><value>' . $this->values['name'] . '</value></name>',
|
||||
'type' => '<type><value>entity_test_mulrev</value></type>',
|
||||
'created' => '<created><value>' . $this->entity->created->value . '</value></created>',
|
||||
'user_id' => '<user_id><target_id>' . $this->values['user_id'] . '</target_id></user_id>',
|
||||
'revision_id' => '<revision_id><value>' . $this->entity->getRevisionId() . '</value></revision_id>',
|
||||
'default_langcode' => '<default_langcode><value>1</value></default_langcode>',
|
||||
'field_test_text' => '<field_test_text><value>' . $this->values['field_test_text']['value'] . '</value><format>' . $this->values['field_test_text']['format'] . '</format></field_test_text>',
|
||||
);
|
||||
// Sort it in the same order as normalised.
|
||||
$expected = array_merge($normalized, $expected);
|
||||
// Add header and footer.
|
||||
array_unshift($expected, '<?xml version="1.0"?>' . PHP_EOL . '<response>');
|
||||
$expected[] = '</response>' . PHP_EOL;
|
||||
// Reduced the array to a string.
|
||||
$expected = implode('', $expected);
|
||||
// Test 'xml'. The output should match that of Symfony's XmlEncoder.
|
||||
$actual = $this->serializer->serialize($this->entity, 'xml');
|
||||
$this->assertIdentical($actual, $expected);
|
||||
$actual = $this->serializer->serialize($normalized, 'xml');
|
||||
$this->assertIdentical($actual, $expected);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests denormalization of an entity.
|
||||
*/
|
||||
public function testDenormalize() {
|
||||
$normalized = $this->serializer->normalize($this->entity);
|
||||
|
||||
foreach (array('json', 'xml') as $type) {
|
||||
$denormalized = $this->serializer->denormalize($normalized, $this->entityClass, $type, array('entity_type' => 'entity_test_mulrev'));
|
||||
$this->assertTrue($denormalized instanceof $this->entityClass, SafeMarkup::format('Denormalized entity is an instance of @class', array('@class' => $this->entityClass)));
|
||||
$this->assertIdentical($denormalized->getEntityTypeId(), $this->entity->getEntityTypeId(), 'Expected entity type found.');
|
||||
$this->assertIdentical($denormalized->bundle(), $this->entity->bundle(), 'Expected entity bundle found.');
|
||||
$this->assertIdentical($denormalized->uuid(), $this->entity->uuid(), 'Expected entity UUID found.');
|
||||
}
|
||||
}
|
||||
}
|
51
core/modules/serialization/src/Tests/NormalizerTestBase.php
Normal file
51
core/modules/serialization/src/Tests/NormalizerTestBase.php
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Tests\NormalizerTestBase.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Tests;
|
||||
|
||||
use Drupal\simpletest\KernelTestBase;
|
||||
|
||||
abstract class NormalizerTestBase extends KernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('serialization', 'system', 'field', 'entity_test', 'text', 'filter', 'user');
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->installEntitySchema('entity_test_mulrev');
|
||||
$this->installEntitySchema('user');
|
||||
$this->installSchema('system', array('url_alias', 'router'));
|
||||
$this->installConfig(array('field'));
|
||||
\Drupal::service('router.builder')->rebuild();
|
||||
\Drupal::moduleHandler()->invoke('rest', 'install');
|
||||
|
||||
// Auto-create a field for testing.
|
||||
entity_create('field_storage_config', array(
|
||||
'entity_type' => 'entity_test_mulrev',
|
||||
'field_name' => 'field_test_text',
|
||||
'type' => 'text',
|
||||
'cardinality' => 1,
|
||||
'translatable' => FALSE,
|
||||
))->save();
|
||||
entity_create('field_config', array(
|
||||
'entity_type' => 'entity_test_mulrev',
|
||||
'field_name' => 'field_test_text',
|
||||
'bundle' => 'entity_test_mulrev',
|
||||
'label' => 'Test text-field',
|
||||
'widget' => array(
|
||||
'type' => 'text_textfield',
|
||||
'weight' => 0,
|
||||
),
|
||||
))->save();
|
||||
}
|
||||
|
||||
}
|
59
core/modules/serialization/src/Tests/SerializationTest.php
Normal file
59
core/modules/serialization/src/Tests/SerializationTest.php
Normal file
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization\Tests\SerializationTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization\Tests;
|
||||
|
||||
use Drupal\simpletest\KernelTestBase;
|
||||
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
|
||||
|
||||
/**
|
||||
* Functional tests for serialization system.
|
||||
*
|
||||
* @group serialization
|
||||
*/
|
||||
class SerializationTest extends KernelTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('serialization', 'serialization_test');
|
||||
|
||||
/**
|
||||
* The serializer service to test.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\SerializerInterface
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->serializer = $this->container->get('serializer');
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirms that modules can register normalizers and encoders.
|
||||
*/
|
||||
public function testSerializerComponentRegistration() {
|
||||
$object = new \stdClass();
|
||||
$format = 'serialization_test';
|
||||
$expected = 'Normalized by SerializationTestNormalizer, Encoded by SerializationTestEncoder';
|
||||
|
||||
// Ensure the serialization invokes the expected normalizer and encoder.
|
||||
$this->assertIdentical($this->serializer->serialize($object, $format), $expected);
|
||||
|
||||
// Ensure the serialization fails for an unsupported format.
|
||||
try {
|
||||
$this->serializer->serialize($object, 'unsupported_format');
|
||||
$this->fail('The serializer was expected to throw an exception for an unsupported format, but did not.');
|
||||
}
|
||||
catch (UnexpectedValueException $e) {
|
||||
$this->pass('The serializer threw an exception for an unsupported format.');
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
name: 'Entity serialization test support'
|
||||
type: module
|
||||
description: 'Provides test support for entity serialization tests.'
|
||||
package: Testing
|
||||
version: VERSION
|
||||
core: 8.x
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Test support module for entity serialization tests.
|
||||
*/
|
||||
|
||||
use Drupal\Core\Access\AccessResult;
|
||||
|
||||
/**
|
||||
* Implements hook_entity_field_access_alter().
|
||||
*
|
||||
* Overrides some default access control to support testing.
|
||||
*
|
||||
* @see Drupal\serialization\Tests\EntitySerializationTest::testUserNormalize()
|
||||
*/
|
||||
function entity_serialization_test_entity_field_access_alter(array &$grants, array $context) {
|
||||
// Override default access control from UserAccessControlHandler to allow
|
||||
// access to 'pass' field for the test user.
|
||||
if ($context['field_definition']->getName() == 'pass' && $context['account']->getUsername() == 'serialization_test_user') {
|
||||
$grants[':default'] = AccessResult::allowed()->inheritCacheability($grants[':default'])->cacheUntilEntityChanges($context['items']->getEntity());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
name: Serialization test module
|
||||
type: module
|
||||
description: "Support module for serialization tests."
|
||||
package: Testing
|
||||
version: VERSION
|
||||
core: 8.x
|
|
@ -0,0 +1,9 @@
|
|||
services:
|
||||
serializer.normalizer.serialization_test:
|
||||
class: Drupal\serialization_test\SerializationTestNormalizer
|
||||
tags:
|
||||
- { name: normalizer }
|
||||
serializer.encoder.serialization_test:
|
||||
class: Drupal\serialization_test\SerializationTestEncoder
|
||||
tags:
|
||||
- { name: encoder, format: serialization_test}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization_test\SerializationTestEncoder.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization_test;
|
||||
|
||||
use Symfony\Component\Serializer\Encoder\EncoderInterface;
|
||||
|
||||
class SerializationTestEncoder implements EncoderInterface {
|
||||
|
||||
/**
|
||||
* The format that this Encoder supports.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
static protected $format = 'serialization_test';
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::encode().
|
||||
*/
|
||||
public function encode($data, $format, array $context = array()) {
|
||||
// @see \Drupal\serialization_test\SerializationTestNormalizer::normalize().
|
||||
return 'Normalized by ' . $data['normalized_by'] . ', Encoded by SerializationTestEncoder';
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements \Symfony\Component\Serializer\Encoder\EncoderInterface::supportsEncoding().
|
||||
*/
|
||||
public function supportsEncoding($format) {
|
||||
return static::$format === $format;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\serialization_test\SerializationTestNormalizer.
|
||||
*/
|
||||
|
||||
namespace Drupal\serialization_test;
|
||||
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
class SerializationTestNormalizer implements NormalizerInterface {
|
||||
|
||||
/**
|
||||
* The format that this Normalizer supports.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
static protected $format = 'serialization_test';
|
||||
|
||||
/**
|
||||
* Normalizes an object into a set of arrays/scalars.
|
||||
*
|
||||
* @param object $object
|
||||
* Object to normalize.
|
||||
* @param string $format
|
||||
* Format the normalization result will be encoded as.
|
||||
*
|
||||
* @return array
|
||||
* An array containing a normalized representation of $object, appropriate
|
||||
* for encoding to the requested format.
|
||||
*/
|
||||
public function normalize($object, $format = NULL, array $context = array()) {
|
||||
$normalized = (array) $object;
|
||||
// Add identifying value that can be used to verify that the expected
|
||||
// normalizer was invoked.
|
||||
$normalized['normalized_by'] = 'SerializationTestNormalizer';
|
||||
return $normalized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether format is supported by this normalizer.
|
||||
*
|
||||
* @param mixed $data
|
||||
* Data to normalize.
|
||||
* @param string $format
|
||||
* Format the normalization result will be encoded as.
|
||||
*
|
||||
* @return bool
|
||||
* Returns TRUE if the normalizer can handle the request.
|
||||
*/
|
||||
public function supportsNormalization($data, $format = NULL) {
|
||||
return static::$format === $format;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Encoder\JsonEncoderTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Encoder;
|
||||
|
||||
use Drupal\serialization\Encoder\JsonEncoder;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Encoder\JsonEncoder
|
||||
* @group serialization
|
||||
*/
|
||||
class JsonEncoderTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* Tests the supportsEncoding() method.
|
||||
*/
|
||||
public function testSupportsEncoding() {
|
||||
$encoder = new JsonEncoder();
|
||||
|
||||
$this->assertTrue($encoder->supportsEncoding('json'));
|
||||
$this->assertTrue($encoder->supportsEncoding('ajax'));
|
||||
$this->assertFalse($encoder->supportsEncoding('xml'));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Encoder\XmlEncoderTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Encoder;
|
||||
|
||||
use Drupal\serialization\Encoder\XmlEncoder;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Encoder\XmlEncoder
|
||||
* @group serialization
|
||||
*/
|
||||
class XmlEncoderTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The XmlEncoder instance.
|
||||
*
|
||||
* @var \Drupal\serialization\Encoder\XmlEncoder
|
||||
*/
|
||||
protected $encoder;
|
||||
|
||||
/**
|
||||
* @var \Symfony\Component\Serializer\Encoder\XmlEncoder|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $baseEncoder;
|
||||
|
||||
/**
|
||||
* An array of test data.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $testArray = array('test' => 'test');
|
||||
|
||||
protected function setUp() {
|
||||
$this->baseEncoder = $this->getMock('Symfony\Component\Serializer\Encoder\XmlEncoder');
|
||||
$this->encoder = new XmlEncoder();
|
||||
$this->encoder->setBaseEncoder($this->baseEncoder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the supportsEncoding() method.
|
||||
*/
|
||||
public function testSupportsEncoding() {
|
||||
$this->assertTrue($this->encoder->supportsEncoding('xml'));
|
||||
$this->assertFalse($this->encoder->supportsEncoding('json'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the supportsDecoding() method.
|
||||
*/
|
||||
public function testSupportsDecoding() {
|
||||
$this->assertTrue($this->encoder->supportsDecoding('xml'));
|
||||
$this->assertFalse($this->encoder->supportsDecoding('json'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the encode() method.
|
||||
*/
|
||||
public function testEncode() {
|
||||
$this->baseEncoder->expects($this->once())
|
||||
->method('encode')
|
||||
->with($this->testArray, 'test', array())
|
||||
->will($this->returnValue('test'));
|
||||
|
||||
$this->assertEquals('test', $this->encoder->encode($this->testArray, 'test'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the decode() method.
|
||||
*/
|
||||
public function testDecode() {
|
||||
$this->baseEncoder->expects($this->once())
|
||||
->method('decode')
|
||||
->with('test', 'test', array())
|
||||
->will($this->returnValue($this->testArray));
|
||||
|
||||
$this->assertEquals($this->testArray, $this->encoder->decode('test', 'test'));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\EntityResolver\ChainEntityResolverTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\EntityResolver;
|
||||
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\serialization\EntityResolver\ChainEntityResolver;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\EntityResolver\ChainEntityResolver
|
||||
* @group serialization
|
||||
*/
|
||||
class ChainEntityResolverTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* A mocked normalizer.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\Normalizer\NormalizerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $testNormalizer;
|
||||
|
||||
/**
|
||||
* Test data passed to the resolve method.
|
||||
*
|
||||
* @var \stdClass
|
||||
*/
|
||||
protected $testData;
|
||||
|
||||
/**
|
||||
* A test entity type.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $testEntityType = 'test_type';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
$this->testNormalizer = $this->getMock('Symfony\Component\Serializer\Normalizer\NormalizerInterface');
|
||||
$this->testData = new \stdClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the resolve method with no matching resolvers.
|
||||
*
|
||||
* @covers ::__construct
|
||||
* @covers ::resolve
|
||||
*/
|
||||
public function testResolverWithNoneResolved() {
|
||||
$resolvers = array(
|
||||
$this->createEntityResolverMock(),
|
||||
$this->createEntityResolverMock(),
|
||||
);
|
||||
|
||||
$resolver = new ChainEntityResolver($resolvers);
|
||||
|
||||
$this->assertNull($resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the resolve method with no matching resolvers, using addResolver.
|
||||
*
|
||||
* @covers ::addResolver
|
||||
* @covers ::resolve
|
||||
*/
|
||||
public function testResolverWithNoneResolvedUsingAddResolver() {
|
||||
$resolver = new ChainEntityResolver();
|
||||
$resolver->addResolver($this->createEntityResolverMock());
|
||||
$resolver->addResolver($this->createEntityResolverMock());
|
||||
|
||||
$this->assertNull($resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the resolve method with a matching resolver first.
|
||||
*
|
||||
* @covers ::__construct
|
||||
* @covers ::resolve
|
||||
*/
|
||||
public function testResolverWithFirstResolved() {
|
||||
$resolvers = array(
|
||||
$this->createEntityResolverMock(10),
|
||||
$this->createEntityResolverMock(NULL, FALSE),
|
||||
);
|
||||
|
||||
$resolver = new ChainEntityResolver($resolvers);
|
||||
|
||||
$this->assertSame(10, $resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the resolve method with a matching resolver last.
|
||||
*
|
||||
* @covers ::__construct
|
||||
* @covers ::resolve
|
||||
*/
|
||||
public function testResolverWithLastResolved() {
|
||||
$resolvers = array(
|
||||
$this->createEntityResolverMock(),
|
||||
$this->createEntityResolverMock(10),
|
||||
);
|
||||
|
||||
$resolver = new ChainEntityResolver($resolvers);
|
||||
|
||||
$this->assertSame(10, $resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the resolve method where one resolver returns 0.
|
||||
*
|
||||
* @covers ::__construct
|
||||
* @covers ::resolve
|
||||
*/
|
||||
public function testResolverWithResolvedToZero() {
|
||||
$resolvers = array(
|
||||
$this->createEntityResolverMock(0),
|
||||
$this->createEntityResolverMock(NULL, FALSE),
|
||||
);
|
||||
|
||||
$resolver = new ChainEntityResolver($resolvers);
|
||||
|
||||
$this->assertSame(0, $resolver->resolve($this->testNormalizer, $this->testData, $this->testEntityType));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock entity resolver.
|
||||
*
|
||||
* @param null|int $return
|
||||
* Whether the mocked resolve method should return TRUE or FALSE.
|
||||
*
|
||||
* @param bool $called
|
||||
* Whether or not the resolve method is expected to be called.
|
||||
*
|
||||
* @return \Drupal\serialization\EntityResolver\EntityResolverInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
* The mocked entity resolver.
|
||||
*/
|
||||
protected function createEntityResolverMock($return = NULL, $called = TRUE) {
|
||||
$mock = $this->getMock('Drupal\serialization\EntityResolver\EntityResolverInterface');
|
||||
|
||||
if ($called) {
|
||||
$mock->expects($this->once())
|
||||
->method('resolve')
|
||||
->with($this->testNormalizer, $this->testData, $this->testEntityType)
|
||||
->will($this->returnValue($return));
|
||||
}
|
||||
else {
|
||||
$mock->expects($this->never())
|
||||
->method('resolve');
|
||||
}
|
||||
|
||||
return $mock;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\EntityResolver\UuidResolverTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\EntityResolver;
|
||||
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\serialization\EntityResolver\UuidResolver;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\EntityResolver\UuidResolver
|
||||
* @group serialization
|
||||
*/
|
||||
class UuidResolverTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The UuidResolver instance.
|
||||
*
|
||||
* @var \Drupal\serialization\EntityResolver\UuidResolver
|
||||
*/
|
||||
protected $resolver;
|
||||
|
||||
/**
|
||||
* The mock EntityManager instance.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManager|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
$this->entityManager = $this->getMockBuilder('Drupal\Core\Entity\EntityManager')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->resolver = new UuidResolver($this->entityManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test resolve() with a class using the incorrect interface.
|
||||
*/
|
||||
public function testResolveNotInInterface() {
|
||||
$this->entityManager->expects($this->never())
|
||||
->method('loadEntityByUuid');
|
||||
|
||||
$normalizer = $this->getMock('Symfony\Component\Serializer\Normalizer\NormalizerInterface');
|
||||
$this->assertNull($this->resolver->resolve($normalizer, array(), 'test_type'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test resolve() with a class using the correct interface but no UUID.
|
||||
*/
|
||||
public function testResolveNoUuid() {
|
||||
$this->entityManager->expects($this->never())
|
||||
->method('loadEntityByUuid');
|
||||
|
||||
$normalizer = $this->getMock('Drupal\serialization\EntityResolver\UuidReferenceInterface');
|
||||
$normalizer->expects($this->once())
|
||||
->method('getUuid')
|
||||
->with(array())
|
||||
->will($this->returnValue(NULL));
|
||||
$this->assertNull($this->resolver->resolve($normalizer, array(), 'test_type'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test resolve() with correct interface but no matching entity for the UUID.
|
||||
*/
|
||||
public function testResolveNoEntity() {
|
||||
$uuid = '392eab92-35c2-4625-872d-a9dab4da008e';
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('loadEntityByUuid')
|
||||
->with('test_type')
|
||||
->will($this->returnValue(NULL));
|
||||
|
||||
$normalizer = $this->getMock('Drupal\serialization\EntityResolver\UuidReferenceInterface');
|
||||
$normalizer->expects($this->once())
|
||||
->method('getUuid')
|
||||
->with(array())
|
||||
->will($this->returnValue($uuid));
|
||||
|
||||
$this->assertNull($this->resolver->resolve($normalizer, array(), 'test_type'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test resolve() when a UUID corresponds to an entity.
|
||||
*/
|
||||
public function testResolveWithEntity() {
|
||||
$uuid = '392eab92-35c2-4625-872d-a9dab4da008e';
|
||||
|
||||
$entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
|
||||
$entity->expects($this->once())
|
||||
->method('id')
|
||||
->will($this->returnValue(1));
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('loadEntityByUuid')
|
||||
->with('test_type', $uuid)
|
||||
->will($this->returnValue($entity));
|
||||
|
||||
$normalizer = $this->getMock('Drupal\serialization\EntityResolver\UuidReferenceInterface');
|
||||
$normalizer->expects($this->once())
|
||||
->method('getUuid')
|
||||
->with(array())
|
||||
->will($this->returnValue($uuid));
|
||||
$this->assertSame(1, $this->resolver->resolve($normalizer, array(), 'test_type'));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\ConfigEntityNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\serialization\Normalizer\ConfigEntityNormalizer;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\ConfigEntityNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class ConfigEntityNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* Tests the normalize() method.
|
||||
*
|
||||
* @covers ::normalize
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$test_export_properties = array('test' => 'test');
|
||||
|
||||
$entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$normalizer = new ConfigEntityNormalizer($entity_manager);
|
||||
|
||||
$config_entity = $this->getMock('Drupal\Core\Config\Entity\ConfigEntityInterface');
|
||||
$config_entity->expects($this->once())
|
||||
->method('toArray')
|
||||
->will($this->returnValue($test_export_properties));
|
||||
|
||||
$this->assertSame($test_export_properties, $normalizer->normalize($config_entity));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\ContentEntityNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\serialization\Normalizer\ContentEntityNormalizer;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\ContentEntityNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class ContentEntityNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The mock entity manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* The mock serializer.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
/**
|
||||
* The normalizer under test.
|
||||
*
|
||||
* @var \Drupal\serialization\Normalizer\ContentEntityNormalizer
|
||||
*/
|
||||
protected $contentEntityNormalizer;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
$this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$this->contentEntityNormalizer = new ContentEntityNormalizer($this->entityManager);
|
||||
$this->serializer = $this->getMockBuilder('Symfony\Component\Serializer\Serializer')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('normalize'))
|
||||
->getMock();
|
||||
$this->contentEntityNormalizer->setSerializer($this->serializer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::supportsNormalization
|
||||
*/
|
||||
public function testSupportsNormalization() {
|
||||
$content_mock = $this->getMock('Drupal\Core\Entity\ContentEntityInterface');
|
||||
$config_mock = $this->getMock('Drupal\Core\Entity\ConfigEntityInterface');
|
||||
$this->assertTrue($this->contentEntityNormalizer->supportsNormalization($content_mock));
|
||||
$this->assertFalse($this->contentEntityNormalizer->supportsNormalization($config_mock));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the normalize() method.
|
||||
*
|
||||
* @covers ::normalize
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$this->serializer->expects($this->any())
|
||||
->method('normalize')
|
||||
->with($this->containsOnlyInstancesOf('Drupal\Core\Field\FieldItemListInterface'), 'test_format', ['account' => NULL])
|
||||
->will($this->returnValue('test'));
|
||||
|
||||
$definitions = array(
|
||||
'field_1' => $this->createMockFieldListItem(),
|
||||
'field_2' => $this->createMockFieldListItem(FALSE),
|
||||
);
|
||||
$content_entity_mock = $this->createMockForContentEntity($definitions);
|
||||
|
||||
$normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format');
|
||||
|
||||
$this->assertArrayHasKey('field_1', $normalized);
|
||||
$this->assertEquals('test', $normalized['field_1']);
|
||||
$this->assertArrayNotHasKey('field_2', $normalized);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the normalize() method with account context passed.
|
||||
*
|
||||
* @covers ::normalize
|
||||
*/
|
||||
public function testNormalizeWithAccountContext() {
|
||||
$mock_account = $this->getMock('Drupal\Core\Session\AccountInterface');
|
||||
|
||||
$context = [
|
||||
'account' => $mock_account,
|
||||
];
|
||||
|
||||
$this->serializer->expects($this->any())
|
||||
->method('normalize')
|
||||
->with($this->containsOnlyInstancesOf('Drupal\Core\Field\FieldItemListInterface'), 'test_format', $context)
|
||||
->will($this->returnValue('test'));
|
||||
|
||||
// The mock account should get passed directly into the access() method on
|
||||
// field items from $context['account'].
|
||||
$definitions = array(
|
||||
'field_1' => $this->createMockFieldListItem(TRUE, $mock_account),
|
||||
'field_2' => $this->createMockFieldListItem(FALSE, $mock_account),
|
||||
);
|
||||
$content_entity_mock = $this->createMockForContentEntity($definitions);
|
||||
|
||||
$normalized = $this->contentEntityNormalizer->normalize($content_entity_mock, 'test_format', $context);
|
||||
|
||||
$this->assertArrayHasKey('field_1', $normalized);
|
||||
$this->assertEquals('test', $normalized['field_1']);
|
||||
$this->assertArrayNotHasKey('field_2', $normalized);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock content entity.
|
||||
*
|
||||
* @param $definitions
|
||||
*
|
||||
* @return \PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
public function createMockForContentEntity($definitions) {
|
||||
$content_entity_mock = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('getFields'))
|
||||
->getMockForAbstractClass();
|
||||
$content_entity_mock->expects($this->once())
|
||||
->method('getFields')
|
||||
->will($this->returnValue($definitions));
|
||||
|
||||
return $content_entity_mock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock field list item.
|
||||
*
|
||||
* @param bool $access
|
||||
*
|
||||
* @return \Drupal\Core\Field\FieldItemListInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected function createMockFieldListItem($access = TRUE, $user_context = NULL) {
|
||||
$mock = $this->getMock('Drupal\Core\Field\FieldItemListInterface');
|
||||
$mock->expects($this->once())
|
||||
->method('access')
|
||||
->with('view', $user_context)
|
||||
->will($this->returnValue($access));
|
||||
|
||||
return $mock;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\EntityNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\serialization\Normalizer\EntityNormalizer;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\EntityNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class EntityNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The mock entity manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* The mock serializer.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
/**
|
||||
* The entity normalizer.
|
||||
*
|
||||
* @var \Drupal\serialization\Normalizer\EntityNormalizer
|
||||
*/
|
||||
protected $entityNormalizer;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
$this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$this->entityNormalizer = new EntityNormalizer($this->entityManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the normalize() method.
|
||||
*
|
||||
* @covers ::normalize
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$list_item_1 = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
$list_item_2 = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
|
||||
$definitions = array(
|
||||
'field_1' => $list_item_1,
|
||||
'field_2' => $list_item_2,
|
||||
);
|
||||
|
||||
$content_entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('getFields'))
|
||||
->getMockForAbstractClass();
|
||||
$content_entity->expects($this->once())
|
||||
->method('getFields')
|
||||
->will($this->returnValue($definitions));
|
||||
|
||||
$serializer = $this->getMockBuilder('Symfony\Component\Serializer\Serializer')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('normalize'))
|
||||
->getMock();
|
||||
$serializer->expects($this->at(0))
|
||||
->method('normalize')
|
||||
->with($list_item_1, 'test_format');
|
||||
$serializer->expects($this->at(1))
|
||||
->method('normalize')
|
||||
->with($list_item_2, 'test_format');
|
||||
|
||||
$this->entityNormalizer->setSerializer($serializer);
|
||||
|
||||
$this->entityNormalizer->normalize($content_entity, 'test_format');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the denormalize() method with no entity type provided in context.
|
||||
*
|
||||
* @covers ::denormalize
|
||||
*
|
||||
* @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException
|
||||
*/
|
||||
public function testDenormalizeWithNoEntityType() {
|
||||
$this->entityNormalizer->denormalize(array(), 'Drupal\Core\Entity\ContentEntityBase');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the denormalize method with a bundle property.
|
||||
*
|
||||
* @covers ::denormalize
|
||||
*/
|
||||
public function testDenormalizeWithBundle() {
|
||||
$test_data = array(
|
||||
'key_1' => 'value_1',
|
||||
'key_2' => 'value_2',
|
||||
'test_type' => array(
|
||||
array('value' => 'test_bundle'),
|
||||
),
|
||||
);
|
||||
|
||||
$entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
|
||||
$entity_type->expects($this->once())
|
||||
->method('hasKey')
|
||||
->with('bundle')
|
||||
->will($this->returnValue(TRUE));
|
||||
$entity_type->expects($this->once())
|
||||
->method('getKey')
|
||||
->with('bundle')
|
||||
->will($this->returnValue('test_type'));
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getDefinition')
|
||||
->with('test')
|
||||
->will($this->returnValue($entity_type));
|
||||
|
||||
// The expected test data should have a modified test_type property.
|
||||
$expected_test_data = array(
|
||||
'key_1' => 'value_1',
|
||||
'key_2' => 'value_2',
|
||||
'test_type' => 'test_bundle',
|
||||
);
|
||||
|
||||
$storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
|
||||
$storage->expects($this->once())
|
||||
->method('create')
|
||||
->with($expected_test_data)
|
||||
->will($this->returnValue($this->getMock('Drupal\Core\Entity\EntityInterface')));
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getStorage')
|
||||
->with('test')
|
||||
->will($this->returnValue($storage));
|
||||
|
||||
$this->assertNotNull($this->entityNormalizer->denormalize($test_data, 'Drupal\Core\Entity\ContentEntityBase', NULL, array('entity_type' => 'test')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the denormalize method with no bundle defined.
|
||||
*
|
||||
* @covers ::denormalize
|
||||
*/
|
||||
public function testDenormalizeWithNoBundle() {
|
||||
$test_data = array(
|
||||
'key_1' => 'value_1',
|
||||
'key_2' => 'value_2',
|
||||
);
|
||||
|
||||
$entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
|
||||
$entity_type->expects($this->once())
|
||||
->method('hasKey')
|
||||
->with('bundle')
|
||||
->will($this->returnValue(FALSE));
|
||||
$entity_type->expects($this->never())
|
||||
->method('getKey');
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getDefinition')
|
||||
->with('test')
|
||||
->will($this->returnValue($entity_type));
|
||||
|
||||
$storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
|
||||
$storage->expects($this->once())
|
||||
->method('create')
|
||||
->with($test_data)
|
||||
->will($this->returnValue($this->getMock('Drupal\Core\Entity\EntityInterface')));
|
||||
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getStorage')
|
||||
->with('test')
|
||||
->will($this->returnValue($storage));
|
||||
|
||||
$this->assertNotNull($this->entityNormalizer->denormalize($test_data, 'Drupal\Core\Entity\ContentEntityBase', NULL, array('entity_type' => 'test')));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\ListNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\Core\TypedData\DataDefinition;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\serialization\Normalizer\ListNormalizer;
|
||||
use Drupal\Core\TypedData\Plugin\DataType\ItemList;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\ListNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class ListNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The ListNormalizer instance.
|
||||
*
|
||||
* @var \Drupal\serialization\Normalizer\ListNormalizer
|
||||
*/
|
||||
protected $normalizer;
|
||||
|
||||
/**
|
||||
* The mock list instance.
|
||||
*
|
||||
* @var \Drupal\Core\TypedData\ListInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $list;
|
||||
|
||||
/**
|
||||
* The expected list values to use for testing.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $expectedListValues = array('test', 'test', 'test');
|
||||
|
||||
protected function setUp() {
|
||||
// Mock the TypedDataManager to return a TypedDataInterface mock.
|
||||
$typed_data = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
$typed_data_manager = $this->getMockBuilder('Drupal\Core\TypedData\TypedDataManager')
|
||||
->disableOriginalConstructor()
|
||||
->setMethods(array('getPropertyInstance'))
|
||||
->getMock();
|
||||
$typed_data_manager->expects($this->any())
|
||||
->method('getPropertyInstance')
|
||||
->will($this->returnValue($typed_data));
|
||||
|
||||
// Set up a mock container as ItemList() will call for the 'typed_data_manager'
|
||||
// service.
|
||||
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')
|
||||
->setMethods(array('get'))
|
||||
->getMock();
|
||||
$container->expects($this->any())
|
||||
->method('get')
|
||||
->with($this->equalTo('typed_data_manager'))
|
||||
->will($this->returnValue($typed_data_manager));
|
||||
|
||||
\Drupal::setContainer($container);
|
||||
|
||||
$this->normalizer = new ListNormalizer();
|
||||
|
||||
$this->list = new ItemList(new DataDefinition());
|
||||
$this->list->setValue($this->expectedListValues);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the supportsNormalization() method.
|
||||
*/
|
||||
public function testSupportsNormalization() {
|
||||
$this->assertTrue($this->normalizer->supportsNormalization($this->list));
|
||||
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the normalize() method.
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$serializer = $this->getMockBuilder('Symfony\Component\Serializer\Serializer')
|
||||
->setMethods(array('normalize'))
|
||||
->getMock();
|
||||
$serializer->expects($this->exactly(3))
|
||||
->method('normalize')
|
||||
->will($this->returnValue('test'));
|
||||
|
||||
$this->normalizer->setSerializer($serializer);
|
||||
|
||||
$normalized = $this->normalizer->normalize($this->list);
|
||||
|
||||
$this->assertEquals($this->expectedListValues, $normalized);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\NormalizerBaseTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\serialization\Normalizer\NormalizerBase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\NormalizerBase
|
||||
* @group serialization
|
||||
*/
|
||||
class NormalizerBaseTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* Tests the supportsNormalization method.
|
||||
*
|
||||
* @dataProvider providerTestSupportsNormalization
|
||||
*
|
||||
* @param bool $expected_return
|
||||
* The expected boolean return value from supportNormalization.
|
||||
* @param mixed $data
|
||||
* The data passed to supportsNormalization.
|
||||
* @param string $supported_interface_or_class
|
||||
* (optional) the supported interface or class to set on the normalizer.
|
||||
*/
|
||||
public function testSupportsNormalization($expected_return, $data, $supported_interface_or_class = NULL) {
|
||||
$normalizer_base = $this->getMockForAbstractClass('Drupal\Tests\serialization\Unit\Normalizer\TestNormalizerBase');
|
||||
|
||||
if (isset($supported_interface_or_class)) {
|
||||
$normalizer_base->setSupportedInterfaceOrClass($supported_interface_or_class);
|
||||
}
|
||||
|
||||
$this->assertSame($expected_return, $normalizer_base->supportsNormalization($data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for testSupportsNormalization.
|
||||
*
|
||||
* @return array
|
||||
* An array of provider data for testSupportsNormalization.
|
||||
*/
|
||||
public function providerTestSupportsNormalization() {
|
||||
return array(
|
||||
// Something that is not an object should return FALSE immediately.
|
||||
array(FALSE, array()),
|
||||
// An object with no class set should return FALSE.
|
||||
array(FALSE, new \stdClass()),
|
||||
// Set a supported Class.
|
||||
array(TRUE, new \stdClass(), 'stdClass'),
|
||||
// Set a supported interface.
|
||||
array(TRUE, new \RecursiveArrayIterator(), 'RecursiveIterator'),
|
||||
// Set a different class.
|
||||
array(FALSE, new \stdClass(), 'ArrayIterator'),
|
||||
// Set a different interface.
|
||||
array(FALSE, new \stdClass(), 'RecursiveIterator'),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test class for NormalizerBase.
|
||||
*/
|
||||
abstract class TestNormalizerBase extends NormalizerBase {
|
||||
|
||||
/**
|
||||
* Sets the protected supportedInterfaceOrClass property.
|
||||
*
|
||||
* @param string $supported_interface_or_class
|
||||
* The class name to set.
|
||||
*/
|
||||
public function setSupportedInterfaceOrClass($supported_interface_or_class) {
|
||||
$this->supportedInterfaceOrClass = $supported_interface_or_class;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\NullNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\serialization\Normalizer\NullNormalizer;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\NullNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class NullNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The NullNormalizer instance.
|
||||
*
|
||||
* @var \Drupal\serialization\Normalizer\NullNormalizer
|
||||
*/
|
||||
protected $normalizer;
|
||||
|
||||
/**
|
||||
* The interface to use in testing.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $interface = 'Drupal\Core\TypedData\TypedDataInterface';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
$this->normalizer = new NullNormalizer($this->interface);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::__construct
|
||||
* @covers ::supportsNormalization
|
||||
*/
|
||||
public function testSupportsNormalization() {
|
||||
$mock = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
$this->assertTrue($this->normalizer->supportsNormalization($mock));
|
||||
// Also test that an object not implementing TypedDataInterface fails.
|
||||
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::normalize
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$mock = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
$this->assertNull($this->normalizer->normalize($mock));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\serialization\Unit\Normalizer\TypedDataNormalizerTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\serialization\Unit\Normalizer;
|
||||
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\serialization\Normalizer\TypedDataNormalizer;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\serialization\Normalizer\TypedDataNormalizer
|
||||
* @group serialization
|
||||
*/
|
||||
class TypedDataNormalizerTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The TypedDataNormalizer instance.
|
||||
*
|
||||
* @var \Drupal\serialization\Normalizer\TypedDataNormalizer
|
||||
*/
|
||||
protected $normalizer;
|
||||
|
||||
/**
|
||||
* The mock typed data instance.
|
||||
*
|
||||
* @var \Drupal\Core\TypedData\TypedDataInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $typedData;
|
||||
|
||||
protected function setUp() {
|
||||
$this->normalizer = new TypedDataNormalizer();
|
||||
$this->typedData = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the supportsNormalization() method.
|
||||
*/
|
||||
public function testSupportsNormalization() {
|
||||
$this->assertTrue($this->normalizer->supportsNormalization($this->typedData));
|
||||
// Also test that an object not implementing TypedDataInterface fails.
|
||||
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the normalize() method.
|
||||
*/
|
||||
public function testNormalize() {
|
||||
$this->typedData->expects($this->once())
|
||||
->method('getValue')
|
||||
->will($this->returnValue('test'));
|
||||
|
||||
$this->assertEquals('test', $this->normalizer->normalize($this->typedData));
|
||||
}
|
||||
|
||||
}
|
Reference in a new issue