Completed
Push — master ( 10f429...3b71b7 )
by Ingo
11:44
created

ThemeResourceLoaderTest::testFindTemplatesByPath()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 24
rs 8.9713
1
<?php
2
3
use SilverStripe\View\ThemeResourceLoader;
4
use SilverStripe\View\ThemeManifest;
5
6
/**
7
 * Tests for the {@link TemplateLoader} class.
8
 *
9
 * @package framework
10
 * @subpackage tests
11
 */
12
class ThemeResourceLoaderTest extends SapphireTest {
13
14
	private $base;
15
16
	/**
17
	 * @var ThemeManifest
18
	 */
19
	private $manifest;
20
21
	/**
22
	 * @var ThemeResourceLoader
23
	 */
24
	private $loader;
25
26
	/**
27
	 * Set up manifest before each test
28
	 */
29
	public function setUp() {
30
		parent::setUp();
31
32
		// Fake project root
33
		$this->base = dirname(__FILE__) . '/fixtures/templatemanifest';
34
		// New ThemeManifest for that root
35
		$this->manifest = new ThemeManifest($this->base, 'myproject', false, true);
36
		// New Loader for that root
37
		$this->loader = new ThemeResourceLoader($this->base);
38
		$this->loader->addSet('$default', $this->manifest);
39
	}
40
41
	/**
42
	 * Test that 'main' and 'Layout' templates are loaded from module
43
	 */
44
	public function testFindTemplatesInModule() {
45
		$this->assertEquals(
46
			"$this->base/module/templates/Page.ss",
47
			$this->loader->findTemplate('Page', ['$default'])
48
		);
49
50
		$this->assertEquals(
51
			"$this->base/module/templates/Layout/Page.ss",
52
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['$default'])
53
		);
54
	}
55
56
	public function testFindNestedThemeTemplates() {
57
		// Without including the theme this template cannot be found
58
		$this->assertEquals(null, $this->loader->findTemplate('NestedThemePage', ['$default']));
59
60
		// With a nested theme available then it is available
61
		$this->assertEquals(
62
			"{$this->base}/module/themes/subtheme/templates/NestedThemePage.ss",
63
			$this->loader->findTemplate('NestedThemePage', [
64
				'silverstripe/module:subtheme',
65
				'$default'
66
			])
67
		);
68
69
		// Can also be found if excluding $default theme
70
		$this->assertEquals(
71
			"{$this->base}/module/themes/subtheme/templates/NestedThemePage.ss",
72
			$this->loader->findTemplate('NestedThemePage', [
73
				'silverstripe/module:subtheme',
74
			])
75
		);
76
	}
77
78
	public function testFindTemplateByType() {
79
		// Test that "type" is respected properly
80
		$this->assertEquals(
81
			"{$this->base}/module/templates/MyNamespace/Layout/MyClass.ss",
82
			$this->loader->findTemplate(
83
				[
84
					[
85
						'type' => 'Layout',
86
						'MyNamespace/NonExistantTemplate'
87
					],
88
					[
89
						'type' => 'Layout',
90
						'MyNamespace/MyClass'
91
					],
92
					'MyNamespace/MyClass'
93
				],
94
				[
95
					'silverstripe/module:subtheme',
96
					'theme',
97
					'$default',
98
				]
99
			)
100
		);
101
102
		// Non-typed template can be found even if looking for typed theme at a lower priority
103
		$this->assertEquals(
104
			"{$this->base}/module/templates/MyNamespace/MyClass.ss",
105
			$this->loader->findTemplate(
106
				[
107
					[
108
						'type' => 'Layout',
109
						'MyNamespace/NonExistantTemplate'
110
					],
111
					'MyNamespace/MyClass',
112
					[
113
						'type' => 'Layout',
114
						'MyNamespace/MyClass'
115
					]
116
				],
117
				[
118
					'silverstripe/module',
119
					'theme',
120
					'$default',
121
				]
122
			)
123
		);
124
	}
125
126
	public function testFindTemplatesByPath() {
127
		// Items given as full paths are returned directly
128
		$this->assertEquals(
129
			"$this->base/themes/theme/templates/Page.ss",
130
			$this->loader->findTemplate("$this->base/themes/theme/templates/Page.ss", ['theme'])
131
		);
132
133
		$this->assertEquals(
134
			"$this->base/themes/theme/templates/Page.ss",
135
			$this->loader->findTemplate([
136
				"$this->base/themes/theme/templates/Page.ss",
137
				"Page"
138
			], ['theme'])
139
		);
140
141
		// Ensure checks for file_exists
142
		$this->assertEquals(
143
			"$this->base/themes/theme/templates/Page.ss",
144
			$this->loader->findTemplate([
145
				"$this->base/themes/theme/templates/NotAPage.ss",
146
				"$this->base/themes/theme/templates/Page.ss",
147
			], ['theme'])
148
		);
149
	}
