3 namespace Drupal\Tests\Component\Discovery;
5 use Drupal\Component\Discovery\DiscoveryException;
6 use Drupal\Component\Discovery\YamlDirectoryDiscovery;
7 use Drupal\Component\FileCache\FileCacheFactory;
8 use org\bovigo\vfs\vfsStream;
9 use PHPUnit\Framework\TestCase;
12 * YamlDirectoryDiscoveryTest component unit tests.
14 * @coversDefaultClass \Drupal\Component\Discovery\YamlDirectoryDiscovery
18 class YamlDirectoryDiscoveryTest extends TestCase {
23 protected function setUp() {
24 // Ensure that FileCacheFactory has a prefix.
25 FileCacheFactory::setPrefix('prefix');
29 * Tests YAML directory discovery.
33 public function testDiscovery() {
34 vfsStream::setup('modules', NULL, [
37 'item_1.test.yml' => "id: item1\nname: 'test1 item 1'",
40 'item_2.test.yml' => "id: item2\nname: 'test1 item 2'",
45 'item_3.test.yml' => "id: item3\nname: 'test2 item 3'",
52 'item_4.test.yml' => "id: item4\nname: 'test4 item 4'",
53 'item_5.test.yml' => "id: item5\nname: 'test4 item 5'",
54 'item_6.test.yml' => "id: item6\nname: 'test4 item 6'",
59 // Set up the directories to search.
61 // Multiple directories both with valid items.
63 vfsStream::url('modules/test_1/subdir1'),
64 vfsStream::url('modules/test_1/subdir2'),
66 // The subdir2 directory is empty.
68 vfsStream::url('modules/test_2/subdir1'),
69 vfsStream::url('modules/test_2/subdir2'),
71 // Directories that do not exist.
73 vfsStream::url('modules/test_3/subdir1'),
74 vfsStream::url('modules/test_3/subdir2'),
76 // A single directory.
77 'test_4' => vfsStream::url('modules/test_4/subdir1'),
80 $discovery = new YamlDirectoryDiscovery($directories, 'test');
81 $data = $discovery->findAll();
83 $this->assertSame(['id' => 'item1', 'name' => 'test1 item 1', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/subdir1/item_1.test.yml'], $data['test_1']['item1']);
84 $this->assertSame(['id' => 'item2', 'name' => 'test1 item 2', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/subdir2/item_2.test.yml'], $data['test_1']['item2']);
85 $this->assertCount(2, $data['test_1']);
87 $this->assertSame(['id' => 'item3', 'name' => 'test2 item 3', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_2/subdir1/item_3.test.yml'], $data['test_2']['item3']);
88 $this->assertCount(1, $data['test_2']);
90 $this->assertTrue(empty($data['test_3']), 'test_3 provides 0 items');
92 $this->assertSame(['id' => 'item4', 'name' => 'test4 item 4', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_4.test.yml'], $data['test_4']['item4']);
93 $this->assertSame(['id' => 'item5', 'name' => 'test4 item 5', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_5.test.yml'], $data['test_4']['item5']);
94 $this->assertSame(['id' => 'item6', 'name' => 'test4 item 6', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_6.test.yml'], $data['test_4']['item6']);
95 $this->assertCount(3, $data['test_4']);
99 * Tests YAML directory discovery with an alternate ID key.
103 public function testDiscoveryAlternateId() {
104 vfsStream::setup('modules', NULL, [
106 'item_1.test.yml' => "alt_id: item1\nid: ignored",
110 // Set up the directories to search.
111 $directories = ['test_1' => vfsStream::url('modules/test_1')];
113 $discovery = new YamlDirectoryDiscovery($directories, 'test', 'alt_id');
114 $data = $discovery->findAll();
116 $this->assertSame(['alt_id' => 'item1', 'id' => 'ignored', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/item_1.test.yml'], $data['test_1']['item1']);
117 $this->assertCount(1, $data['test_1']);
121 * Tests YAML directory discovery with a missing ID key.
124 * @covers ::getIdentifier
126 public function testDiscoveryNoIdException() {
127 if (method_exists($this, 'expectException')) {
128 $this->expectException(DiscoveryException::class);
129 $this->expectExceptionMessage('The vfs://modules/test_1/item_1.test.yml contains no data in the identifier key \'id\'');
132 $this->setExpectedException(DiscoveryException::class, 'The vfs://modules/test_1/item_1.test.yml contains no data in the identifier key \'id\'');
134 vfsStream::setup('modules', NULL, [
136 'item_1.test.yml' => "",
140 // Set up the directories to search.
141 $directories = ['test_1' => vfsStream::url('modules/test_1')];
143 $discovery = new YamlDirectoryDiscovery($directories, 'test');
144 $discovery->findAll();
148 * Tests YAML directory discovery with invalid YAML.
152 public function testDiscoveryInvalidYamlException() {
153 if (method_exists($this, 'expectException')) {
154 $this->expectException(DiscoveryException::class);
155 $this->expectExceptionMessage('The vfs://modules/test_1/item_1.test.yml contains invalid YAML');
158 $this->setExpectedException(DiscoveryException::class, 'The vfs://modules/test_1/item_1.test.yml contains invalid YAML');
160 vfsStream::setup('modules', NULL, [
162 'item_1.test.yml' => "id: invalid\nfoo : [bar}",
166 // Set up the directories to search.
167 $directories = ['test_1' => vfsStream::url('modules/test_1')];
169 $discovery = new YamlDirectoryDiscovery($directories, 'test');
170 $discovery->findAll();