public function XmlFileLoaderTest::testExtensions

File

drupal/core/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php, line 232

Class

XmlFileLoaderTest

Namespace

Symfony\Component\DependencyInjection\Tests\Loader

Code

public function testExtensions() {
  $container = new ContainerBuilder();
  $container
    ->registerExtension(new \ProjectExtension());
  $container
    ->registerExtension(new \ProjectWithXsdExtension());
  $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath . '/xml'));

  // extension without an XSD
  $loader
    ->load('extensions/services1.xml');
  $container
    ->compile();
  $services = $container
    ->getDefinitions();
  $parameters = $container
    ->getParameterBag()
    ->all();
  $this
    ->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
  $this
    ->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
  $this
    ->assertEquals('BAR', $services['project.service.foo']
    ->getClass(), '->load() parses extension elements');
  $this
    ->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');

  // extension with an XSD
  $container = new ContainerBuilder();
  $container
    ->registerExtension(new \ProjectExtension());
  $container
    ->registerExtension(new \ProjectWithXsdExtension());
  $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath . '/xml'));
  $loader
    ->load('extensions/services2.xml');
  $container
    ->compile();
  $services = $container
    ->getDefinitions();
  $parameters = $container
    ->getParameterBag()
    ->all();
  $this
    ->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
  $this
    ->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
  $this
    ->assertEquals('BAR', $services['project.service.foo']
    ->getClass(), '->load() parses extension elements');
  $this
    ->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');
  $container = new ContainerBuilder();
  $container
    ->registerExtension(new \ProjectExtension());
  $container
    ->registerExtension(new \ProjectWithXsdExtension());
  $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath . '/xml'));

  // extension with an XSD (does not validate)
  try {
    $loader
      ->load('extensions/services3.xml');
    $this
      ->fail('->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
  } catch (\Exception $e) {
    $this
      ->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
    $this
      ->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'services3.xml'), $e
      ->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
    $e = $e
      ->getPrevious();
    $this
      ->assertInstanceOf('InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
    $this
      ->assertContains('The attribute \'bar\' is not allowed', $e
      ->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
  }

  // non-registered extension
  try {
    $loader
      ->load('extensions/services4.xml');
    $this
      ->fail('->load() throws an InvalidArgumentException if the tag is not valid');
  } catch (\Exception $e) {
    $this
      ->assertInstanceOf('\\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tag is not valid');
    $this
      ->assertStringStartsWith('There is no extension able to load the configuration for "project:bar" (in', $e
      ->getMessage(), '->load() throws an InvalidArgumentException if the tag is not valid');
  }
}