150
151
	/**
152
	 * Test that 'main' and 'Layout' templates are loaded from set theme
153
	 */
154
	public function testFindTemplatesInTheme() {
155
		$this->assertEquals(
156
			"$this->base/themes/theme/templates/Page.ss",
157
			$this->loader->findTemplate('Page', ['theme'])
158
		);
159
160
		$this->assertEquals(
161
			"$this->base/themes/theme/templates/Layout/Page.ss",
162
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['theme'])
163
		);
164
	}
165
166
	/**
167
	 * Test that 'main' and 'Layout' templates are loaded from project without a set theme
168
	 */
169
	public function testFindTemplatesInApplication() {
170
		// TODO: replace with one that doesn't create temporary files (so bad)
171
		$templates = array(
172
			$this->base . '/myproject/templates/Page.ss',
173
			$this->base . '/myproject/templates/Layout/Page.ss'
174
		);
175
		$this->createTestTemplates($templates);
176
177
		$this->assertEquals(
178
			"$this->base/myproject/templates/Page.ss",
179
			$this->loader->findTemplate('Page', ['$default'])
180
		);
181
182
		$this->assertEquals(
183
			"$this->base/myproject/templates/Layout/Page.ss",
184
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['$default'])
185
		);
186
187
		$this->removeTestTemplates($templates);
188
	}
189
190
	/**
191
	 * Test that 'main' template is found in theme and 'Layout' is found in module
192
	 */
193
	public function testFindTemplatesMainThemeLayoutModule() {
194
		$this->assertEquals(
195
			"$this->base/themes/theme/templates/CustomThemePage.ss",
196
			$this->loader->findTemplate('CustomThemePage', ['theme', '$default'])
197
		);
198
199
		$this->assertEquals(
200
			"$this->base/module/templates/Layout/CustomThemePage.ss",
201
			$this->loader->findTemplate(['type' => 'Layout', 'CustomThemePage'], ['theme', '$default'])
202
		);
203
	}
204
205
	public function testFindThemedCSS() {
206
		$this->assertEquals(
207
			"myproject/css/project.css",
208
			$this->loader->findThemedCSS('project', ['$default', 'theme'])
209
		);
210
		$this->assertEquals(
211
			"themes/theme/css/project.css",
212
			$this->loader->findThemedCSS('project', ['theme', '$default'])
213
		);
214
		$this->assertEmpty(
215
			$this->loader->findThemedCSS('nofile', ['theme', '$default'])
216
		);
217
		$this->assertEquals(
218
			'module/css/content.css',
219
			$this->loader->findThemedCSS('content', ['/module', 'theme'])
220
		);
221
		$this->assertEquals(
222
			'module/css/content.css',
223
			$this->loader->findThemedCSS('content', ['/module', 'theme', '$default'])
224
		);
225
		$this->assertEquals(
226
			'module/css/content.css',
227
			$this->loader->findThemedCSS('content', ['$default', '/module', 'theme'])
228
		);
229
	}
230
231
	public function testFindThemedJavascript() {
232
		$this->assertEquals(
233
			"myproject/javascript/project.js",
234
			$this->loader->findThemedJavascript('project', ['$default', 'theme'])
235
		);
236
		$this->assertEquals(
237
			"themes/theme/javascript/project.js",
238
			$this->loader->findThemedJavascript('project', ['theme', '$default'])
239
		);
240
		$this->assertEmpty(
241
			$this->loader->findThemedJavascript('nofile', ['theme', '$default'])
242
		);
243
		$this->assertEquals(
244
			'module/javascript/content.js',
245
			$this->loader->findThemedJavascript('content', ['/module', 'theme'])
246
		);
247
		$this->assertEquals(
248
			'module/javascript/content.js',
249
			$this->loader->findThemedJavascript('content', ['/module', 'theme', '$default'])
250
		);
251
		$this->assertEquals(
252
			'module/javascript/content.js',
253
			$this->loader->findThemedJavascript('content', ['$default', '/module', 'theme'])
254
		);
255
	}
256
257
	protected function createTestTemplates($templates) {
258
		foreach ($templates as $template) {
259
			file_put_contents($template, '');
260
		}
261
	}
262
263
	protected function removeTestTemplates($templates) {
264
		foreach ($templates as $template) {
265
			unlink($template);
266
		}
267
	}
268
269
}
270