Merge "Fixed Style/StringLiterals RuboCop offense"
[lhc/web/wiklou.git] / tests / phpunit / includes / resourceloader / ResourceLoaderFileModuleTest.php
1 <?php
2
3 /**
4 * @group ResourceLoader
5 */
6 class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
7
8 protected function setUp() {
9 parent::setUp();
10
11 // The return value of the closure shouldn't matter since this test should
12 // never call it
13 SkinFactory::getDefaultInstance()->register(
14 'fakeskin',
15 'FakeSkin',
16 function () {
17 }
18 );
19 }
20
21 private static function getModules() {
22 $base = array(
23 'localBasePath' => realpath( dirname( __FILE__ ) ),
24 );
25
26 return array(
27 'noTemplateModule' => array(),
28
29 'htmlTemplateModule' => $base + array(
30 'templates' => array(
31 'templates/template.html',
32 'templates/template2.html',
33 )
34 ),
35
36 'aliasedHtmlTemplateModule' => $base + array(
37 'templates' => array(
38 'foo.html' => 'templates/template.html',
39 'bar.html' => 'templates/template2.html',
40 )
41 ),
42
43 'templateModuleHandlebars' => $base + array(
44 'templates' => array(
45 'templates/template_awesome.handlebars',
46 ),
47 ),
48
49 'aliasFooFromBar' => $base + array(
50 'templates' => array(
51 'foo.foo' => 'templates/template.bar',
52 ),
53 ),
54 );
55 }
56
57 public static function providerTemplateDependencies() {
58 $modules = self::getModules();
59
60 return array(
61 array(
62 $modules['noTemplateModule'],
63 array(),
64 ),
65 array(
66 $modules['htmlTemplateModule'],
67 array(
68 'mediawiki.template',
69 ),
70 ),
71 array(
72 $modules['templateModuleHandlebars'],
73 array(
74 'mediawiki.template',
75 'mediawiki.template.handlebars',
76 ),
77 ),
78 array(
79 $modules['aliasFooFromBar'],
80 array(
81 'mediawiki.template',
82 'mediawiki.template.foo',
83 ),
84 ),
85 );
86 }
87
88 /**
89 * @dataProvider providerTemplateDependencies
90 * @covers ResourceLoaderFileModule::__construct
91 * @covers ResourceLoaderFileModule::getDependencies
92 */
93 public function testTemplateDependencies( $module, $expected ) {
94 $rl = new ResourceLoaderFileModule( $module );
95 $this->assertEquals( $rl->getDependencies(), $expected );
96 }
97
98 /**
99 * @covers ResourceLoaderFileModule::getAllStyleFiles
100 * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
101 * @covers ResourceLoaderFileModule::getSkinStyleFiles
102 */
103 public function testGetAllSkinStyleFiles() {
104 $baseParams = array(
105 'scripts' => array(
106 'foo.js',
107 'bar.js',
108 ),
109 'styles' => array(
110 'foo.css',
111 'bar.css' => array( 'media' => 'print' ),
112 'screen.less' => array( 'media' => 'screen' ),
113 'screen-query.css' => array( 'media' => 'screen and (min-width: 400px)' ),
114 ),
115 'skinStyles' => array(
116 'default' => 'quux-fallback.less',
117 'fakeskin' => array(
118 'baz-vector.css',
119 'quux-vector.less',
120 ),
121 ),
122 'messages' => array(
123 'hello',
124 'world',
125 ),
126 );
127
128 $module = new ResourceLoaderFileModule( $baseParams );
129
130 $this->assertEquals(
131 array(
132 'foo.css',
133 'baz-vector.css',
134 'quux-vector.less',
135 'quux-fallback.less',
136 'bar.css',
137 'screen.less',
138 'screen-query.css',
139 ),
140 array_map( 'basename', $module->getAllStyleFiles() )
141 );
142 }
143
144 /**
145 * Strip @noflip annotations from CSS code.
146 * @param string $css
147 * @return string
148 */
149 private static function stripNoflip( $css ) {
150 return str_replace( '/*@noflip*/ ', '', $css );
151 }
152
153 /**
154 * What happens when you mix @embed and @noflip?
155 * This really is an integration test, but oh well.
156 *
157 * @covers ResourceLoaderFileModule::getStyles
158 * @covers ResourceLoaderFileModule::getStyleFiles
159 */
160 public function testMixedCssAnnotations( ) {
161 $basePath = __DIR__ . '/../../data/css';
162 $testModule = new ResourceLoaderFileModule( array(
163 'localBasePath' => $basePath,
164 'styles' => array( 'test.css' ),
165 ) );
166 $expectedModule = new ResourceLoaderFileModule( array(
167 'localBasePath' => $basePath,
168 'styles' => array( 'expected.css' ),
169 ) );
170
171 $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
172 $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
173
174 // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
175 // the @noflip annotations are always preserved, we need to strip them first.
176 $this->assertEquals(
177 $expectedModule->getStyles( $contextLtr ),
178 self::stripNoflip( $testModule->getStyles( $contextLtr ) ),
179 "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode"
180 );
181 $this->assertEquals(
182 $expectedModule->getStyles( $contextLtr ),
183 self::stripNoflip( $testModule->getStyles( $contextRtl ) ),
184 "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode"
185 );
186 }
187
188 public static function providerGetTemplates() {
189 $modules = self::getModules();
190
191 return array(
192 array(
193 $modules['noTemplateModule'],
194 array(),
195 ),
196 array(
197 $modules['templateModuleHandlebars'],
198 array(
199 'templates/template_awesome.handlebars' => "wow\n",
200 ),
201 ),
202 array(
203 $modules['htmlTemplateModule'],
204 array(
205 'templates/template.html' => "<strong>hello</strong>\n",
206 'templates/template2.html' => "<div>goodbye</div>\n",
207 ),
208 ),
209 array(
210 $modules['aliasedHtmlTemplateModule'],
211 array(
212 'foo.html' => "<strong>hello</strong>\n",
213 'bar.html' => "<div>goodbye</div>\n",
214 ),
215 ),
216 );
217 }
218
219 /**
220 * @dataProvider providerGetTemplates
221 * @covers ResourceLoaderFileModule::getTemplates
222 */
223 public function testGetTemplates( $module, $expected ) {
224 $rl = new ResourceLoaderFileModule( $module );
225
226 $this->assertEquals( $rl->getTemplates(), $expected );
227 }
228
229 public static function providerGetModifiedTime() {
230 $modules = self::getModules();
231
232 return array(
233 // Check the default value when no templates present in module is 1
234 array( $modules['noTemplateModule'], 1 ),
235 );
236 }
237
238 /**
239 * @dataProvider providerGetModifiedTime
240 * @covers ResourceLoaderFileModule::getModifiedTime
241 */
242 public function testGetModifiedTime( $module, $expected ) {
243 $rl = new ResourceLoaderFileModule( $module );
244 $ts = $rl->getModifiedTime( $this->getResourceLoaderContext() );
245 $this->assertEquals( $ts, $expected );
246 }
247 }