Completed
Push — master ( 2bbdda...4b4aa4 )
by Sam
20:37 queued 08:00
created

TemplateLoaderTest::testFindNestedThemeTemplates()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 21
rs 9.3142
1
<?php
2
3
use SilverStripe\View\TemplateLoader;
4
use SilverStripe\View\ThemeManifest;
5
6
/**
7
 * Tests for the {@link TemplateLoader} class.
8
 *
9
 * @package framework
10
 * @subpackage tests
11
 */
12
class TemplateLoaderTest extends SapphireTest {
13
14
	private $base;
15
16
	/**
17
	 * @var ThemeManifest
18
	 */
19
	private $manifest;
20
21
	/**
22
	 * @var TemplateLoader
23
	 */
24
	private $loader;
25
26
	/**
27
	 * Set up manifest before each test
28
	 */
29
	public function setUp() {
30
		parent::setUp();
31
		// Fake project root
32
		$this->base = dirname(__FILE__) . '/fixtures/templatemanifest';
33
		// New ThemeManifest for that root
34
		$this->manifest = new ThemeManifest($this->base, 'myproject', false, true);
35
		// New Loader for that root
36
		$this->loader = new TemplateLoader($this->base);
37
		$this->loader->addSet('$default', $this->manifest);
38
	}
39
40
	/**
41
	 * Test that 'main' and 'Layout' templates are loaded from module
42
	 */
43
	public function testFindTemplatesInModule() {
44
		$this->assertEquals(
45
			"$this->base/module/templates/Page.ss",
46
			$this->loader->findTemplate('Page', ['$default'])
47
		);
48
49
		$this->assertEquals(
50
			"$this->base/module/templates/Layout/Page.ss",
51
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['$default'])
52
		);
53
	}
54
55
	public function testFindNestedThemeTemplates() {
56
		// Without including the theme this template cannot be found
57
		$this->assertEquals(null, $this->loader->findTemplate('NestedThemePage', ['$default']));
58
59
		// With a nested theme available then it is available
60
		$this->assertEquals(
61
			"{$this->base}/module/themes/subtheme/templates/NestedThemePage.ss",
62
			$this->loader->findTemplate('NestedThemePage', [
63
				'silverstripe/module:subtheme',
64
				'$default'
65
			])
66
		);
67
68
		// Can also be found if excluding $default theme
69
		$this->assertEquals(
70
			"{$this->base}/module/themes/subtheme/templates/NestedThemePage.ss",
71
			$this->loader->findTemplate('NestedThemePage', [
72
				'silverstripe/module:subtheme',
73
			])
74
		);
75
	}
76
77
	/**
78
	 * Test that 'main' and 'Layout' templates are loaded from set theme
79
	 */
80
	public function testFindTemplatesInTheme() {
81
		$this->assertEquals(
82
			"$this->base/themes/theme/templates/Page.ss",
83
			$this->loader->findTemplate('Page', ['theme'])
84
		);
85
86
		$this->assertEquals(
87
			"$this->base/themes/theme/templates/Layout/Page.ss",
88
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['theme'])
89
		);
90
	}
91
92
	/**
93
	 * Test that 'main' and 'Layout' templates are loaded from project without a set theme
94
	 */
95
	public function testFindTemplatesInApplication() {
96
		// TODO: replace with one that doesn't create temporary files (so bad)
97
		$templates = array(
98
			$this->base . '/myproject/templates/Page.ss',
99
			$this->base . '/myproject/templates/Layout/Page.ss'
100
		);
101
		$this->createTestTemplates($templates);
102
103
		$this->assertEquals(
104
			"$this->base/myproject/templates/Page.ss",
105
			$this->loader->findTemplate('Page', ['$default'])
106
		);
107
108
		$this->assertEquals(
109
			"$this->base/myproject/templates/Layout/Page.ss",
110
			$this->loader->findTemplate(['type' => 'Layout', 'Page'], ['$default'])
111
		);
112
113
		$this->removeTestTemplates($templates);
114
	}
115
116
	/**
117
	 * Test that 'main' template is found in theme and 'Layout' is found in module
118
	 */
119
	public function testFindTemplatesMainThemeLayoutModule() {
120
		$this->assertEquals(
121
			"$this->base/themes/theme/templates/CustomThemePage.ss",
122
			$this->loader->findTemplate('CustomThemePage', ['theme', '$default'])
123
		);
124
125
		$this->assertEquals(
126
			"$this->base/module/templates/Layout/CustomThemePage.ss",
127
			$this->loader->findTemplate(['type' => 'Layout', 'CustomThemePage'], ['theme', '$default'])
128
		);
129
	}
130
131
	protected function createTestTemplates($templates) {
132
		foreach ($templates as $template) {
133
			file_put_contents($template, '');
134
		}
135
	}
136
137
	protected function removeTestTemplates($templates) {
138
		foreach ($templates as $template) {
139
			unlink($template);
140
		}
141
	}
142
143
}
144