You are here

class YamlTest in Drupal 10

Same name in this branch
  1. 10 core/tests/Drupal/Tests/Core/Serialization/YamlTest.php \Drupal\Tests\Core\Serialization\YamlTest
  2. 10 core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest
Same name and namespace in other branches
  1. 8 core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest
  2. 9 core/tests/Drupal/Tests/Component/Serialization/YamlTest.php \Drupal\Tests\Component\Serialization\YamlTest

@coversDefaultClass \Drupal\Component\Serialization\Yaml @group Serialization

Hierarchy

  • class \Drupal\Tests\Component\Serialization\YamlTest extends \PHPUnit\Framework\TestCase

Expanded class hierarchy of YamlTest

File

core/tests/Drupal/Tests/Component/Serialization/YamlTest.php, line 16

Namespace

Drupal\Tests\Component\Serialization
View source
class YamlTest extends TestCase {

  /**
   * @var \PHPUnit\Framework\MockObject\MockObject
   */
  protected $mockParser;
  protected function setUp() : void {
    parent::setUp();
    $this->mockParser = $this
      ->getMockBuilder('\\stdClass')
      ->addMethods([
      'encode',
      'decode',
      'getFileExtension',
    ])
      ->getMock();
    YamlParserProxy::setMock($this->mockParser);
  }
  protected function tearDown() : void {
    YamlParserProxy::setMock(NULL);
    parent::tearDown();
  }

  /**
   * @covers ::decode
   */
  public function testDecode() {
    $this->mockParser
      ->expects($this
      ->once())
      ->method('decode');
    YamlStub::decode('test');
  }

  /**
   * @covers ::getFileExtension
   */
  public function testGetFileExtension() {
    $this->mockParser
      ->expects($this
      ->never())
      ->method('getFileExtension');
    $this
      ->assertEquals('yml', YamlStub::getFileExtension());
  }

  /**
   * Tests all YAML files are decoded in the same way with Symfony and PECL.
   *
   * This test is a little bit slow but it tests that we do not have any bugs in
   * our YAML that might not be decoded correctly in any of our implementations.
   *
   * @todo This should exist as an integration test not part of our unit tests.
   *   https://www.drupal.org/node/2597730
   *
   * @requires extension yaml
   * @dataProvider providerYamlFilesInCore
   */
  public function testYamlFiles($file) {
    $data = file_get_contents($file);
    try {
      $this
        ->assertEquals(YamlSymfony::decode($data), YamlPecl::decode($data), $file);
    } catch (InvalidDataTypeException $e) {

      // Provide file context to the failure so the exception message is useful.
      $this
        ->fail("Exception thrown parsing {$file}:\n" . $e
        ->getMessage());
    }
  }

  /**
   * Ensures that decoding php objects does not work in PECL.
   *
   * @requires extension yaml
   *
   * @see \Drupal\Tests\Component\Serialization\YamlTest::testObjectSupportDisabledSymfony()
   */
  public function testObjectSupportDisabledPecl() {
    $object = new \stdClass();
    $object->foo = 'bar';

    // In core all Yaml encoding is done via Symfony and it does not support
    // objects so in order to encode an object we have to use the PECL
    // extension.
    // @see \Drupal\Component\Serialization\Yaml::encode()
    $yaml = YamlPecl::encode([
      $object,
    ]);
    $this
      ->assertEquals([
      'O:8:"stdClass":1:{s:3:"foo";s:3:"bar";}',
    ], YamlPecl::decode($yaml));
  }

  /**
   * Ensures that decoding php objects does not work in Symfony.
   *
   * @requires extension yaml
   *
   * @see \Drupal\Tests\Component\Serialization\YamlTest::testObjectSupportDisabledPecl()
   */
  public function testObjectSupportDisabledSymfony() {
    $this
      ->expectException(InvalidDataTypeException::class);
    $this
      ->expectExceptionMessageMatches('/^Object support when parsing a YAML file has been disabled/');
    $object = new \stdClass();
    $object->foo = 'bar';

    // In core all Yaml encoding is done via Symfony and it does not support
    // objects so in order to encode an object we have to use the PECL
    // extension.
    // @see \Drupal\Component\Serialization\Yaml::encode()
    $yaml = YamlPecl::encode([
      $object,
    ]);
    YamlSymfony::decode($yaml);
  }

  /**
   * Data provider that lists all YAML files in core.
   */
  public function providerYamlFilesInCore() {
    $files = [];
    $dirs = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(__DIR__ . '/../../../../../', \RecursiveDirectoryIterator::FOLLOW_SYMLINKS));
    foreach ($dirs as $dir) {
      $pathname = $dir
        ->getPathname();

      // Exclude core/node_modules.
      if ($dir
        ->getExtension() == 'yml' && strpos($pathname, '/../../../../../node_modules') === FALSE) {
        if (strpos($dir
          ->getRealPath(), 'invalid_file') !== FALSE) {

          // There are some intentionally invalid files provided for testing
          // library API behaviors, ignore them.
          continue;
        }
        $files[] = [
          $dir
            ->getRealPath(),
        ];
      }
    }
    return $files;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
YamlTest::$mockParser protected property
YamlTest::providerYamlFilesInCore public function Data provider that lists all YAML files in core.
YamlTest::setUp protected function
YamlTest::tearDown protected function
YamlTest::testDecode public function @covers ::decode
YamlTest::testGetFileExtension public function @covers ::getFileExtension
YamlTest::testObjectSupportDisabledPecl public function Ensures that decoding php objects does not work in PECL.
YamlTest::testObjectSupportDisabledSymfony public function Ensures that decoding php objects does not work in Symfony.
YamlTest::testYamlFiles public function Tests all YAML files are decoded in the same way with Symfony and PECL.