3 namespace Drupal\Tests\Component\Discovery;
5 use Drupal\Component\Discovery\DiscoveryException;
6 use Drupal\Component\Discovery\YamlDirectoryDiscovery;
7 use Drupal\Tests\UnitTestCase;
8 use org\bovigo\vfs\vfsStream;
11 * YamlDirectoryDiscoveryTest component unit tests.
13 * @coversDefaultClass \Drupal\Component\Discovery\YamlDirectoryDiscovery
17 class YamlDirectoryDiscoveryTest extends UnitTestCase {
20 * Tests YAML directory discovery.
24 public function testDiscovery() {
25 vfsStream::setup('modules', NULL, [
28 'item_1.test.yml' => "id: item1\nname: 'test1 item 1'",
31 'item_2.test.yml' => "id: item2\nname: 'test1 item 2'",
36 'item_3.test.yml' => "id: item3\nname: 'test2 item 3'",
43 'item_4.test.yml' => "id: item4\nname: 'test4 item 4'",
44 'item_5.test.yml' => "id: item5\nname: 'test4 item 5'",
45 'item_6.test.yml' => "id: item6\nname: 'test4 item 6'",
50 // Set up the directories to search.
52 // Multiple directories both with valid items.
54 vfsStream::url('modules/test_1/subdir1'),
55 vfsStream::url('modules/test_1/subdir2'),
57 // The subdir2 directory is empty.
59 vfsStream::url('modules/test_2/subdir1'),
60 vfsStream::url('modules/test_2/subdir2'),
62 // Directories that do not exist.
64 vfsStream::url('modules/test_3/subdir1'),
65 vfsStream::url('modules/test_3/subdir2'),
67 // A single directory.
68 'test_4' => vfsStream::url('modules/test_4/subdir1'),
71 $discovery = new YamlDirectoryDiscovery($directories, 'test');
72 $data = $discovery->findAll();
74 $this->assertSame(['id' => 'item1', 'name' => 'test1 item 1', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/subdir1/item_1.test.yml'], $data['test_1']['item1']);
75 $this->assertSame(['id' => 'item2', 'name' => 'test1 item 2', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/subdir2/item_2.test.yml'], $data['test_1']['item2']);
76 $this->assertCount(2, $data['test_1']);
78 $this->assertSame(['id' => 'item3', 'name' => 'test2 item 3', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_2/subdir1/item_3.test.yml'], $data['test_2']['item3']);
79 $this->assertCount(1, $data['test_2']);
81 $this->assertTrue(empty($data['test_3']), 'test_3 provides 0 items');
83 $this->assertSame(['id' => 'item4', 'name' => 'test4 item 4', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_4.test.yml'], $data['test_4']['item4']);
84 $this->assertSame(['id' => 'item5', 'name' => 'test4 item 5', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_5.test.yml'], $data['test_4']['item5']);
85 $this->assertSame(['id' => 'item6', 'name' => 'test4 item 6', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_4/subdir1/item_6.test.yml'], $data['test_4']['item6']);
86 $this->assertCount(3, $data['test_4']);
90 * Tests YAML directory discovery with an alternate ID key.
94 public function testDiscoveryAlternateId() {
95 vfsStream::setup('modules', NULL, [
97 'item_1.test.yml' => "alt_id: item1\nid: ignored",
101 // Set up the directories to search.
102 $directories = ['test_1' => vfsStream::url('modules/test_1')];
104 $discovery = new YamlDirectoryDiscovery($directories, 'test', 'alt_id');
105 $data = $discovery->findAll();
107 $this->assertSame(['alt_id' => 'item1', 'id' => 'ignored', YamlDirectoryDiscovery::FILE_KEY => 'vfs://modules/test_1/item_1.test.yml'], $data['test_1']['item1']);
108 $this->assertCount(1, $data['test_1']);
112 * Tests YAML directory discovery with a missing ID key.
115 * @covers ::getIdentifier
117 public function testDiscoveryNoIdException() {
118 $this->setExpectedException(DiscoveryException::class, 'The vfs://modules/test_1/item_1.test.yml contains no data in the identifier key \'id\'');
119 vfsStream::setup('modules', NULL, [
121 'item_1.test.yml' => "",
125 // Set up the directories to search.
126 $directories = ['test_1' => vfsStream::url('modules/test_1')];
128 $discovery = new YamlDirectoryDiscovery($directories, 'test');
129 $discovery->findAll();
133 * Tests YAML directory discovery with invalid YAML.
137 public function testDiscoveryInvalidYamlException() {
138 $this->setExpectedException(DiscoveryException::class, 'The vfs://modules/test_1/item_1.test.yml contains invalid YAML');
139 vfsStream::setup('modules', NULL, [
141 'item_1.test.yml' => "id: invalid\nfoo : [bar}",
145 // Set up the directories to search.
146 $directories = ['test_1' => vfsStream::url('modules/test_1')];
148 $discovery = new YamlDirectoryDiscovery($directories, 'test');
149 $discovery->findAll();