-
Notifications
You must be signed in to change notification settings - Fork 13
/
FilePatternAssert.php
174 lines (155 loc) · 5.65 KB
/
FilePatternAssert.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
declare(strict_types=1);
namespace Drupal\Tests\oe_bootstrap_theme\PatternAssertion;
use Symfony\Component\DomCrawler\Crawler;
/**
* Assertions for the file pattern.
*/
class FilePatternAssert extends BasePatternAssert {
/**
* {@inheritdoc}
*/
protected function getAssertions(string $variant): array {
return [
'file' => [
[$this, 'assertFile'],
],
'translations' => [
[$this, 'assertTranslations'],
],
'link_label' => [
[$this, 'assertDownloadLinksLabel'],
],
'title' => [
[$this, 'assertElementText'],
'.bcl-heading',
],
'title_tag' => [
[$this, 'assertElementTag'],
'.bcl-heading',
],
];
}
/**
* {@inheritdoc}
*/
protected function assertBaseElements(string $html, string $variant): void {
$crawler = new Crawler($html);
// Only one icon should be rendered. The type will be asserted in the file
// assert.
$this->assertElementExists('svg.icon--file.icon--2xl', $crawler);
// Only one wrapper element is present.
$this->assertCount(1, $crawler->filter('.bcl-file-container'));
// Only one wrapper element is present within bcl-file-container.
$this->assertCount(1, $crawler->filter('.bcl-file-container > .bcl-file.border.rounded'));
}
/**
* Asserts the main file section of the pattern.
*
* @param array $expected
* The expected file section values.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertFile(array $expected, Crawler $crawler): void {
$file = $crawler->filter('.bcl-file-container > .bcl-file.border.rounded > div:first-child');
self::assertCount(1, $file);
(new IconPatternAssert())->assertPattern([
'name' => $expected['icon'],
'size' => '2xl',
], $crawler->filter('svg.icon--file')->outerHtml());
$this->assertDownloadLink($expected, $crawler);
$this->assertElementText($expected['title'], 'p.fw-medium.m-0.fs-5', $crawler);
$this->assertItemData($expected, $crawler->filter('p.fw-medium.m-0 + small.fw-medium'));
}
/**
* Asserts the translations section of the pattern.
*
* @param array|null $expected
* The expected translation section values, or NULL if no translations are
* expected.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertTranslations(?array $expected, Crawler $crawler): void {
// This selector targets the DIVs that wrap the main file and the
// translations. When no translations are present, there should be only one
// node.
$container_selector = '.bcl-file-container > .bcl-file.border.rounded > div';
if ($expected === NULL) {
// When no translations are present, only one div exists inside the
// container.
$this->assertElementExists($container_selector, $crawler);
$this->assertElementNotExists('.collapse', $crawler);
return;
}
$containers = $crawler->filter($container_selector);
self::assertCount(2, $containers);
// The second node wraps all the translations section.
$wrapper = $containers->eq(1);
$this->assertElementText(sprintf('Other languages (%s)', count($expected)), '.text-end a', $wrapper);
$translation_nodes = $wrapper->filter('.collapse > div');
self::assertSameSize($expected, $translation_nodes);
foreach ($expected as $index => $translation) {
$this->assertTranslationItem($translation, $translation_nodes->eq($index));
}
}
/**
* Asserts the label used for the download links.
*
* @param string $expected
* The expected label.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertDownloadLinksLabel(string $expected, Crawler $crawler): void {
$this->assertElementText($expected, '.bcl-file-container > .bcl-file.border.rounded > div:first-child a', $crawler);
foreach ($crawler->filter('.collapse > div a') as $node) {
self::assertEquals($expected, $node->textContent);
}
}
/**
* Asserts elements from the translation sections.
*
* @param array $expected
* The expected values.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertTranslationItem(array $expected, Crawler $crawler): void {
$this->assertDownloadLink($expected, $crawler);
$this->assertElementText($expected['title'], 'p.fw-bold.m-0', $crawler);
$this->assertItemData($expected, $crawler->filter('p.fw-bold.m-0 + small.fw-bold'));
}
/**
* Asserts a single item data section.
*
* @param array $expected
* The expected values.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertItemData(array $expected, Crawler $crawler): void {
// The language is the first text node.
/** @var \DOMNode $language_node */
$language_node = $crawler->getNode(0)->childNodes[0];
self::assertEquals($expected['language'], $language_node->textContent);
$this->assertElementText($expected['meta'], 'span', $crawler);
}
/**
* Asserts the file download link.
*
* @param array $expected
* The expected values.
* @param \Symfony\Component\DomCrawler\Crawler $crawler
* The crawler.
*/
protected function assertDownloadLink(array $expected, Crawler $crawler): void {
$link_selector = sprintf('a[href="%s"]', $expected['url']);
$this->assertElementExists($link_selector, $crawler);
(new IconPatternAssert())->assertPattern([
'name' => 'download',
'size' => 'fluid',
], $crawler->filter($link_selector . ' svg')->outerHtml());
}
}