@@ -24,765 +24,765 @@ |
||
24 | 24 | use Test\TestCase; |
25 | 25 | |
26 | 26 | class FactoryTest extends TestCase { |
27 | - /** @var IConfig|MockObject */ |
|
28 | - protected $config; |
|
29 | - |
|
30 | - /** @var IRequest|MockObject */ |
|
31 | - protected $request; |
|
32 | - |
|
33 | - /** @var IUserSession|MockObject */ |
|
34 | - protected $userSession; |
|
35 | - |
|
36 | - /** @var ICacheFactory|MockObject */ |
|
37 | - protected $cacheFactory; |
|
38 | - |
|
39 | - /** @var string */ |
|
40 | - protected $serverRoot; |
|
41 | - |
|
42 | - /** @var IAppManager|MockObject */ |
|
43 | - protected IAppManager $appManager; |
|
44 | - |
|
45 | - protected function setUp(): void { |
|
46 | - parent::setUp(); |
|
47 | - |
|
48 | - $this->config = $this->createMock(IConfig::class); |
|
49 | - $this->request = $this->createMock(IRequest::class); |
|
50 | - $this->userSession = $this->createMock(IUserSession::class); |
|
51 | - $this->cacheFactory = $this->createMock(ICacheFactory::class); |
|
52 | - $this->appManager = $this->createMock(IAppManager::class); |
|
53 | - |
|
54 | - $this->serverRoot = \OC::$SERVERROOT; |
|
55 | - |
|
56 | - $this->config |
|
57 | - ->method('getSystemValueBool') |
|
58 | - ->willReturnMap([ |
|
59 | - ['installed', false, true], |
|
60 | - ]); |
|
61 | - } |
|
62 | - |
|
63 | - /** |
|
64 | - * @param string[] $methods |
|
65 | - * @param bool $mockRequestGetHeaderMethod |
|
66 | - * |
|
67 | - * @return Factory|MockObject |
|
68 | - */ |
|
69 | - protected function getFactory(array $methods = [], $mockRequestGetHeaderMethod = false) { |
|
70 | - if ($mockRequestGetHeaderMethod) { |
|
71 | - $this->request->expects(self::any()) |
|
72 | - ->method('getHeader') |
|
73 | - ->willReturn(''); |
|
74 | - } |
|
75 | - |
|
76 | - if (!empty($methods)) { |
|
77 | - return $this->getMockBuilder(Factory::class) |
|
78 | - ->setConstructorArgs([ |
|
79 | - $this->config, |
|
80 | - $this->request, |
|
81 | - $this->userSession, |
|
82 | - $this->cacheFactory, |
|
83 | - $this->serverRoot, |
|
84 | - $this->appManager, |
|
85 | - ]) |
|
86 | - ->onlyMethods($methods) |
|
87 | - ->getMock(); |
|
88 | - } |
|
89 | - |
|
90 | - return new Factory($this->config, $this->request, $this->userSession, $this->cacheFactory, $this->serverRoot, $this->appManager); |
|
91 | - } |
|
92 | - |
|
93 | - public static function dataFindAvailableLanguages(): array { |
|
94 | - return [ |
|
95 | - [null], |
|
96 | - ['files'], |
|
97 | - ]; |
|
98 | - } |
|
99 | - |
|
100 | - public function testFindLanguageWithExistingRequestLanguageAndNoApp(): void { |
|
101 | - $factory = $this->getFactory(['languageExists']); |
|
102 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
103 | - $factory->expects(self::once()) |
|
104 | - ->method('languageExists') |
|
105 | - ->with(null, 'de') |
|
106 | - ->willReturn(true); |
|
107 | - |
|
108 | - self::assertSame('de', $factory->findLanguage()); |
|
109 | - } |
|
110 | - |
|
111 | - public function testFindLanguageWithExistingRequestLanguageAndApp(): void { |
|
112 | - $factory = $this->getFactory(['languageExists']); |
|
113 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
114 | - $factory->expects(self::once()) |
|
115 | - ->method('languageExists') |
|
116 | - ->with('MyApp', 'de') |
|
117 | - ->willReturn(true); |
|
118 | - |
|
119 | - self::assertSame('de', $factory->findLanguage('MyApp')); |
|
120 | - } |
|
121 | - |
|
122 | - public function testFindLanguageWithNotExistingRequestLanguageAndExistingStoredUserLanguage(): void { |
|
123 | - $factory = $this->getFactory(['languageExists']); |
|
124 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
125 | - $factory->expects($this->exactly(2)) |
|
126 | - ->method('languageExists') |
|
127 | - ->willReturnMap([ |
|
128 | - ['MyApp', 'de', false], |
|
129 | - ['MyApp', 'jp', true], |
|
130 | - ]); |
|
131 | - $this->config |
|
132 | - ->expects($this->exactly(1)) |
|
133 | - ->method('getSystemValue') |
|
134 | - ->willReturnMap([ |
|
135 | - ['force_language', false, false], |
|
136 | - ]); |
|
137 | - $user = $this->createMock(IUser::class); |
|
138 | - $user->expects(self::once()) |
|
139 | - ->method('getUID') |
|
140 | - ->willReturn('MyUserUid'); |
|
141 | - $this->userSession |
|
142 | - ->expects(self::exactly(2)) |
|
143 | - ->method('getUser') |
|
144 | - ->willReturn($user); |
|
145 | - $this->config |
|
146 | - ->expects(self::once()) |
|
147 | - ->method('getUserValue') |
|
148 | - ->with('MyUserUid', 'core', 'lang', null) |
|
149 | - ->willReturn('jp'); |
|
150 | - |
|
151 | - self::assertSame('jp', $factory->findLanguage('MyApp')); |
|
152 | - } |
|
153 | - |
|
154 | - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguage(): void { |
|
155 | - $factory = $this->getFactory(['languageExists'], true); |
|
156 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
157 | - $factory->expects($this->exactly(3)) |
|
158 | - ->method('languageExists') |
|
159 | - ->willReturnMap([ |
|
160 | - ['MyApp', 'de', false], |
|
161 | - ['MyApp', 'jp', false], |
|
162 | - ['MyApp', 'es', true], |
|
163 | - ]); |
|
164 | - $this->config |
|
165 | - ->expects($this->exactly(2)) |
|
166 | - ->method('getSystemValue') |
|
167 | - ->willReturnMap([ |
|
168 | - ['force_language', false, false], |
|
169 | - ['default_language', false, 'es'] |
|
170 | - ]); |
|
171 | - $user = $this->createMock(IUser::class); |
|
172 | - $user->expects(self::once()) |
|
173 | - ->method('getUID') |
|
174 | - ->willReturn('MyUserUid'); |
|
175 | - $this->userSession |
|
176 | - ->expects(self::exactly(2)) |
|
177 | - ->method('getUser') |
|
178 | - ->willReturn($user); |
|
179 | - $this->config |
|
180 | - ->expects(self::once()) |
|
181 | - ->method('getUserValue') |
|
182 | - ->with('MyUserUid', 'core', 'lang', null) |
|
183 | - ->willReturn('jp'); |
|
184 | - |
|
185 | - self::assertSame('es', $factory->findLanguage('MyApp')); |
|
186 | - } |
|
187 | - |
|
188 | - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefault(): void { |
|
189 | - $factory = $this->getFactory(['languageExists'], true); |
|
190 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
191 | - $factory->expects($this->exactly(3)) |
|
192 | - ->method('languageExists') |
|
193 | - ->willReturnMap([ |
|
194 | - ['MyApp', 'de', false], |
|
195 | - ['MyApp', 'jp', false], |
|
196 | - ['MyApp', 'es', false], |
|
197 | - ]); |
|
198 | - $this->config |
|
199 | - ->expects($this->exactly(2)) |
|
200 | - ->method('getSystemValue') |
|
201 | - ->willReturnMap([ |
|
202 | - ['force_language', false, false], |
|
203 | - ['default_language', false, 'es'] |
|
204 | - ]); |
|
205 | - $user = $this->createMock(IUser::class); |
|
206 | - $user->expects(self::once()) |
|
207 | - ->method('getUID') |
|
208 | - ->willReturn('MyUserUid'); |
|
209 | - $this->userSession |
|
210 | - ->expects(self::exactly(2)) |
|
211 | - ->method('getUser') |
|
212 | - ->willReturn($user); |
|
213 | - $this->config |
|
214 | - ->expects(self::once()) |
|
215 | - ->method('getUserValue') |
|
216 | - ->with('MyUserUid', 'core', 'lang', null) |
|
217 | - ->willReturn('jp'); |
|
218 | - $this->config |
|
219 | - ->expects(self::never()) |
|
220 | - ->method('setUserValue'); |
|
221 | - |
|
222 | - self::assertSame('en', $factory->findLanguage('MyApp')); |
|
223 | - } |
|
224 | - |
|
225 | - public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefaultAndNoAppInScope(): void { |
|
226 | - $factory = $this->getFactory(['languageExists'], true); |
|
227 | - $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
228 | - $factory->expects($this->exactly(3)) |
|
229 | - ->method('languageExists') |
|
230 | - ->willReturnMap([ |
|
231 | - ['MyApp', 'de', false], |
|
232 | - ['MyApp', 'jp', false], |
|
233 | - ['MyApp', 'es', false], |
|
234 | - ]); |
|
235 | - $this->config |
|
236 | - ->expects($this->exactly(2)) |
|
237 | - ->method('getSystemValue') |
|
238 | - ->willReturnMap([ |
|
239 | - ['force_language', false, false], |
|
240 | - ['default_language', false, 'es'] |
|
241 | - ]); |
|
242 | - $user = $this->createMock(IUser::class); |
|
243 | - $user->expects(self::once()) |
|
244 | - ->method('getUID') |
|
245 | - ->willReturn('MyUserUid'); |
|
246 | - $this->userSession |
|
247 | - ->expects(self::exactly(2)) |
|
248 | - ->method('getUser') |
|
249 | - ->willReturn($user); |
|
250 | - $this->config |
|
251 | - ->expects(self::once()) |
|
252 | - ->method('getUserValue') |
|
253 | - ->with('MyUserUid', 'core', 'lang', null) |
|
254 | - ->willReturn('jp'); |
|
255 | - $this->config |
|
256 | - ->expects(self::never()) |
|
257 | - ->method('setUserValue') |
|
258 | - ->with('MyUserUid', 'core', 'lang', 'en'); |
|
259 | - |
|
260 | - |
|
261 | - self::assertSame('en', $factory->findLanguage('MyApp')); |
|
262 | - } |
|
263 | - |
|
264 | - public function testFindLanguageWithForcedLanguage(): void { |
|
265 | - $factory = $this->getFactory(['languageExists']); |
|
266 | - $this->config |
|
267 | - ->expects($this->once()) |
|
268 | - ->method('getSystemValue') |
|
269 | - ->with('force_language', false) |
|
270 | - ->willReturn('de'); |
|
271 | - |
|
272 | - $factory->expects($this->once()) |
|
273 | - ->method('languageExists') |
|
274 | - ->with('MyApp', 'de') |
|
275 | - ->willReturn(true); |
|
276 | - |
|
277 | - self::assertSame('de', $factory->findLanguage('MyApp')); |
|
278 | - } |
|
279 | - |
|
280 | - /** |
|
281 | - * @dataProvider dataFindAvailableLanguages |
|
282 | - * |
|
283 | - * @param string|null $app |
|
284 | - */ |
|
285 | - public function testFindAvailableLanguages($app): void { |
|
286 | - $factory = $this->getFactory(['findL10nDir']); |
|
287 | - $factory->expects(self::once()) |
|
288 | - ->method('findL10nDir') |
|
289 | - ->with($app) |
|
290 | - ->willReturn(\OC::$SERVERROOT . '/tests/data/l10n/'); |
|
291 | - |
|
292 | - self::assertEqualsCanonicalizing(['cs', 'de', 'en', 'ru'], $factory->findAvailableLanguages($app)); |
|
293 | - } |
|
294 | - |
|
295 | - public static function dataLanguageExists(): array { |
|
296 | - return [ |
|
297 | - [null, 'en', [], true], |
|
298 | - [null, 'de', [], false], |
|
299 | - [null, 'de', ['ru'], false], |
|
300 | - [null, 'de', ['ru', 'de'], true], |
|
301 | - ['files', 'en', [], true], |
|
302 | - ['files', 'de', [], false], |
|
303 | - ['files', 'de', ['ru'], false], |
|
304 | - ['files', 'de', ['de', 'ru'], true], |
|
305 | - ]; |
|
306 | - } |
|
307 | - |
|
308 | - public function testFindAvailableLanguagesWithThemes(): void { |
|
309 | - $this->serverRoot .= '/tests/data'; |
|
310 | - $app = 'files'; |
|
311 | - |
|
312 | - $factory = $this->getFactory(['findL10nDir']); |
|
313 | - $factory->expects(self::once()) |
|
314 | - ->method('findL10nDir') |
|
315 | - ->with($app) |
|
316 | - ->willReturn($this->serverRoot . '/apps/files/l10n/'); |
|
317 | - $this->config |
|
318 | - ->expects(self::once()) |
|
319 | - ->method('getSystemValueString') |
|
320 | - ->with('theme') |
|
321 | - ->willReturn('abc'); |
|
322 | - |
|
323 | - self::assertEqualsCanonicalizing(['en', 'zz'], $factory->findAvailableLanguages($app)); |
|
324 | - } |
|
325 | - |
|
326 | - /** |
|
327 | - * @dataProvider dataLanguageExists |
|
328 | - * |
|
329 | - * @param string|null $app |
|
330 | - * @param string $lang |
|
331 | - * @param string[] $availableLanguages |
|
332 | - * @param string $expected |
|
333 | - */ |
|
334 | - public function testLanguageExists($app, $lang, array $availableLanguages, $expected): void { |
|
335 | - $factory = $this->getFactory(['findAvailableLanguages']); |
|
336 | - $factory->expects(($lang === 'en') ? self::never() : self::once()) |
|
337 | - ->method('findAvailableLanguages') |
|
338 | - ->with($app) |
|
339 | - ->willReturn($availableLanguages); |
|
340 | - |
|
341 | - self::assertSame($expected, $factory->languageExists($app, $lang)); |
|
342 | - } |
|
343 | - |
|
344 | - public static function dataSetLanguageFromRequest(): array { |
|
345 | - return [ |
|
346 | - // Language is available |
|
347 | - [null, 'de', ['de'], 'de'], |
|
348 | - [null, 'de,en', ['de'], 'de'], |
|
349 | - [null, 'de-DE,en-US;q=0.8,en;q=0.6', ['de'], 'de'], |
|
350 | - // Language is not available |
|
351 | - [null, 'de', ['ru'], new LanguageNotFoundException()], |
|
352 | - [null, 'de,en', ['ru', 'en'], 'en'], |
|
353 | - [null, 'de-DE,en-US;q=0.8,en;q=0.6', ['ru', 'en'], 'en'], |
|
354 | - |
|
355 | - // Language for app |
|
356 | - ['files_pdfviewer', 'de', ['de'], 'de'], |
|
357 | - ['files_pdfviewer', 'de,en', ['de'], 'de'], |
|
358 | - ['files_pdfviewer', 'de-DE,en-US;q=0.8,en;q=0.6', ['de'], 'de'], |
|
359 | - // Language for app is not available |
|
360 | - ['files_pdfviewer', 'de', ['ru'], new LanguageNotFoundException()], |
|
361 | - ['files_pdfviewer', 'de,en', ['ru', 'en'], 'en'], |
|
362 | - ['files_pdfviewer', 'de-DE,en-US;q=0.8,en;q=0.6', ['ru', 'en'], 'en'], |
|
363 | - ]; |
|
364 | - } |
|
365 | - |
|
366 | - /** |
|
367 | - * @dataProvider dataSetLanguageFromRequest |
|
368 | - * |
|
369 | - * @param string|null $app |
|
370 | - * @param string $header |
|
371 | - * @param string[] $availableLanguages |
|
372 | - * @param string $expected |
|
373 | - */ |
|
374 | - public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected): void { |
|
375 | - $factory = $this->getFactory(['findAvailableLanguages', 'respectDefaultLanguage']); |
|
376 | - $factory->expects(self::once()) |
|
377 | - ->method('findAvailableLanguages') |
|
378 | - ->with($app) |
|
379 | - ->willReturn($availableLanguages); |
|
380 | - |
|
381 | - $factory->expects(self::any()) |
|
382 | - ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
383 | - return $lang; |
|
384 | - }); |
|
385 | - |
|
386 | - $this->request->expects(self::once()) |
|
387 | - ->method('getHeader') |
|
388 | - ->with('ACCEPT_LANGUAGE') |
|
389 | - ->willReturn($header); |
|
390 | - |
|
391 | - if ($expected instanceof LanguageNotFoundException) { |
|
392 | - $this->expectException(LanguageNotFoundException::class); |
|
393 | - self::invokePrivate($factory, 'getLanguageFromRequest', [$app]); |
|
394 | - } else { |
|
395 | - self::assertSame($expected, self::invokePrivate($factory, 'getLanguageFromRequest', [$app]), 'Asserting returned language'); |
|
396 | - } |
|
397 | - } |
|
398 | - |
|
399 | - public static function dataGetL10nFilesForApp(): array { |
|
400 | - return [ |
|
401 | - ['', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
402 | - ['core', 'ru', [\OC::$SERVERROOT . '/core/l10n/ru.json']], |
|
403 | - ['lib', 'ru', [\OC::$SERVERROOT . '/lib/l10n/ru.json']], |
|
404 | - ['settings', 'de', [\OC::$SERVERROOT . '/apps/settings/l10n/de.json']], |
|
405 | - ['files', 'de', [\OC::$SERVERROOT . '/apps/files/l10n/de.json']], |
|
406 | - ['files', '_lang_never_exists_', []], |
|
407 | - ['_app_never_exists_', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
408 | - ]; |
|
409 | - } |
|
410 | - |
|
411 | - /** |
|
412 | - * @dataProvider dataGetL10nFilesForApp |
|
413 | - * |
|
414 | - * @param string $app |
|
415 | - * @param string $expected |
|
416 | - */ |
|
417 | - public function testGetL10nFilesForApp($app, $lang, $expected): void { |
|
418 | - $factory = $this->getFactory(); |
|
419 | - if (in_array($app, ['settings','files'])) { |
|
420 | - $this->appManager |
|
421 | - ->method('getAppPath') |
|
422 | - ->with($app) |
|
423 | - ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
424 | - } else { |
|
425 | - $this->appManager |
|
426 | - ->method('getAppPath') |
|
427 | - ->with($app) |
|
428 | - ->willThrowException(new AppPathNotFoundException()); |
|
429 | - } |
|
430 | - self::assertSame($expected, $this->invokePrivate($factory, 'getL10nFilesForApp', [$app, $lang])); |
|
431 | - } |
|
432 | - |
|
433 | - public static function dataFindL10NDir(): array { |
|
434 | - return [ |
|
435 | - ['', \OC::$SERVERROOT . '/core/l10n/'], |
|
436 | - ['core', \OC::$SERVERROOT . '/core/l10n/'], |
|
437 | - ['lib', \OC::$SERVERROOT . '/lib/l10n/'], |
|
438 | - ['settings', \OC::$SERVERROOT . '/apps/settings/l10n/'], |
|
439 | - ['files', \OC::$SERVERROOT . '/apps/files/l10n/'], |
|
440 | - ['_app_never_exists_', \OC::$SERVERROOT . '/core/l10n/'], |
|
441 | - ]; |
|
442 | - } |
|
443 | - |
|
444 | - /** |
|
445 | - * @dataProvider dataFindL10NDir |
|
446 | - * |
|
447 | - * @param string $app |
|
448 | - * @param string $expected |
|
449 | - */ |
|
450 | - public function testFindL10NDir($app, $expected): void { |
|
451 | - $factory = $this->getFactory(); |
|
452 | - if (in_array($app, ['settings','files'])) { |
|
453 | - $this->appManager |
|
454 | - ->method('getAppPath') |
|
455 | - ->with($app) |
|
456 | - ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
457 | - } else { |
|
458 | - $this->appManager |
|
459 | - ->method('getAppPath') |
|
460 | - ->with($app) |
|
461 | - ->willThrowException(new AppPathNotFoundException()); |
|
462 | - } |
|
463 | - self::assertSame($expected, $this->invokePrivate($factory, 'findL10nDir', [$app])); |
|
464 | - } |
|
465 | - |
|
466 | - public static function dataFindLanguage(): array { |
|
467 | - return [ |
|
468 | - // Not logged in |
|
469 | - [false, [], 'en'], |
|
470 | - [false, ['fr'], 'fr'], |
|
471 | - [false, ['de', 'fr'], 'de'], |
|
472 | - [false, ['nl', 'de', 'fr'], 'de'], |
|
473 | - |
|
474 | - [true, [], 'en'], |
|
475 | - [true, ['fr'], 'fr'], |
|
476 | - [true, ['de', 'fr'], 'de'], |
|
477 | - [true, ['nl', 'de', 'fr'], 'nl'], |
|
478 | - ]; |
|
479 | - } |
|
480 | - |
|
481 | - /** |
|
482 | - * @dataProvider dataFindLanguage |
|
483 | - * |
|
484 | - * @param bool $loggedIn |
|
485 | - * @param array $availableLang |
|
486 | - * @param string $expected |
|
487 | - */ |
|
488 | - public function testFindLanguage($loggedIn, $availableLang, $expected): void { |
|
489 | - $userLang = 'nl'; |
|
490 | - $browserLang = 'de'; |
|
491 | - $defaultLang = 'fr'; |
|
492 | - |
|
493 | - $this->config->expects(self::any()) |
|
494 | - ->method('getSystemValue') |
|
495 | - ->willReturnCallback(function ($var, $default) use ($defaultLang) { |
|
496 | - if ($var === 'default_language') { |
|
497 | - return $defaultLang; |
|
498 | - } else { |
|
499 | - return $default; |
|
500 | - } |
|
501 | - }); |
|
502 | - |
|
503 | - if ($loggedIn) { |
|
504 | - $user = $this->createMock(IUser::class); |
|
505 | - $user->expects(self::any()) |
|
506 | - ->method('getUID') |
|
507 | - ->willReturn('MyUserUid'); |
|
508 | - $this->userSession |
|
509 | - ->expects(self::any()) |
|
510 | - ->method('getUser') |
|
511 | - ->willReturn($user); |
|
512 | - $this->config->expects(self::any()) |
|
513 | - ->method('getUserValue') |
|
514 | - ->with('MyUserUid', 'core', 'lang', null) |
|
515 | - ->willReturn($userLang); |
|
516 | - } else { |
|
517 | - $this->userSession |
|
518 | - ->expects(self::any()) |
|
519 | - ->method('getUser') |
|
520 | - ->willReturn(null); |
|
521 | - } |
|
522 | - |
|
523 | - $this->request->expects(self::any()) |
|
524 | - ->method('getHeader') |
|
525 | - ->with($this->equalTo('ACCEPT_LANGUAGE')) |
|
526 | - ->willReturn($browserLang); |
|
527 | - |
|
528 | - $factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']); |
|
529 | - $factory->expects(self::any()) |
|
530 | - ->method('languageExists') |
|
531 | - ->willReturnCallback(function ($app, $lang) use ($availableLang) { |
|
532 | - return in_array($lang, $availableLang); |
|
533 | - }); |
|
534 | - $factory->expects(self::any()) |
|
535 | - ->method('findAvailableLanguages') |
|
536 | - ->willReturnCallback(function ($app) use ($availableLang) { |
|
537 | - return $availableLang; |
|
538 | - }); |
|
539 | - $factory->expects(self::any()) |
|
540 | - ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
541 | - return $lang; |
|
542 | - }); |
|
543 | - |
|
544 | - $lang = $factory->findLanguage(); |
|
545 | - |
|
546 | - self::assertSame($expected, $lang); |
|
547 | - } |
|
548 | - |
|
549 | - public function testFindGenericLanguageByEnforcedLanguage(): void { |
|
550 | - $factory = $this->getFactory(); |
|
551 | - $this->config->expects(self::once()) |
|
552 | - ->method('getSystemValue') |
|
553 | - ->with('force_language', false) |
|
554 | - ->willReturn('cz'); |
|
555 | - |
|
556 | - $lang = $factory->findGenericLanguage(); |
|
557 | - |
|
558 | - self::assertSame('cz', $lang); |
|
559 | - } |
|
560 | - |
|
561 | - public function testFindGenericLanguageByDefaultLanguage(): void { |
|
562 | - $factory = $this->getFactory(['languageExists']); |
|
563 | - $this->config->expects(self::exactly(2)) |
|
564 | - ->method('getSystemValue') |
|
565 | - ->willReturnMap([ |
|
566 | - ['force_language', false, false,], |
|
567 | - ['default_language', false, 'cz',], |
|
568 | - ]); |
|
569 | - $factory->expects(self::once()) |
|
570 | - ->method('languageExists') |
|
571 | - ->with(null, 'cz') |
|
572 | - ->willReturn(true); |
|
573 | - |
|
574 | - $lang = $factory->findGenericLanguage(); |
|
575 | - |
|
576 | - self::assertSame('cz', $lang); |
|
577 | - } |
|
578 | - |
|
579 | - public function testFindGenericLanguageByUserLanguage(): void { |
|
580 | - $factory = $this->getFactory(); |
|
581 | - $this->config->expects(self::exactly(2)) |
|
582 | - ->method('getSystemValue') |
|
583 | - ->willReturnMap([ |
|
584 | - ['force_language', false, false,], |
|
585 | - ['default_language', false, false,], |
|
586 | - ]); |
|
587 | - $user = $this->createMock(IUser::class); |
|
588 | - $this->userSession->expects(self::once()) |
|
589 | - ->method('getUser') |
|
590 | - ->willReturn($user); |
|
591 | - $user->method('getUID')->willReturn('user123'); |
|
592 | - $this->config->expects(self::once()) |
|
593 | - ->method('getUserValue') |
|
594 | - ->with('user123', 'core', 'lang', null) |
|
595 | - ->willReturn('cz'); |
|
596 | - |
|
597 | - $lang = $factory->findGenericLanguage(); |
|
598 | - |
|
599 | - self::assertSame('cz', $lang); |
|
600 | - } |
|
601 | - |
|
602 | - public function testFindGenericLanguageByRequestLanguage(): void { |
|
603 | - $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
604 | - $this->config->method('getSystemValue') |
|
605 | - ->willReturnMap([ |
|
606 | - ['force_language', false, false,], |
|
607 | - ['default_language', false, false,], |
|
608 | - ]); |
|
609 | - $user = $this->createMock(IUser::class); |
|
610 | - $this->userSession->expects(self::once()) |
|
611 | - ->method('getUser') |
|
612 | - ->willReturn($user); |
|
613 | - $user->method('getUID')->willReturn('user123'); |
|
614 | - $this->config->expects(self::once()) |
|
615 | - ->method('getUserValue') |
|
616 | - ->with('user123', 'core', 'lang', null) |
|
617 | - ->willReturn(null); |
|
618 | - $this->request->expects(self::once()) |
|
619 | - ->method('getHeader') |
|
620 | - ->with('ACCEPT_LANGUAGE') |
|
621 | - ->willReturn('cz'); |
|
622 | - $factory->expects(self::once()) |
|
623 | - ->method('findAvailableLanguages') |
|
624 | - ->with(null) |
|
625 | - ->willReturn(['cz']); |
|
626 | - |
|
627 | - $lang = $factory->findGenericLanguage(); |
|
628 | - |
|
629 | - self::assertSame('cz', $lang); |
|
630 | - } |
|
631 | - |
|
632 | - public function testFindGenericLanguageFallback(): void { |
|
633 | - $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
634 | - $this->config->method('getSystemValue') |
|
635 | - ->willReturnMap([ |
|
636 | - ['force_language', false, false,], |
|
637 | - ['default_language', false, false,], |
|
638 | - ]); |
|
639 | - $user = $this->createMock(IUser::class); |
|
640 | - $this->userSession->expects(self::once()) |
|
641 | - ->method('getUser') |
|
642 | - ->willReturn($user); |
|
643 | - $user->method('getUID')->willReturn('user123'); |
|
644 | - $this->config->expects(self::once()) |
|
645 | - ->method('getUserValue') |
|
646 | - ->with('user123', 'core', 'lang', null) |
|
647 | - ->willReturn(null); |
|
648 | - $this->request->expects(self::once()) |
|
649 | - ->method('getHeader') |
|
650 | - ->with('ACCEPT_LANGUAGE') |
|
651 | - ->willReturn(''); |
|
652 | - $factory->expects(self::never()) |
|
653 | - ->method('findAvailableLanguages'); |
|
654 | - $factory->expects(self::never()) |
|
655 | - ->method('languageExists'); |
|
656 | - |
|
657 | - $lang = $factory->findGenericLanguage(); |
|
658 | - |
|
659 | - self::assertSame('en', $lang); |
|
660 | - } |
|
661 | - |
|
662 | - public static function dataTestRespectDefaultLanguage(): array { |
|
663 | - return [ |
|
664 | - ['de', 'de_DE', true, 'de_DE'], |
|
665 | - ['de', 'de', true, 'de'], |
|
666 | - ['de', false, true, 'de'], |
|
667 | - ['fr', 'de_DE', true, 'fr'], |
|
668 | - ]; |
|
669 | - } |
|
670 | - |
|
671 | - /** |
|
672 | - * test if we respect default language if possible |
|
673 | - * |
|
674 | - * @dataProvider dataTestRespectDefaultLanguage |
|
675 | - * |
|
676 | - * @param string $lang |
|
677 | - * @param string $defaultLanguage |
|
678 | - * @param bool $langExists |
|
679 | - * @param string $expected |
|
680 | - */ |
|
681 | - public function testRespectDefaultLanguage($lang, $defaultLanguage, $langExists, $expected): void { |
|
682 | - $factory = $this->getFactory(['languageExists']); |
|
683 | - $factory->expects(self::any()) |
|
684 | - ->method('languageExists')->willReturn($langExists); |
|
685 | - $this->config->expects(self::any()) |
|
686 | - ->method('getSystemValue')->with('default_language', false)->willReturn($defaultLanguage); |
|
687 | - |
|
688 | - $result = $this->invokePrivate($factory, 'respectDefaultLanguage', ['app', $lang]); |
|
689 | - self::assertSame($expected, $result); |
|
690 | - } |
|
691 | - |
|
692 | - public static function dataTestReduceToLanguages(): array { |
|
693 | - return [ |
|
694 | - ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'fr', 'de'], ['en', 'fr', 'de']], |
|
695 | - ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'de'], ['en', 'de']], |
|
696 | - ['en', ['en', 'de', 'fr', 'it', 'es'], [], ['de', 'en', 'es', 'fr', 'it']], |
|
697 | - ]; |
|
698 | - } |
|
699 | - |
|
700 | - /** |
|
701 | - * test |
|
702 | - * - if available languages set can be reduced by configuration |
|
703 | - * - if available languages set is not reduced to an empty set if |
|
704 | - * the reduce config is an empty set |
|
705 | - * |
|
706 | - * @dataProvider dataTestReduceToLanguages |
|
707 | - * |
|
708 | - * @param string $lang |
|
709 | - * @param array $availableLanguages |
|
710 | - * @param array $reducedLanguageSet |
|
711 | - * @param array $expected |
|
712 | - */ |
|
713 | - public function testReduceLanguagesByConfiguration(string $lang, array $availableLanguages, array $reducedLanguageSet, array $expected): void { |
|
714 | - $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
715 | - $factory->expects(self::any()) |
|
716 | - ->method('languageExists')->willReturn(true); |
|
717 | - $factory->expects(self::any()) |
|
718 | - ->method('findAvailableLanguages') |
|
719 | - ->willReturnCallback(function ($app) use ($availableLanguages) { |
|
720 | - return $availableLanguages; |
|
721 | - }); |
|
722 | - |
|
723 | - $this->config |
|
724 | - ->method('getSystemValue') |
|
725 | - ->willReturnMap([ |
|
726 | - ['force_language', false, false], |
|
727 | - ['default_language', false, $lang], |
|
728 | - ['reduce_to_languages', [], $reducedLanguageSet] |
|
729 | - ]); |
|
730 | - |
|
731 | - $result = $this->invokePrivate($factory, 'getLanguages'); |
|
732 | - $commonLanguagesCodes = array_map(function ($lang) { |
|
733 | - return $lang['code']; |
|
734 | - }, $result['commonLanguages']); |
|
735 | - |
|
736 | - self::assertEqualsCanonicalizing($expected, $commonLanguagesCodes); |
|
737 | - } |
|
738 | - |
|
739 | - public static function languageIteratorRequestProvider(): array { |
|
740 | - return [ |
|
741 | - [ true, true], |
|
742 | - [ false, true], |
|
743 | - [ false, false], |
|
744 | - ]; |
|
745 | - } |
|
746 | - |
|
747 | - /** |
|
748 | - * @dataProvider languageIteratorRequestProvider |
|
749 | - */ |
|
750 | - public function testGetLanguageIterator(bool $hasSession, bool $mockUser): void { |
|
751 | - $factory = $this->getFactory(); |
|
752 | - $user = null; |
|
753 | - |
|
754 | - if (!$mockUser) { |
|
755 | - $matcher = $this->userSession->expects(self::once()) |
|
756 | - ->method('getUser'); |
|
757 | - |
|
758 | - if ($hasSession) { |
|
759 | - $matcher->willReturn($this->createMock(IUser::class)); |
|
760 | - } else { |
|
761 | - $this->expectException(\RuntimeException::class); |
|
762 | - } |
|
763 | - } else { |
|
764 | - $user = $this->createMock(IUser::class); |
|
765 | - } |
|
766 | - |
|
767 | - $iterator = $factory->getLanguageIterator($user); |
|
768 | - self::assertInstanceOf(ILanguageIterator::class, $iterator); |
|
769 | - } |
|
770 | - |
|
771 | - public static function dataGetLanguageDirection(): array { |
|
772 | - return [ |
|
773 | - ['en', 'ltr'], |
|
774 | - ['de', 'ltr'], |
|
775 | - ['fa', 'rtl'], |
|
776 | - ['ar', 'rtl'] |
|
777 | - ]; |
|
778 | - } |
|
779 | - |
|
780 | - /** |
|
781 | - * @dataProvider dataGetLanguageDirection |
|
782 | - */ |
|
783 | - public function testGetLanguageDirection(string $language, string $expectedDirection) { |
|
784 | - $factory = $this->getFactory(); |
|
785 | - |
|
786 | - self::assertEquals($expectedDirection, $factory->getLanguageDirection($language)); |
|
787 | - } |
|
27 | + /** @var IConfig|MockObject */ |
|
28 | + protected $config; |
|
29 | + |
|
30 | + /** @var IRequest|MockObject */ |
|
31 | + protected $request; |
|
32 | + |
|
33 | + /** @var IUserSession|MockObject */ |
|
34 | + protected $userSession; |
|
35 | + |
|
36 | + /** @var ICacheFactory|MockObject */ |
|
37 | + protected $cacheFactory; |
|
38 | + |
|
39 | + /** @var string */ |
|
40 | + protected $serverRoot; |
|
41 | + |
|
42 | + /** @var IAppManager|MockObject */ |
|
43 | + protected IAppManager $appManager; |
|
44 | + |
|
45 | + protected function setUp(): void { |
|
46 | + parent::setUp(); |
|
47 | + |
|
48 | + $this->config = $this->createMock(IConfig::class); |
|
49 | + $this->request = $this->createMock(IRequest::class); |
|
50 | + $this->userSession = $this->createMock(IUserSession::class); |
|
51 | + $this->cacheFactory = $this->createMock(ICacheFactory::class); |
|
52 | + $this->appManager = $this->createMock(IAppManager::class); |
|
53 | + |
|
54 | + $this->serverRoot = \OC::$SERVERROOT; |
|
55 | + |
|
56 | + $this->config |
|
57 | + ->method('getSystemValueBool') |
|
58 | + ->willReturnMap([ |
|
59 | + ['installed', false, true], |
|
60 | + ]); |
|
61 | + } |
|
62 | + |
|
63 | + /** |
|
64 | + * @param string[] $methods |
|
65 | + * @param bool $mockRequestGetHeaderMethod |
|
66 | + * |
|
67 | + * @return Factory|MockObject |
|
68 | + */ |
|
69 | + protected function getFactory(array $methods = [], $mockRequestGetHeaderMethod = false) { |
|
70 | + if ($mockRequestGetHeaderMethod) { |
|
71 | + $this->request->expects(self::any()) |
|
72 | + ->method('getHeader') |
|
73 | + ->willReturn(''); |
|
74 | + } |
|
75 | + |
|
76 | + if (!empty($methods)) { |
|
77 | + return $this->getMockBuilder(Factory::class) |
|
78 | + ->setConstructorArgs([ |
|
79 | + $this->config, |
|
80 | + $this->request, |
|
81 | + $this->userSession, |
|
82 | + $this->cacheFactory, |
|
83 | + $this->serverRoot, |
|
84 | + $this->appManager, |
|
85 | + ]) |
|
86 | + ->onlyMethods($methods) |
|
87 | + ->getMock(); |
|
88 | + } |
|
89 | + |
|
90 | + return new Factory($this->config, $this->request, $this->userSession, $this->cacheFactory, $this->serverRoot, $this->appManager); |
|
91 | + } |
|
92 | + |
|
93 | + public static function dataFindAvailableLanguages(): array { |
|
94 | + return [ |
|
95 | + [null], |
|
96 | + ['files'], |
|
97 | + ]; |
|
98 | + } |
|
99 | + |
|
100 | + public function testFindLanguageWithExistingRequestLanguageAndNoApp(): void { |
|
101 | + $factory = $this->getFactory(['languageExists']); |
|
102 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
103 | + $factory->expects(self::once()) |
|
104 | + ->method('languageExists') |
|
105 | + ->with(null, 'de') |
|
106 | + ->willReturn(true); |
|
107 | + |
|
108 | + self::assertSame('de', $factory->findLanguage()); |
|
109 | + } |
|
110 | + |
|
111 | + public function testFindLanguageWithExistingRequestLanguageAndApp(): void { |
|
112 | + $factory = $this->getFactory(['languageExists']); |
|
113 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
114 | + $factory->expects(self::once()) |
|
115 | + ->method('languageExists') |
|
116 | + ->with('MyApp', 'de') |
|
117 | + ->willReturn(true); |
|
118 | + |
|
119 | + self::assertSame('de', $factory->findLanguage('MyApp')); |
|
120 | + } |
|
121 | + |
|
122 | + public function testFindLanguageWithNotExistingRequestLanguageAndExistingStoredUserLanguage(): void { |
|
123 | + $factory = $this->getFactory(['languageExists']); |
|
124 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
125 | + $factory->expects($this->exactly(2)) |
|
126 | + ->method('languageExists') |
|
127 | + ->willReturnMap([ |
|
128 | + ['MyApp', 'de', false], |
|
129 | + ['MyApp', 'jp', true], |
|
130 | + ]); |
|
131 | + $this->config |
|
132 | + ->expects($this->exactly(1)) |
|
133 | + ->method('getSystemValue') |
|
134 | + ->willReturnMap([ |
|
135 | + ['force_language', false, false], |
|
136 | + ]); |
|
137 | + $user = $this->createMock(IUser::class); |
|
138 | + $user->expects(self::once()) |
|
139 | + ->method('getUID') |
|
140 | + ->willReturn('MyUserUid'); |
|
141 | + $this->userSession |
|
142 | + ->expects(self::exactly(2)) |
|
143 | + ->method('getUser') |
|
144 | + ->willReturn($user); |
|
145 | + $this->config |
|
146 | + ->expects(self::once()) |
|
147 | + ->method('getUserValue') |
|
148 | + ->with('MyUserUid', 'core', 'lang', null) |
|
149 | + ->willReturn('jp'); |
|
150 | + |
|
151 | + self::assertSame('jp', $factory->findLanguage('MyApp')); |
|
152 | + } |
|
153 | + |
|
154 | + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguage(): void { |
|
155 | + $factory = $this->getFactory(['languageExists'], true); |
|
156 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
157 | + $factory->expects($this->exactly(3)) |
|
158 | + ->method('languageExists') |
|
159 | + ->willReturnMap([ |
|
160 | + ['MyApp', 'de', false], |
|
161 | + ['MyApp', 'jp', false], |
|
162 | + ['MyApp', 'es', true], |
|
163 | + ]); |
|
164 | + $this->config |
|
165 | + ->expects($this->exactly(2)) |
|
166 | + ->method('getSystemValue') |
|
167 | + ->willReturnMap([ |
|
168 | + ['force_language', false, false], |
|
169 | + ['default_language', false, 'es'] |
|
170 | + ]); |
|
171 | + $user = $this->createMock(IUser::class); |
|
172 | + $user->expects(self::once()) |
|
173 | + ->method('getUID') |
|
174 | + ->willReturn('MyUserUid'); |
|
175 | + $this->userSession |
|
176 | + ->expects(self::exactly(2)) |
|
177 | + ->method('getUser') |
|
178 | + ->willReturn($user); |
|
179 | + $this->config |
|
180 | + ->expects(self::once()) |
|
181 | + ->method('getUserValue') |
|
182 | + ->with('MyUserUid', 'core', 'lang', null) |
|
183 | + ->willReturn('jp'); |
|
184 | + |
|
185 | + self::assertSame('es', $factory->findLanguage('MyApp')); |
|
186 | + } |
|
187 | + |
|
188 | + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefault(): void { |
|
189 | + $factory = $this->getFactory(['languageExists'], true); |
|
190 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
191 | + $factory->expects($this->exactly(3)) |
|
192 | + ->method('languageExists') |
|
193 | + ->willReturnMap([ |
|
194 | + ['MyApp', 'de', false], |
|
195 | + ['MyApp', 'jp', false], |
|
196 | + ['MyApp', 'es', false], |
|
197 | + ]); |
|
198 | + $this->config |
|
199 | + ->expects($this->exactly(2)) |
|
200 | + ->method('getSystemValue') |
|
201 | + ->willReturnMap([ |
|
202 | + ['force_language', false, false], |
|
203 | + ['default_language', false, 'es'] |
|
204 | + ]); |
|
205 | + $user = $this->createMock(IUser::class); |
|
206 | + $user->expects(self::once()) |
|
207 | + ->method('getUID') |
|
208 | + ->willReturn('MyUserUid'); |
|
209 | + $this->userSession |
|
210 | + ->expects(self::exactly(2)) |
|
211 | + ->method('getUser') |
|
212 | + ->willReturn($user); |
|
213 | + $this->config |
|
214 | + ->expects(self::once()) |
|
215 | + ->method('getUserValue') |
|
216 | + ->with('MyUserUid', 'core', 'lang', null) |
|
217 | + ->willReturn('jp'); |
|
218 | + $this->config |
|
219 | + ->expects(self::never()) |
|
220 | + ->method('setUserValue'); |
|
221 | + |
|
222 | + self::assertSame('en', $factory->findLanguage('MyApp')); |
|
223 | + } |
|
224 | + |
|
225 | + public function testFindLanguageWithNotExistingRequestLanguageAndNotExistingStoredUserLanguageAndNotExistingDefaultAndNoAppInScope(): void { |
|
226 | + $factory = $this->getFactory(['languageExists'], true); |
|
227 | + $this->invokePrivate($factory, 'requestLanguage', ['de']); |
|
228 | + $factory->expects($this->exactly(3)) |
|
229 | + ->method('languageExists') |
|
230 | + ->willReturnMap([ |
|
231 | + ['MyApp', 'de', false], |
|
232 | + ['MyApp', 'jp', false], |
|
233 | + ['MyApp', 'es', false], |
|
234 | + ]); |
|
235 | + $this->config |
|
236 | + ->expects($this->exactly(2)) |
|
237 | + ->method('getSystemValue') |
|
238 | + ->willReturnMap([ |
|
239 | + ['force_language', false, false], |
|
240 | + ['default_language', false, 'es'] |
|
241 | + ]); |
|
242 | + $user = $this->createMock(IUser::class); |
|
243 | + $user->expects(self::once()) |
|
244 | + ->method('getUID') |
|
245 | + ->willReturn('MyUserUid'); |
|
246 | + $this->userSession |
|
247 | + ->expects(self::exactly(2)) |
|
248 | + ->method('getUser') |
|
249 | + ->willReturn($user); |
|
250 | + $this->config |
|
251 | + ->expects(self::once()) |
|
252 | + ->method('getUserValue') |
|
253 | + ->with('MyUserUid', 'core', 'lang', null) |
|
254 | + ->willReturn('jp'); |
|
255 | + $this->config |
|
256 | + ->expects(self::never()) |
|
257 | + ->method('setUserValue') |
|
258 | + ->with('MyUserUid', 'core', 'lang', 'en'); |
|
259 | + |
|
260 | + |
|
261 | + self::assertSame('en', $factory->findLanguage('MyApp')); |
|
262 | + } |
|
263 | + |
|
264 | + public function testFindLanguageWithForcedLanguage(): void { |
|
265 | + $factory = $this->getFactory(['languageExists']); |
|
266 | + $this->config |
|
267 | + ->expects($this->once()) |
|
268 | + ->method('getSystemValue') |
|
269 | + ->with('force_language', false) |
|
270 | + ->willReturn('de'); |
|
271 | + |
|
272 | + $factory->expects($this->once()) |
|
273 | + ->method('languageExists') |
|
274 | + ->with('MyApp', 'de') |
|
275 | + ->willReturn(true); |
|
276 | + |
|
277 | + self::assertSame('de', $factory->findLanguage('MyApp')); |
|
278 | + } |
|
279 | + |
|
280 | + /** |
|
281 | + * @dataProvider dataFindAvailableLanguages |
|
282 | + * |
|
283 | + * @param string|null $app |
|
284 | + */ |
|
285 | + public function testFindAvailableLanguages($app): void { |
|
286 | + $factory = $this->getFactory(['findL10nDir']); |
|
287 | + $factory->expects(self::once()) |
|
288 | + ->method('findL10nDir') |
|
289 | + ->with($app) |
|
290 | + ->willReturn(\OC::$SERVERROOT . '/tests/data/l10n/'); |
|
291 | + |
|
292 | + self::assertEqualsCanonicalizing(['cs', 'de', 'en', 'ru'], $factory->findAvailableLanguages($app)); |
|
293 | + } |
|
294 | + |
|
295 | + public static function dataLanguageExists(): array { |
|
296 | + return [ |
|
297 | + [null, 'en', [], true], |
|
298 | + [null, 'de', [], false], |
|
299 | + [null, 'de', ['ru'], false], |
|
300 | + [null, 'de', ['ru', 'de'], true], |
|
301 | + ['files', 'en', [], true], |
|
302 | + ['files', 'de', [], false], |
|
303 | + ['files', 'de', ['ru'], false], |
|
304 | + ['files', 'de', ['de', 'ru'], true], |
|
305 | + ]; |
|
306 | + } |
|
307 | + |
|
308 | + public function testFindAvailableLanguagesWithThemes(): void { |
|
309 | + $this->serverRoot .= '/tests/data'; |
|
310 | + $app = 'files'; |
|
311 | + |
|
312 | + $factory = $this->getFactory(['findL10nDir']); |
|
313 | + $factory->expects(self::once()) |
|
314 | + ->method('findL10nDir') |
|
315 | + ->with($app) |
|
316 | + ->willReturn($this->serverRoot . '/apps/files/l10n/'); |
|
317 | + $this->config |
|
318 | + ->expects(self::once()) |
|
319 | + ->method('getSystemValueString') |
|
320 | + ->with('theme') |
|
321 | + ->willReturn('abc'); |
|
322 | + |
|
323 | + self::assertEqualsCanonicalizing(['en', 'zz'], $factory->findAvailableLanguages($app)); |
|
324 | + } |
|
325 | + |
|
326 | + /** |
|
327 | + * @dataProvider dataLanguageExists |
|
328 | + * |
|
329 | + * @param string|null $app |
|
330 | + * @param string $lang |
|
331 | + * @param string[] $availableLanguages |
|
332 | + * @param string $expected |
|
333 | + */ |
|
334 | + public function testLanguageExists($app, $lang, array $availableLanguages, $expected): void { |
|
335 | + $factory = $this->getFactory(['findAvailableLanguages']); |
|
336 | + $factory->expects(($lang === 'en') ? self::never() : self::once()) |
|
337 | + ->method('findAvailableLanguages') |
|
338 | + ->with($app) |
|
339 | + ->willReturn($availableLanguages); |
|
340 | + |
|
341 | + self::assertSame($expected, $factory->languageExists($app, $lang)); |
|
342 | + } |
|
343 | + |
|
344 | + public static function dataSetLanguageFromRequest(): array { |
|
345 | + return [ |
|
346 | + // Language is available |
|
347 | + [null, 'de', ['de'], 'de'], |
|
348 | + [null, 'de,en', ['de'], 'de'], |
|
349 | + [null, 'de-DE,en-US;q=0.8,en;q=0.6', ['de'], 'de'], |
|
350 | + // Language is not available |
|
351 | + [null, 'de', ['ru'], new LanguageNotFoundException()], |
|
352 | + [null, 'de,en', ['ru', 'en'], 'en'], |
|
353 | + [null, 'de-DE,en-US;q=0.8,en;q=0.6', ['ru', 'en'], 'en'], |
|
354 | + |
|
355 | + // Language for app |
|
356 | + ['files_pdfviewer', 'de', ['de'], 'de'], |
|
357 | + ['files_pdfviewer', 'de,en', ['de'], 'de'], |
|
358 | + ['files_pdfviewer', 'de-DE,en-US;q=0.8,en;q=0.6', ['de'], 'de'], |
|
359 | + // Language for app is not available |
|
360 | + ['files_pdfviewer', 'de', ['ru'], new LanguageNotFoundException()], |
|
361 | + ['files_pdfviewer', 'de,en', ['ru', 'en'], 'en'], |
|
362 | + ['files_pdfviewer', 'de-DE,en-US;q=0.8,en;q=0.6', ['ru', 'en'], 'en'], |
|
363 | + ]; |
|
364 | + } |
|
365 | + |
|
366 | + /** |
|
367 | + * @dataProvider dataSetLanguageFromRequest |
|
368 | + * |
|
369 | + * @param string|null $app |
|
370 | + * @param string $header |
|
371 | + * @param string[] $availableLanguages |
|
372 | + * @param string $expected |
|
373 | + */ |
|
374 | + public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected): void { |
|
375 | + $factory = $this->getFactory(['findAvailableLanguages', 'respectDefaultLanguage']); |
|
376 | + $factory->expects(self::once()) |
|
377 | + ->method('findAvailableLanguages') |
|
378 | + ->with($app) |
|
379 | + ->willReturn($availableLanguages); |
|
380 | + |
|
381 | + $factory->expects(self::any()) |
|
382 | + ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
383 | + return $lang; |
|
384 | + }); |
|
385 | + |
|
386 | + $this->request->expects(self::once()) |
|
387 | + ->method('getHeader') |
|
388 | + ->with('ACCEPT_LANGUAGE') |
|
389 | + ->willReturn($header); |
|
390 | + |
|
391 | + if ($expected instanceof LanguageNotFoundException) { |
|
392 | + $this->expectException(LanguageNotFoundException::class); |
|
393 | + self::invokePrivate($factory, 'getLanguageFromRequest', [$app]); |
|
394 | + } else { |
|
395 | + self::assertSame($expected, self::invokePrivate($factory, 'getLanguageFromRequest', [$app]), 'Asserting returned language'); |
|
396 | + } |
|
397 | + } |
|
398 | + |
|
399 | + public static function dataGetL10nFilesForApp(): array { |
|
400 | + return [ |
|
401 | + ['', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
402 | + ['core', 'ru', [\OC::$SERVERROOT . '/core/l10n/ru.json']], |
|
403 | + ['lib', 'ru', [\OC::$SERVERROOT . '/lib/l10n/ru.json']], |
|
404 | + ['settings', 'de', [\OC::$SERVERROOT . '/apps/settings/l10n/de.json']], |
|
405 | + ['files', 'de', [\OC::$SERVERROOT . '/apps/files/l10n/de.json']], |
|
406 | + ['files', '_lang_never_exists_', []], |
|
407 | + ['_app_never_exists_', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
408 | + ]; |
|
409 | + } |
|
410 | + |
|
411 | + /** |
|
412 | + * @dataProvider dataGetL10nFilesForApp |
|
413 | + * |
|
414 | + * @param string $app |
|
415 | + * @param string $expected |
|
416 | + */ |
|
417 | + public function testGetL10nFilesForApp($app, $lang, $expected): void { |
|
418 | + $factory = $this->getFactory(); |
|
419 | + if (in_array($app, ['settings','files'])) { |
|
420 | + $this->appManager |
|
421 | + ->method('getAppPath') |
|
422 | + ->with($app) |
|
423 | + ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
424 | + } else { |
|
425 | + $this->appManager |
|
426 | + ->method('getAppPath') |
|
427 | + ->with($app) |
|
428 | + ->willThrowException(new AppPathNotFoundException()); |
|
429 | + } |
|
430 | + self::assertSame($expected, $this->invokePrivate($factory, 'getL10nFilesForApp', [$app, $lang])); |
|
431 | + } |
|
432 | + |
|
433 | + public static function dataFindL10NDir(): array { |
|
434 | + return [ |
|
435 | + ['', \OC::$SERVERROOT . '/core/l10n/'], |
|
436 | + ['core', \OC::$SERVERROOT . '/core/l10n/'], |
|
437 | + ['lib', \OC::$SERVERROOT . '/lib/l10n/'], |
|
438 | + ['settings', \OC::$SERVERROOT . '/apps/settings/l10n/'], |
|
439 | + ['files', \OC::$SERVERROOT . '/apps/files/l10n/'], |
|
440 | + ['_app_never_exists_', \OC::$SERVERROOT . '/core/l10n/'], |
|
441 | + ]; |
|
442 | + } |
|
443 | + |
|
444 | + /** |
|
445 | + * @dataProvider dataFindL10NDir |
|
446 | + * |
|
447 | + * @param string $app |
|
448 | + * @param string $expected |
|
449 | + */ |
|
450 | + public function testFindL10NDir($app, $expected): void { |
|
451 | + $factory = $this->getFactory(); |
|
452 | + if (in_array($app, ['settings','files'])) { |
|
453 | + $this->appManager |
|
454 | + ->method('getAppPath') |
|
455 | + ->with($app) |
|
456 | + ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
457 | + } else { |
|
458 | + $this->appManager |
|
459 | + ->method('getAppPath') |
|
460 | + ->with($app) |
|
461 | + ->willThrowException(new AppPathNotFoundException()); |
|
462 | + } |
|
463 | + self::assertSame($expected, $this->invokePrivate($factory, 'findL10nDir', [$app])); |
|
464 | + } |
|
465 | + |
|
466 | + public static function dataFindLanguage(): array { |
|
467 | + return [ |
|
468 | + // Not logged in |
|
469 | + [false, [], 'en'], |
|
470 | + [false, ['fr'], 'fr'], |
|
471 | + [false, ['de', 'fr'], 'de'], |
|
472 | + [false, ['nl', 'de', 'fr'], 'de'], |
|
473 | + |
|
474 | + [true, [], 'en'], |
|
475 | + [true, ['fr'], 'fr'], |
|
476 | + [true, ['de', 'fr'], 'de'], |
|
477 | + [true, ['nl', 'de', 'fr'], 'nl'], |
|
478 | + ]; |
|
479 | + } |
|
480 | + |
|
481 | + /** |
|
482 | + * @dataProvider dataFindLanguage |
|
483 | + * |
|
484 | + * @param bool $loggedIn |
|
485 | + * @param array $availableLang |
|
486 | + * @param string $expected |
|
487 | + */ |
|
488 | + public function testFindLanguage($loggedIn, $availableLang, $expected): void { |
|
489 | + $userLang = 'nl'; |
|
490 | + $browserLang = 'de'; |
|
491 | + $defaultLang = 'fr'; |
|
492 | + |
|
493 | + $this->config->expects(self::any()) |
|
494 | + ->method('getSystemValue') |
|
495 | + ->willReturnCallback(function ($var, $default) use ($defaultLang) { |
|
496 | + if ($var === 'default_language') { |
|
497 | + return $defaultLang; |
|
498 | + } else { |
|
499 | + return $default; |
|
500 | + } |
|
501 | + }); |
|
502 | + |
|
503 | + if ($loggedIn) { |
|
504 | + $user = $this->createMock(IUser::class); |
|
505 | + $user->expects(self::any()) |
|
506 | + ->method('getUID') |
|
507 | + ->willReturn('MyUserUid'); |
|
508 | + $this->userSession |
|
509 | + ->expects(self::any()) |
|
510 | + ->method('getUser') |
|
511 | + ->willReturn($user); |
|
512 | + $this->config->expects(self::any()) |
|
513 | + ->method('getUserValue') |
|
514 | + ->with('MyUserUid', 'core', 'lang', null) |
|
515 | + ->willReturn($userLang); |
|
516 | + } else { |
|
517 | + $this->userSession |
|
518 | + ->expects(self::any()) |
|
519 | + ->method('getUser') |
|
520 | + ->willReturn(null); |
|
521 | + } |
|
522 | + |
|
523 | + $this->request->expects(self::any()) |
|
524 | + ->method('getHeader') |
|
525 | + ->with($this->equalTo('ACCEPT_LANGUAGE')) |
|
526 | + ->willReturn($browserLang); |
|
527 | + |
|
528 | + $factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']); |
|
529 | + $factory->expects(self::any()) |
|
530 | + ->method('languageExists') |
|
531 | + ->willReturnCallback(function ($app, $lang) use ($availableLang) { |
|
532 | + return in_array($lang, $availableLang); |
|
533 | + }); |
|
534 | + $factory->expects(self::any()) |
|
535 | + ->method('findAvailableLanguages') |
|
536 | + ->willReturnCallback(function ($app) use ($availableLang) { |
|
537 | + return $availableLang; |
|
538 | + }); |
|
539 | + $factory->expects(self::any()) |
|
540 | + ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
541 | + return $lang; |
|
542 | + }); |
|
543 | + |
|
544 | + $lang = $factory->findLanguage(); |
|
545 | + |
|
546 | + self::assertSame($expected, $lang); |
|
547 | + } |
|
548 | + |
|
549 | + public function testFindGenericLanguageByEnforcedLanguage(): void { |
|
550 | + $factory = $this->getFactory(); |
|
551 | + $this->config->expects(self::once()) |
|
552 | + ->method('getSystemValue') |
|
553 | + ->with('force_language', false) |
|
554 | + ->willReturn('cz'); |
|
555 | + |
|
556 | + $lang = $factory->findGenericLanguage(); |
|
557 | + |
|
558 | + self::assertSame('cz', $lang); |
|
559 | + } |
|
560 | + |
|
561 | + public function testFindGenericLanguageByDefaultLanguage(): void { |
|
562 | + $factory = $this->getFactory(['languageExists']); |
|
563 | + $this->config->expects(self::exactly(2)) |
|
564 | + ->method('getSystemValue') |
|
565 | + ->willReturnMap([ |
|
566 | + ['force_language', false, false,], |
|
567 | + ['default_language', false, 'cz',], |
|
568 | + ]); |
|
569 | + $factory->expects(self::once()) |
|
570 | + ->method('languageExists') |
|
571 | + ->with(null, 'cz') |
|
572 | + ->willReturn(true); |
|
573 | + |
|
574 | + $lang = $factory->findGenericLanguage(); |
|
575 | + |
|
576 | + self::assertSame('cz', $lang); |
|
577 | + } |
|
578 | + |
|
579 | + public function testFindGenericLanguageByUserLanguage(): void { |
|
580 | + $factory = $this->getFactory(); |
|
581 | + $this->config->expects(self::exactly(2)) |
|
582 | + ->method('getSystemValue') |
|
583 | + ->willReturnMap([ |
|
584 | + ['force_language', false, false,], |
|
585 | + ['default_language', false, false,], |
|
586 | + ]); |
|
587 | + $user = $this->createMock(IUser::class); |
|
588 | + $this->userSession->expects(self::once()) |
|
589 | + ->method('getUser') |
|
590 | + ->willReturn($user); |
|
591 | + $user->method('getUID')->willReturn('user123'); |
|
592 | + $this->config->expects(self::once()) |
|
593 | + ->method('getUserValue') |
|
594 | + ->with('user123', 'core', 'lang', null) |
|
595 | + ->willReturn('cz'); |
|
596 | + |
|
597 | + $lang = $factory->findGenericLanguage(); |
|
598 | + |
|
599 | + self::assertSame('cz', $lang); |
|
600 | + } |
|
601 | + |
|
602 | + public function testFindGenericLanguageByRequestLanguage(): void { |
|
603 | + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
604 | + $this->config->method('getSystemValue') |
|
605 | + ->willReturnMap([ |
|
606 | + ['force_language', false, false,], |
|
607 | + ['default_language', false, false,], |
|
608 | + ]); |
|
609 | + $user = $this->createMock(IUser::class); |
|
610 | + $this->userSession->expects(self::once()) |
|
611 | + ->method('getUser') |
|
612 | + ->willReturn($user); |
|
613 | + $user->method('getUID')->willReturn('user123'); |
|
614 | + $this->config->expects(self::once()) |
|
615 | + ->method('getUserValue') |
|
616 | + ->with('user123', 'core', 'lang', null) |
|
617 | + ->willReturn(null); |
|
618 | + $this->request->expects(self::once()) |
|
619 | + ->method('getHeader') |
|
620 | + ->with('ACCEPT_LANGUAGE') |
|
621 | + ->willReturn('cz'); |
|
622 | + $factory->expects(self::once()) |
|
623 | + ->method('findAvailableLanguages') |
|
624 | + ->with(null) |
|
625 | + ->willReturn(['cz']); |
|
626 | + |
|
627 | + $lang = $factory->findGenericLanguage(); |
|
628 | + |
|
629 | + self::assertSame('cz', $lang); |
|
630 | + } |
|
631 | + |
|
632 | + public function testFindGenericLanguageFallback(): void { |
|
633 | + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
634 | + $this->config->method('getSystemValue') |
|
635 | + ->willReturnMap([ |
|
636 | + ['force_language', false, false,], |
|
637 | + ['default_language', false, false,], |
|
638 | + ]); |
|
639 | + $user = $this->createMock(IUser::class); |
|
640 | + $this->userSession->expects(self::once()) |
|
641 | + ->method('getUser') |
|
642 | + ->willReturn($user); |
|
643 | + $user->method('getUID')->willReturn('user123'); |
|
644 | + $this->config->expects(self::once()) |
|
645 | + ->method('getUserValue') |
|
646 | + ->with('user123', 'core', 'lang', null) |
|
647 | + ->willReturn(null); |
|
648 | + $this->request->expects(self::once()) |
|
649 | + ->method('getHeader') |
|
650 | + ->with('ACCEPT_LANGUAGE') |
|
651 | + ->willReturn(''); |
|
652 | + $factory->expects(self::never()) |
|
653 | + ->method('findAvailableLanguages'); |
|
654 | + $factory->expects(self::never()) |
|
655 | + ->method('languageExists'); |
|
656 | + |
|
657 | + $lang = $factory->findGenericLanguage(); |
|
658 | + |
|
659 | + self::assertSame('en', $lang); |
|
660 | + } |
|
661 | + |
|
662 | + public static function dataTestRespectDefaultLanguage(): array { |
|
663 | + return [ |
|
664 | + ['de', 'de_DE', true, 'de_DE'], |
|
665 | + ['de', 'de', true, 'de'], |
|
666 | + ['de', false, true, 'de'], |
|
667 | + ['fr', 'de_DE', true, 'fr'], |
|
668 | + ]; |
|
669 | + } |
|
670 | + |
|
671 | + /** |
|
672 | + * test if we respect default language if possible |
|
673 | + * |
|
674 | + * @dataProvider dataTestRespectDefaultLanguage |
|
675 | + * |
|
676 | + * @param string $lang |
|
677 | + * @param string $defaultLanguage |
|
678 | + * @param bool $langExists |
|
679 | + * @param string $expected |
|
680 | + */ |
|
681 | + public function testRespectDefaultLanguage($lang, $defaultLanguage, $langExists, $expected): void { |
|
682 | + $factory = $this->getFactory(['languageExists']); |
|
683 | + $factory->expects(self::any()) |
|
684 | + ->method('languageExists')->willReturn($langExists); |
|
685 | + $this->config->expects(self::any()) |
|
686 | + ->method('getSystemValue')->with('default_language', false)->willReturn($defaultLanguage); |
|
687 | + |
|
688 | + $result = $this->invokePrivate($factory, 'respectDefaultLanguage', ['app', $lang]); |
|
689 | + self::assertSame($expected, $result); |
|
690 | + } |
|
691 | + |
|
692 | + public static function dataTestReduceToLanguages(): array { |
|
693 | + return [ |
|
694 | + ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'fr', 'de'], ['en', 'fr', 'de']], |
|
695 | + ['en', ['en', 'de', 'fr', 'it', 'es'], ['en', 'de'], ['en', 'de']], |
|
696 | + ['en', ['en', 'de', 'fr', 'it', 'es'], [], ['de', 'en', 'es', 'fr', 'it']], |
|
697 | + ]; |
|
698 | + } |
|
699 | + |
|
700 | + /** |
|
701 | + * test |
|
702 | + * - if available languages set can be reduced by configuration |
|
703 | + * - if available languages set is not reduced to an empty set if |
|
704 | + * the reduce config is an empty set |
|
705 | + * |
|
706 | + * @dataProvider dataTestReduceToLanguages |
|
707 | + * |
|
708 | + * @param string $lang |
|
709 | + * @param array $availableLanguages |
|
710 | + * @param array $reducedLanguageSet |
|
711 | + * @param array $expected |
|
712 | + */ |
|
713 | + public function testReduceLanguagesByConfiguration(string $lang, array $availableLanguages, array $reducedLanguageSet, array $expected): void { |
|
714 | + $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
|
715 | + $factory->expects(self::any()) |
|
716 | + ->method('languageExists')->willReturn(true); |
|
717 | + $factory->expects(self::any()) |
|
718 | + ->method('findAvailableLanguages') |
|
719 | + ->willReturnCallback(function ($app) use ($availableLanguages) { |
|
720 | + return $availableLanguages; |
|
721 | + }); |
|
722 | + |
|
723 | + $this->config |
|
724 | + ->method('getSystemValue') |
|
725 | + ->willReturnMap([ |
|
726 | + ['force_language', false, false], |
|
727 | + ['default_language', false, $lang], |
|
728 | + ['reduce_to_languages', [], $reducedLanguageSet] |
|
729 | + ]); |
|
730 | + |
|
731 | + $result = $this->invokePrivate($factory, 'getLanguages'); |
|
732 | + $commonLanguagesCodes = array_map(function ($lang) { |
|
733 | + return $lang['code']; |
|
734 | + }, $result['commonLanguages']); |
|
735 | + |
|
736 | + self::assertEqualsCanonicalizing($expected, $commonLanguagesCodes); |
|
737 | + } |
|
738 | + |
|
739 | + public static function languageIteratorRequestProvider(): array { |
|
740 | + return [ |
|
741 | + [ true, true], |
|
742 | + [ false, true], |
|
743 | + [ false, false], |
|
744 | + ]; |
|
745 | + } |
|
746 | + |
|
747 | + /** |
|
748 | + * @dataProvider languageIteratorRequestProvider |
|
749 | + */ |
|
750 | + public function testGetLanguageIterator(bool $hasSession, bool $mockUser): void { |
|
751 | + $factory = $this->getFactory(); |
|
752 | + $user = null; |
|
753 | + |
|
754 | + if (!$mockUser) { |
|
755 | + $matcher = $this->userSession->expects(self::once()) |
|
756 | + ->method('getUser'); |
|
757 | + |
|
758 | + if ($hasSession) { |
|
759 | + $matcher->willReturn($this->createMock(IUser::class)); |
|
760 | + } else { |
|
761 | + $this->expectException(\RuntimeException::class); |
|
762 | + } |
|
763 | + } else { |
|
764 | + $user = $this->createMock(IUser::class); |
|
765 | + } |
|
766 | + |
|
767 | + $iterator = $factory->getLanguageIterator($user); |
|
768 | + self::assertInstanceOf(ILanguageIterator::class, $iterator); |
|
769 | + } |
|
770 | + |
|
771 | + public static function dataGetLanguageDirection(): array { |
|
772 | + return [ |
|
773 | + ['en', 'ltr'], |
|
774 | + ['de', 'ltr'], |
|
775 | + ['fa', 'rtl'], |
|
776 | + ['ar', 'rtl'] |
|
777 | + ]; |
|
778 | + } |
|
779 | + |
|
780 | + /** |
|
781 | + * @dataProvider dataGetLanguageDirection |
|
782 | + */ |
|
783 | + public function testGetLanguageDirection(string $language, string $expectedDirection) { |
|
784 | + $factory = $this->getFactory(); |
|
785 | + |
|
786 | + self::assertEquals($expectedDirection, $factory->getLanguageDirection($language)); |
|
787 | + } |
|
788 | 788 | } |
@@ -287,7 +287,7 @@ discard block |
||
287 | 287 | $factory->expects(self::once()) |
288 | 288 | ->method('findL10nDir') |
289 | 289 | ->with($app) |
290 | - ->willReturn(\OC::$SERVERROOT . '/tests/data/l10n/'); |
|
290 | + ->willReturn(\OC::$SERVERROOT.'/tests/data/l10n/'); |
|
291 | 291 | |
292 | 292 | self::assertEqualsCanonicalizing(['cs', 'de', 'en', 'ru'], $factory->findAvailableLanguages($app)); |
293 | 293 | } |
@@ -313,7 +313,7 @@ discard block |
||
313 | 313 | $factory->expects(self::once()) |
314 | 314 | ->method('findL10nDir') |
315 | 315 | ->with($app) |
316 | - ->willReturn($this->serverRoot . '/apps/files/l10n/'); |
|
316 | + ->willReturn($this->serverRoot.'/apps/files/l10n/'); |
|
317 | 317 | $this->config |
318 | 318 | ->expects(self::once()) |
319 | 319 | ->method('getSystemValueString') |
@@ -379,7 +379,7 @@ discard block |
||
379 | 379 | ->willReturn($availableLanguages); |
380 | 380 | |
381 | 381 | $factory->expects(self::any()) |
382 | - ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
382 | + ->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) { |
|
383 | 383 | return $lang; |
384 | 384 | }); |
385 | 385 | |
@@ -398,13 +398,13 @@ discard block |
||
398 | 398 | |
399 | 399 | public static function dataGetL10nFilesForApp(): array { |
400 | 400 | return [ |
401 | - ['', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
402 | - ['core', 'ru', [\OC::$SERVERROOT . '/core/l10n/ru.json']], |
|
403 | - ['lib', 'ru', [\OC::$SERVERROOT . '/lib/l10n/ru.json']], |
|
404 | - ['settings', 'de', [\OC::$SERVERROOT . '/apps/settings/l10n/de.json']], |
|
405 | - ['files', 'de', [\OC::$SERVERROOT . '/apps/files/l10n/de.json']], |
|
401 | + ['', 'de', [\OC::$SERVERROOT.'/core/l10n/de.json']], |
|
402 | + ['core', 'ru', [\OC::$SERVERROOT.'/core/l10n/ru.json']], |
|
403 | + ['lib', 'ru', [\OC::$SERVERROOT.'/lib/l10n/ru.json']], |
|
404 | + ['settings', 'de', [\OC::$SERVERROOT.'/apps/settings/l10n/de.json']], |
|
405 | + ['files', 'de', [\OC::$SERVERROOT.'/apps/files/l10n/de.json']], |
|
406 | 406 | ['files', '_lang_never_exists_', []], |
407 | - ['_app_never_exists_', 'de', [\OC::$SERVERROOT . '/core/l10n/de.json']], |
|
407 | + ['_app_never_exists_', 'de', [\OC::$SERVERROOT.'/core/l10n/de.json']], |
|
408 | 408 | ]; |
409 | 409 | } |
410 | 410 | |
@@ -416,11 +416,11 @@ discard block |
||
416 | 416 | */ |
417 | 417 | public function testGetL10nFilesForApp($app, $lang, $expected): void { |
418 | 418 | $factory = $this->getFactory(); |
419 | - if (in_array($app, ['settings','files'])) { |
|
419 | + if (in_array($app, ['settings', 'files'])) { |
|
420 | 420 | $this->appManager |
421 | 421 | ->method('getAppPath') |
422 | 422 | ->with($app) |
423 | - ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
423 | + ->willReturn(\OC::$SERVERROOT.'/apps/'.$app); |
|
424 | 424 | } else { |
425 | 425 | $this->appManager |
426 | 426 | ->method('getAppPath') |
@@ -432,12 +432,12 @@ discard block |
||
432 | 432 | |
433 | 433 | public static function dataFindL10NDir(): array { |
434 | 434 | return [ |
435 | - ['', \OC::$SERVERROOT . '/core/l10n/'], |
|
436 | - ['core', \OC::$SERVERROOT . '/core/l10n/'], |
|
437 | - ['lib', \OC::$SERVERROOT . '/lib/l10n/'], |
|
438 | - ['settings', \OC::$SERVERROOT . '/apps/settings/l10n/'], |
|
439 | - ['files', \OC::$SERVERROOT . '/apps/files/l10n/'], |
|
440 | - ['_app_never_exists_', \OC::$SERVERROOT . '/core/l10n/'], |
|
435 | + ['', \OC::$SERVERROOT.'/core/l10n/'], |
|
436 | + ['core', \OC::$SERVERROOT.'/core/l10n/'], |
|
437 | + ['lib', \OC::$SERVERROOT.'/lib/l10n/'], |
|
438 | + ['settings', \OC::$SERVERROOT.'/apps/settings/l10n/'], |
|
439 | + ['files', \OC::$SERVERROOT.'/apps/files/l10n/'], |
|
440 | + ['_app_never_exists_', \OC::$SERVERROOT.'/core/l10n/'], |
|
441 | 441 | ]; |
442 | 442 | } |
443 | 443 | |
@@ -449,11 +449,11 @@ discard block |
||
449 | 449 | */ |
450 | 450 | public function testFindL10NDir($app, $expected): void { |
451 | 451 | $factory = $this->getFactory(); |
452 | - if (in_array($app, ['settings','files'])) { |
|
452 | + if (in_array($app, ['settings', 'files'])) { |
|
453 | 453 | $this->appManager |
454 | 454 | ->method('getAppPath') |
455 | 455 | ->with($app) |
456 | - ->willReturn(\OC::$SERVERROOT . '/apps/' . $app); |
|
456 | + ->willReturn(\OC::$SERVERROOT.'/apps/'.$app); |
|
457 | 457 | } else { |
458 | 458 | $this->appManager |
459 | 459 | ->method('getAppPath') |
@@ -492,7 +492,7 @@ discard block |
||
492 | 492 | |
493 | 493 | $this->config->expects(self::any()) |
494 | 494 | ->method('getSystemValue') |
495 | - ->willReturnCallback(function ($var, $default) use ($defaultLang) { |
|
495 | + ->willReturnCallback(function($var, $default) use ($defaultLang) { |
|
496 | 496 | if ($var === 'default_language') { |
497 | 497 | return $defaultLang; |
498 | 498 | } else { |
@@ -528,16 +528,16 @@ discard block |
||
528 | 528 | $factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']); |
529 | 529 | $factory->expects(self::any()) |
530 | 530 | ->method('languageExists') |
531 | - ->willReturnCallback(function ($app, $lang) use ($availableLang) { |
|
531 | + ->willReturnCallback(function($app, $lang) use ($availableLang) { |
|
532 | 532 | return in_array($lang, $availableLang); |
533 | 533 | }); |
534 | 534 | $factory->expects(self::any()) |
535 | 535 | ->method('findAvailableLanguages') |
536 | - ->willReturnCallback(function ($app) use ($availableLang) { |
|
536 | + ->willReturnCallback(function($app) use ($availableLang) { |
|
537 | 537 | return $availableLang; |
538 | 538 | }); |
539 | 539 | $factory->expects(self::any()) |
540 | - ->method('respectDefaultLanguage')->willReturnCallback(function ($app, $lang) { |
|
540 | + ->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) { |
|
541 | 541 | return $lang; |
542 | 542 | }); |
543 | 543 | |
@@ -563,8 +563,8 @@ discard block |
||
563 | 563 | $this->config->expects(self::exactly(2)) |
564 | 564 | ->method('getSystemValue') |
565 | 565 | ->willReturnMap([ |
566 | - ['force_language', false, false,], |
|
567 | - ['default_language', false, 'cz',], |
|
566 | + ['force_language', false, false, ], |
|
567 | + ['default_language', false, 'cz', ], |
|
568 | 568 | ]); |
569 | 569 | $factory->expects(self::once()) |
570 | 570 | ->method('languageExists') |
@@ -581,8 +581,8 @@ discard block |
||
581 | 581 | $this->config->expects(self::exactly(2)) |
582 | 582 | ->method('getSystemValue') |
583 | 583 | ->willReturnMap([ |
584 | - ['force_language', false, false,], |
|
585 | - ['default_language', false, false,], |
|
584 | + ['force_language', false, false, ], |
|
585 | + ['default_language', false, false, ], |
|
586 | 586 | ]); |
587 | 587 | $user = $this->createMock(IUser::class); |
588 | 588 | $this->userSession->expects(self::once()) |
@@ -603,8 +603,8 @@ discard block |
||
603 | 603 | $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
604 | 604 | $this->config->method('getSystemValue') |
605 | 605 | ->willReturnMap([ |
606 | - ['force_language', false, false,], |
|
607 | - ['default_language', false, false,], |
|
606 | + ['force_language', false, false, ], |
|
607 | + ['default_language', false, false, ], |
|
608 | 608 | ]); |
609 | 609 | $user = $this->createMock(IUser::class); |
610 | 610 | $this->userSession->expects(self::once()) |
@@ -633,8 +633,8 @@ discard block |
||
633 | 633 | $factory = $this->getFactory(['findAvailableLanguages', 'languageExists']); |
634 | 634 | $this->config->method('getSystemValue') |
635 | 635 | ->willReturnMap([ |
636 | - ['force_language', false, false,], |
|
637 | - ['default_language', false, false,], |
|
636 | + ['force_language', false, false, ], |
|
637 | + ['default_language', false, false, ], |
|
638 | 638 | ]); |
639 | 639 | $user = $this->createMock(IUser::class); |
640 | 640 | $this->userSession->expects(self::once()) |
@@ -716,7 +716,7 @@ discard block |
||
716 | 716 | ->method('languageExists')->willReturn(true); |
717 | 717 | $factory->expects(self::any()) |
718 | 718 | ->method('findAvailableLanguages') |
719 | - ->willReturnCallback(function ($app) use ($availableLanguages) { |
|
719 | + ->willReturnCallback(function($app) use ($availableLanguages) { |
|
720 | 720 | return $availableLanguages; |
721 | 721 | }); |
722 | 722 | |
@@ -729,7 +729,7 @@ discard block |
||
729 | 729 | ]); |
730 | 730 | |
731 | 731 | $result = $this->invokePrivate($factory, 'getLanguages'); |
732 | - $commonLanguagesCodes = array_map(function ($lang) { |
|
732 | + $commonLanguagesCodes = array_map(function($lang) { |
|
733 | 733 | return $lang['code']; |
734 | 734 | }, $result['commonLanguages']); |
735 | 735 | |
@@ -738,9 +738,9 @@ discard block |
||
738 | 738 | |
739 | 739 | public static function languageIteratorRequestProvider(): array { |
740 | 740 | return [ |
741 | - [ true, true], |
|
742 | - [ false, true], |
|
743 | - [ false, false], |
|
741 | + [true, true], |
|
742 | + [false, true], |
|
743 | + [false, false], |
|
744 | 744 | ]; |
745 | 745 | } |
746 | 746 |
@@ -24,193 +24,193 @@ |
||
24 | 24 | use Test\TestCase; |
25 | 25 | |
26 | 26 | class ManagerTest extends TestCase { |
27 | - /** @var Factory|MockObject */ |
|
28 | - private $factory; |
|
29 | - /** @var IAppData|MockObject */ |
|
30 | - private $appData; |
|
31 | - /** @var ICrypto|MockObject */ |
|
32 | - private $crypto; |
|
33 | - /** @var Manager|MockObject */ |
|
34 | - private $manager; |
|
35 | - /** @var IConfig|MockObject */ |
|
36 | - private $config; |
|
37 | - /** @var LoggerInterface|MockObject */ |
|
38 | - private $logger; |
|
39 | - |
|
40 | - protected function setUp(): void { |
|
41 | - parent::setUp(); |
|
42 | - |
|
43 | - /** @var Factory|\PHPUnit\Framework\MockObject\MockObject $factory */ |
|
44 | - $this->factory = $this->createMock(Factory::class); |
|
45 | - $this->appData = $this->createMock(AppData::class); |
|
46 | - $this->config = $this->createMock(IConfig::class); |
|
47 | - $this->factory->expects($this->any()) |
|
48 | - ->method('get') |
|
49 | - ->with('identityproof') |
|
50 | - ->willReturn($this->appData); |
|
51 | - $this->logger = $this->createMock(LoggerInterface::class); |
|
52 | - |
|
53 | - $this->crypto = $this->createMock(ICrypto::class); |
|
54 | - $this->manager = $this->getManager(['generateKeyPair']); |
|
55 | - } |
|
56 | - |
|
57 | - /** |
|
58 | - * create manager object |
|
59 | - * |
|
60 | - * @param array $setMethods |
|
61 | - * @return Manager|\PHPUnit\Framework\MockObject\MockObject |
|
62 | - */ |
|
63 | - protected function getManager($setMethods = []) { |
|
64 | - if (empty($setMethods)) { |
|
65 | - return new Manager( |
|
66 | - $this->factory, |
|
67 | - $this->crypto, |
|
68 | - $this->config, |
|
69 | - $this->logger |
|
70 | - ); |
|
71 | - } else { |
|
72 | - return $this->getMockBuilder(Manager::class) |
|
73 | - ->setConstructorArgs([ |
|
74 | - $this->factory, |
|
75 | - $this->crypto, |
|
76 | - $this->config, |
|
77 | - $this->logger |
|
78 | - ]) |
|
79 | - ->onlyMethods($setMethods) |
|
80 | - ->getMock(); |
|
81 | - } |
|
82 | - } |
|
83 | - |
|
84 | - public function testGetKeyWithExistingKey(): void { |
|
85 | - $user = $this->createMock(IUser::class); |
|
86 | - $user |
|
87 | - ->expects($this->once()) |
|
88 | - ->method('getUID') |
|
89 | - ->willReturn('MyUid'); |
|
90 | - $folder = $this->createMock(ISimpleFolder::class); |
|
91 | - $privateFile = $this->createMock(ISimpleFile::class); |
|
92 | - $privateFile |
|
93 | - ->expects($this->once()) |
|
94 | - ->method('getContent') |
|
95 | - ->willReturn('EncryptedPrivateKey'); |
|
96 | - $publicFile = $this->createMock(ISimpleFile::class); |
|
97 | - $publicFile |
|
98 | - ->expects($this->once()) |
|
99 | - ->method('getContent') |
|
100 | - ->willReturn('MyPublicKey'); |
|
101 | - $this->crypto |
|
102 | - ->expects($this->once()) |
|
103 | - ->method('decrypt') |
|
104 | - ->with('EncryptedPrivateKey') |
|
105 | - ->willReturn('MyPrivateKey'); |
|
106 | - $folder |
|
107 | - ->expects($this->exactly(2)) |
|
108 | - ->method('getFile') |
|
109 | - ->willReturnMap([ |
|
110 | - ['private', $privateFile], |
|
111 | - ['public', $publicFile], |
|
112 | - ]); |
|
113 | - $this->appData |
|
114 | - ->expects($this->once()) |
|
115 | - ->method('getFolder') |
|
116 | - ->with('user-MyUid') |
|
117 | - ->willReturn($folder); |
|
118 | - |
|
119 | - $expected = new Key('MyPublicKey', 'MyPrivateKey'); |
|
120 | - $this->assertEquals($expected, $this->manager->getKey($user)); |
|
121 | - } |
|
122 | - |
|
123 | - public function testGetKeyWithNotExistingKey(): void { |
|
124 | - $user = $this->createMock(IUser::class); |
|
125 | - $user |
|
126 | - ->expects($this->once()) |
|
127 | - ->method('getUID') |
|
128 | - ->willReturn('MyUid'); |
|
129 | - $this->manager |
|
130 | - ->expects($this->once()) |
|
131 | - ->method('generateKeyPair') |
|
132 | - ->willReturn(['MyNewPublicKey', 'MyNewPrivateKey']); |
|
133 | - $this->appData |
|
134 | - ->expects($this->once()) |
|
135 | - ->method('newFolder') |
|
136 | - ->with('user-MyUid'); |
|
137 | - $folder = $this->createMock(ISimpleFolder::class); |
|
138 | - $this->crypto |
|
139 | - ->expects($this->once()) |
|
140 | - ->method('encrypt') |
|
141 | - ->with('MyNewPrivateKey') |
|
142 | - ->willReturn('MyNewEncryptedPrivateKey'); |
|
143 | - $privateFile = $this->createMock(ISimpleFile::class); |
|
144 | - $privateFile |
|
145 | - ->expects($this->once()) |
|
146 | - ->method('putContent') |
|
147 | - ->with('MyNewEncryptedPrivateKey'); |
|
148 | - $publicFile = $this->createMock(ISimpleFile::class); |
|
149 | - $publicFile |
|
150 | - ->expects($this->once()) |
|
151 | - ->method('putContent') |
|
152 | - ->with('MyNewPublicKey'); |
|
153 | - $folder |
|
154 | - ->expects($this->exactly(2)) |
|
155 | - ->method('newFile') |
|
156 | - ->willReturnMap([ |
|
157 | - ['private', null, $privateFile], |
|
158 | - ['public', null, $publicFile], |
|
159 | - ]); |
|
160 | - $this->appData |
|
161 | - ->expects($this->exactly(2)) |
|
162 | - ->method('getFolder') |
|
163 | - ->with('user-MyUid') |
|
164 | - ->willReturnOnConsecutiveCalls( |
|
165 | - $this->throwException(new \Exception()), |
|
166 | - $folder |
|
167 | - ); |
|
168 | - |
|
169 | - |
|
170 | - $expected = new Key('MyNewPublicKey', 'MyNewPrivateKey'); |
|
171 | - $this->assertEquals($expected, $this->manager->getKey($user)); |
|
172 | - } |
|
173 | - |
|
174 | - public function testGenerateKeyPair(): void { |
|
175 | - $manager = $this->getManager(); |
|
176 | - $data = 'MyTestData'; |
|
177 | - |
|
178 | - [$resultPublicKey, $resultPrivateKey] = self::invokePrivate($manager, 'generateKeyPair'); |
|
179 | - openssl_sign($data, $signature, $resultPrivateKey); |
|
180 | - $details = openssl_pkey_get_details(openssl_pkey_get_public($resultPublicKey)); |
|
181 | - |
|
182 | - $this->assertSame(1, openssl_verify($data, $signature, $resultPublicKey)); |
|
183 | - $this->assertSame(2048, $details['bits']); |
|
184 | - } |
|
185 | - |
|
186 | - public function testGetSystemKey(): void { |
|
187 | - $manager = $this->getManager(['retrieveKey']); |
|
188 | - |
|
189 | - /** @var Key|\PHPUnit\Framework\MockObject\MockObject $key */ |
|
190 | - $key = $this->createMock(Key::class); |
|
191 | - |
|
192 | - $this->config->expects($this->once())->method('getSystemValue') |
|
193 | - ->with('instanceid', null)->willReturn('instanceId'); |
|
194 | - |
|
195 | - $manager->expects($this->once())->method('retrieveKey')->with('system-instanceId') |
|
196 | - ->willReturn($key); |
|
197 | - |
|
198 | - $this->assertSame($key, $manager->getSystemKey()); |
|
199 | - } |
|
200 | - |
|
201 | - |
|
202 | - |
|
203 | - public function testGetSystemKeyFailure(): void { |
|
204 | - $this->expectException(\RuntimeException::class); |
|
205 | - |
|
206 | - $manager = $this->getManager(['retrieveKey']); |
|
207 | - |
|
208 | - /** @var Key|\PHPUnit\Framework\MockObject\MockObject $key */ |
|
209 | - $key = $this->createMock(Key::class); |
|
210 | - |
|
211 | - $this->config->expects($this->once())->method('getSystemValue') |
|
212 | - ->with('instanceid', null)->willReturn(null); |
|
213 | - |
|
214 | - $manager->getSystemKey(); |
|
215 | - } |
|
27 | + /** @var Factory|MockObject */ |
|
28 | + private $factory; |
|
29 | + /** @var IAppData|MockObject */ |
|
30 | + private $appData; |
|
31 | + /** @var ICrypto|MockObject */ |
|
32 | + private $crypto; |
|
33 | + /** @var Manager|MockObject */ |
|
34 | + private $manager; |
|
35 | + /** @var IConfig|MockObject */ |
|
36 | + private $config; |
|
37 | + /** @var LoggerInterface|MockObject */ |
|
38 | + private $logger; |
|
39 | + |
|
40 | + protected function setUp(): void { |
|
41 | + parent::setUp(); |
|
42 | + |
|
43 | + /** @var Factory|\PHPUnit\Framework\MockObject\MockObject $factory */ |
|
44 | + $this->factory = $this->createMock(Factory::class); |
|
45 | + $this->appData = $this->createMock(AppData::class); |
|
46 | + $this->config = $this->createMock(IConfig::class); |
|
47 | + $this->factory->expects($this->any()) |
|
48 | + ->method('get') |
|
49 | + ->with('identityproof') |
|
50 | + ->willReturn($this->appData); |
|
51 | + $this->logger = $this->createMock(LoggerInterface::class); |
|
52 | + |
|
53 | + $this->crypto = $this->createMock(ICrypto::class); |
|
54 | + $this->manager = $this->getManager(['generateKeyPair']); |
|
55 | + } |
|
56 | + |
|
57 | + /** |
|
58 | + * create manager object |
|
59 | + * |
|
60 | + * @param array $setMethods |
|
61 | + * @return Manager|\PHPUnit\Framework\MockObject\MockObject |
|
62 | + */ |
|
63 | + protected function getManager($setMethods = []) { |
|
64 | + if (empty($setMethods)) { |
|
65 | + return new Manager( |
|
66 | + $this->factory, |
|
67 | + $this->crypto, |
|
68 | + $this->config, |
|
69 | + $this->logger |
|
70 | + ); |
|
71 | + } else { |
|
72 | + return $this->getMockBuilder(Manager::class) |
|
73 | + ->setConstructorArgs([ |
|
74 | + $this->factory, |
|
75 | + $this->crypto, |
|
76 | + $this->config, |
|
77 | + $this->logger |
|
78 | + ]) |
|
79 | + ->onlyMethods($setMethods) |
|
80 | + ->getMock(); |
|
81 | + } |
|
82 | + } |
|
83 | + |
|
84 | + public function testGetKeyWithExistingKey(): void { |
|
85 | + $user = $this->createMock(IUser::class); |
|
86 | + $user |
|
87 | + ->expects($this->once()) |
|
88 | + ->method('getUID') |
|
89 | + ->willReturn('MyUid'); |
|
90 | + $folder = $this->createMock(ISimpleFolder::class); |
|
91 | + $privateFile = $this->createMock(ISimpleFile::class); |
|
92 | + $privateFile |
|
93 | + ->expects($this->once()) |
|
94 | + ->method('getContent') |
|
95 | + ->willReturn('EncryptedPrivateKey'); |
|
96 | + $publicFile = $this->createMock(ISimpleFile::class); |
|
97 | + $publicFile |
|
98 | + ->expects($this->once()) |
|
99 | + ->method('getContent') |
|
100 | + ->willReturn('MyPublicKey'); |
|
101 | + $this->crypto |
|
102 | + ->expects($this->once()) |
|
103 | + ->method('decrypt') |
|
104 | + ->with('EncryptedPrivateKey') |
|
105 | + ->willReturn('MyPrivateKey'); |
|
106 | + $folder |
|
107 | + ->expects($this->exactly(2)) |
|
108 | + ->method('getFile') |
|
109 | + ->willReturnMap([ |
|
110 | + ['private', $privateFile], |
|
111 | + ['public', $publicFile], |
|
112 | + ]); |
|
113 | + $this->appData |
|
114 | + ->expects($this->once()) |
|
115 | + ->method('getFolder') |
|
116 | + ->with('user-MyUid') |
|
117 | + ->willReturn($folder); |
|
118 | + |
|
119 | + $expected = new Key('MyPublicKey', 'MyPrivateKey'); |
|
120 | + $this->assertEquals($expected, $this->manager->getKey($user)); |
|
121 | + } |
|
122 | + |
|
123 | + public function testGetKeyWithNotExistingKey(): void { |
|
124 | + $user = $this->createMock(IUser::class); |
|
125 | + $user |
|
126 | + ->expects($this->once()) |
|
127 | + ->method('getUID') |
|
128 | + ->willReturn('MyUid'); |
|
129 | + $this->manager |
|
130 | + ->expects($this->once()) |
|
131 | + ->method('generateKeyPair') |
|
132 | + ->willReturn(['MyNewPublicKey', 'MyNewPrivateKey']); |
|
133 | + $this->appData |
|
134 | + ->expects($this->once()) |
|
135 | + ->method('newFolder') |
|
136 | + ->with('user-MyUid'); |
|
137 | + $folder = $this->createMock(ISimpleFolder::class); |
|
138 | + $this->crypto |
|
139 | + ->expects($this->once()) |
|
140 | + ->method('encrypt') |
|
141 | + ->with('MyNewPrivateKey') |
|
142 | + ->willReturn('MyNewEncryptedPrivateKey'); |
|
143 | + $privateFile = $this->createMock(ISimpleFile::class); |
|
144 | + $privateFile |
|
145 | + ->expects($this->once()) |
|
146 | + ->method('putContent') |
|
147 | + ->with('MyNewEncryptedPrivateKey'); |
|
148 | + $publicFile = $this->createMock(ISimpleFile::class); |
|
149 | + $publicFile |
|
150 | + ->expects($this->once()) |
|
151 | + ->method('putContent') |
|
152 | + ->with('MyNewPublicKey'); |
|
153 | + $folder |
|
154 | + ->expects($this->exactly(2)) |
|
155 | + ->method('newFile') |
|
156 | + ->willReturnMap([ |
|
157 | + ['private', null, $privateFile], |
|
158 | + ['public', null, $publicFile], |
|
159 | + ]); |
|
160 | + $this->appData |
|
161 | + ->expects($this->exactly(2)) |
|
162 | + ->method('getFolder') |
|
163 | + ->with('user-MyUid') |
|
164 | + ->willReturnOnConsecutiveCalls( |
|
165 | + $this->throwException(new \Exception()), |
|
166 | + $folder |
|
167 | + ); |
|
168 | + |
|
169 | + |
|
170 | + $expected = new Key('MyNewPublicKey', 'MyNewPrivateKey'); |
|
171 | + $this->assertEquals($expected, $this->manager->getKey($user)); |
|
172 | + } |
|
173 | + |
|
174 | + public function testGenerateKeyPair(): void { |
|
175 | + $manager = $this->getManager(); |
|
176 | + $data = 'MyTestData'; |
|
177 | + |
|
178 | + [$resultPublicKey, $resultPrivateKey] = self::invokePrivate($manager, 'generateKeyPair'); |
|
179 | + openssl_sign($data, $signature, $resultPrivateKey); |
|
180 | + $details = openssl_pkey_get_details(openssl_pkey_get_public($resultPublicKey)); |
|
181 | + |
|
182 | + $this->assertSame(1, openssl_verify($data, $signature, $resultPublicKey)); |
|
183 | + $this->assertSame(2048, $details['bits']); |
|
184 | + } |
|
185 | + |
|
186 | + public function testGetSystemKey(): void { |
|
187 | + $manager = $this->getManager(['retrieveKey']); |
|
188 | + |
|
189 | + /** @var Key|\PHPUnit\Framework\MockObject\MockObject $key */ |
|
190 | + $key = $this->createMock(Key::class); |
|
191 | + |
|
192 | + $this->config->expects($this->once())->method('getSystemValue') |
|
193 | + ->with('instanceid', null)->willReturn('instanceId'); |
|
194 | + |
|
195 | + $manager->expects($this->once())->method('retrieveKey')->with('system-instanceId') |
|
196 | + ->willReturn($key); |
|
197 | + |
|
198 | + $this->assertSame($key, $manager->getSystemKey()); |
|
199 | + } |
|
200 | + |
|
201 | + |
|
202 | + |
|
203 | + public function testGetSystemKeyFailure(): void { |
|
204 | + $this->expectException(\RuntimeException::class); |
|
205 | + |
|
206 | + $manager = $this->getManager(['retrieveKey']); |
|
207 | + |
|
208 | + /** @var Key|\PHPUnit\Framework\MockObject\MockObject $key */ |
|
209 | + $key = $this->createMock(Key::class); |
|
210 | + |
|
211 | + $this->config->expects($this->once())->method('getSystemValue') |
|
212 | + ->with('instanceid', null)->willReturn(null); |
|
213 | + |
|
214 | + $manager->getSystemKey(); |
|
215 | + } |
|
216 | 216 | } |
@@ -22,201 +22,201 @@ |
||
22 | 22 | use Test\TestCase; |
23 | 23 | |
24 | 24 | class ManagerTest extends TestCase { |
25 | - /** @var Manager|MockObject */ |
|
26 | - private $manager; |
|
27 | - /** @var LoggerInterface|MockObject */ |
|
28 | - private $logger; |
|
29 | - /** @var IDBConnection|MockObject */ |
|
30 | - private $l10n; |
|
31 | - /** @var IFactory|MockObject */ |
|
32 | - private $l10nFactory; |
|
33 | - /** @var IURLGenerator|MockObject */ |
|
34 | - private $url; |
|
35 | - /** @var IServerContainer|MockObject */ |
|
36 | - private $container; |
|
37 | - /** @var AuthorizedGroupMapper|MockObject */ |
|
38 | - private $mapper; |
|
39 | - /** @var IGroupManager|MockObject */ |
|
40 | - private $groupManager; |
|
41 | - /** @var ISubAdmin|MockObject */ |
|
42 | - private $subAdmin; |
|
43 | - |
|
44 | - protected function setUp(): void { |
|
45 | - parent::setUp(); |
|
46 | - |
|
47 | - $this->logger = $this->createMock(LoggerInterface::class); |
|
48 | - $this->l10n = $this->createMock(IL10N::class); |
|
49 | - $this->l10nFactory = $this->createMock(IFactory::class); |
|
50 | - $this->url = $this->createMock(IURLGenerator::class); |
|
51 | - $this->container = $this->createMock(IServerContainer::class); |
|
52 | - $this->mapper = $this->createMock(AuthorizedGroupMapper::class); |
|
53 | - $this->groupManager = $this->createMock(IGroupManager::class); |
|
54 | - $this->subAdmin = $this->createMock(ISubAdmin::class); |
|
55 | - |
|
56 | - $this->manager = new Manager( |
|
57 | - $this->logger, |
|
58 | - $this->l10nFactory, |
|
59 | - $this->url, |
|
60 | - $this->container, |
|
61 | - $this->mapper, |
|
62 | - $this->groupManager, |
|
63 | - $this->subAdmin, |
|
64 | - ); |
|
65 | - } |
|
66 | - |
|
67 | - public function testGetAdminSections(): void { |
|
68 | - $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class); |
|
69 | - |
|
70 | - $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
71 | - $this->container->method('get') |
|
72 | - ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
73 | - ->willReturn($section); |
|
74 | - |
|
75 | - $this->assertEquals([ |
|
76 | - 55 => [$section], |
|
77 | - ], $this->manager->getAdminSections()); |
|
78 | - } |
|
79 | - |
|
80 | - public function testGetPersonalSections(): void { |
|
81 | - $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class); |
|
82 | - |
|
83 | - $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
84 | - $this->container->method('get') |
|
85 | - ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
86 | - ->willReturn($section); |
|
87 | - |
|
88 | - $this->assertEquals([ |
|
89 | - 55 => [$section], |
|
90 | - ], $this->manager->getPersonalSections()); |
|
91 | - } |
|
92 | - |
|
93 | - public function testGetAdminSectionsEmptySection(): void { |
|
94 | - $this->assertEquals([], $this->manager->getAdminSections()); |
|
95 | - } |
|
96 | - |
|
97 | - public function testGetPersonalSectionsEmptySection(): void { |
|
98 | - $this->l10nFactory |
|
99 | - ->expects($this->once()) |
|
100 | - ->method('get') |
|
101 | - ->with('lib') |
|
102 | - ->willReturn($this->l10n); |
|
103 | - $this->l10n |
|
104 | - ->expects($this->any()) |
|
105 | - ->method('t') |
|
106 | - ->willReturnArgument(0); |
|
107 | - |
|
108 | - $this->assertEquals([], $this->manager->getPersonalSections()); |
|
109 | - } |
|
110 | - |
|
111 | - public function testGetAdminSettings(): void { |
|
112 | - $section = $this->createMock(ISettings::class); |
|
113 | - $section->method('getPriority') |
|
114 | - ->willReturn(13); |
|
115 | - $section->method('getSection') |
|
116 | - ->willReturn('sharing'); |
|
117 | - $this->container->method('get') |
|
118 | - ->with('myAdminClass') |
|
119 | - ->willReturn($section); |
|
120 | - |
|
121 | - $this->manager->registerSetting('admin', 'myAdminClass'); |
|
122 | - $settings = $this->manager->getAdminSettings('sharing'); |
|
123 | - |
|
124 | - $this->assertEquals([ |
|
125 | - 13 => [$section] |
|
126 | - ], $settings); |
|
127 | - } |
|
128 | - |
|
129 | - public function testGetAdminSettingsAsSubAdmin(): void { |
|
130 | - $section = $this->createMock(ISettings::class); |
|
131 | - $section->method('getPriority') |
|
132 | - ->willReturn(13); |
|
133 | - $section->method('getSection') |
|
134 | - ->willReturn('sharing'); |
|
135 | - $this->container->method('get') |
|
136 | - ->with('myAdminClass') |
|
137 | - ->willReturn($section); |
|
138 | - |
|
139 | - $this->manager->registerSetting('admin', 'myAdminClass'); |
|
140 | - $settings = $this->manager->getAdminSettings('sharing', true); |
|
141 | - |
|
142 | - $this->assertEquals([], $settings); |
|
143 | - } |
|
144 | - |
|
145 | - public function testGetSubAdminSettingsAsSubAdmin(): void { |
|
146 | - $section = $this->createMock(ISubAdminSettings::class); |
|
147 | - $section->method('getPriority') |
|
148 | - ->willReturn(13); |
|
149 | - $section->method('getSection') |
|
150 | - ->willReturn('sharing'); |
|
151 | - $this->container->expects($this->once()) |
|
152 | - ->method('get') |
|
153 | - ->with('mySubAdminClass') |
|
154 | - ->willReturn($section); |
|
155 | - |
|
156 | - $this->manager->registerSetting('admin', 'mySubAdminClass'); |
|
157 | - $settings = $this->manager->getAdminSettings('sharing', true); |
|
158 | - |
|
159 | - $this->assertEquals([ |
|
160 | - 13 => [$section] |
|
161 | - ], $settings); |
|
162 | - } |
|
163 | - |
|
164 | - public function testGetPersonalSettings(): void { |
|
165 | - $section = $this->createMock(ISettings::class); |
|
166 | - $section->method('getPriority') |
|
167 | - ->willReturn(16); |
|
168 | - $section->method('getSection') |
|
169 | - ->willReturn('security'); |
|
170 | - $section2 = $this->createMock(ISettings::class); |
|
171 | - $section2->method('getPriority') |
|
172 | - ->willReturn(100); |
|
173 | - $section2->method('getSection') |
|
174 | - ->willReturn('security'); |
|
175 | - |
|
176 | - $this->manager->registerSetting('personal', 'section1'); |
|
177 | - $this->manager->registerSetting('personal', 'section2'); |
|
178 | - |
|
179 | - $this->container->expects($this->exactly(2)) |
|
180 | - ->method('get') |
|
181 | - ->willReturnMap([ |
|
182 | - ['section1', $section], |
|
183 | - ['section2', $section2], |
|
184 | - ]); |
|
185 | - |
|
186 | - $settings = $this->manager->getPersonalSettings('security'); |
|
187 | - |
|
188 | - $this->assertEquals([ |
|
189 | - 16 => [$section], |
|
190 | - 100 => [$section2], |
|
191 | - ], $settings); |
|
192 | - } |
|
193 | - |
|
194 | - public function testSameSectionAsPersonalAndAdmin(): void { |
|
195 | - $this->l10nFactory |
|
196 | - ->expects($this->once()) |
|
197 | - ->method('get') |
|
198 | - ->with('lib') |
|
199 | - ->willReturn($this->l10n); |
|
200 | - $this->l10n |
|
201 | - ->expects($this->any()) |
|
202 | - ->method('t') |
|
203 | - ->willReturnArgument(0); |
|
204 | - |
|
205 | - $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class); |
|
206 | - $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class); |
|
207 | - |
|
208 | - |
|
209 | - $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
210 | - $this->container->method('get') |
|
211 | - ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
212 | - ->willReturn($section); |
|
213 | - |
|
214 | - $this->assertEquals([ |
|
215 | - 55 => [$section], |
|
216 | - ], $this->manager->getPersonalSections()); |
|
217 | - |
|
218 | - $this->assertEquals([ |
|
219 | - 55 => [$section], |
|
220 | - ], $this->manager->getAdminSections()); |
|
221 | - } |
|
25 | + /** @var Manager|MockObject */ |
|
26 | + private $manager; |
|
27 | + /** @var LoggerInterface|MockObject */ |
|
28 | + private $logger; |
|
29 | + /** @var IDBConnection|MockObject */ |
|
30 | + private $l10n; |
|
31 | + /** @var IFactory|MockObject */ |
|
32 | + private $l10nFactory; |
|
33 | + /** @var IURLGenerator|MockObject */ |
|
34 | + private $url; |
|
35 | + /** @var IServerContainer|MockObject */ |
|
36 | + private $container; |
|
37 | + /** @var AuthorizedGroupMapper|MockObject */ |
|
38 | + private $mapper; |
|
39 | + /** @var IGroupManager|MockObject */ |
|
40 | + private $groupManager; |
|
41 | + /** @var ISubAdmin|MockObject */ |
|
42 | + private $subAdmin; |
|
43 | + |
|
44 | + protected function setUp(): void { |
|
45 | + parent::setUp(); |
|
46 | + |
|
47 | + $this->logger = $this->createMock(LoggerInterface::class); |
|
48 | + $this->l10n = $this->createMock(IL10N::class); |
|
49 | + $this->l10nFactory = $this->createMock(IFactory::class); |
|
50 | + $this->url = $this->createMock(IURLGenerator::class); |
|
51 | + $this->container = $this->createMock(IServerContainer::class); |
|
52 | + $this->mapper = $this->createMock(AuthorizedGroupMapper::class); |
|
53 | + $this->groupManager = $this->createMock(IGroupManager::class); |
|
54 | + $this->subAdmin = $this->createMock(ISubAdmin::class); |
|
55 | + |
|
56 | + $this->manager = new Manager( |
|
57 | + $this->logger, |
|
58 | + $this->l10nFactory, |
|
59 | + $this->url, |
|
60 | + $this->container, |
|
61 | + $this->mapper, |
|
62 | + $this->groupManager, |
|
63 | + $this->subAdmin, |
|
64 | + ); |
|
65 | + } |
|
66 | + |
|
67 | + public function testGetAdminSections(): void { |
|
68 | + $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class); |
|
69 | + |
|
70 | + $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
71 | + $this->container->method('get') |
|
72 | + ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
73 | + ->willReturn($section); |
|
74 | + |
|
75 | + $this->assertEquals([ |
|
76 | + 55 => [$section], |
|
77 | + ], $this->manager->getAdminSections()); |
|
78 | + } |
|
79 | + |
|
80 | + public function testGetPersonalSections(): void { |
|
81 | + $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class); |
|
82 | + |
|
83 | + $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
84 | + $this->container->method('get') |
|
85 | + ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
86 | + ->willReturn($section); |
|
87 | + |
|
88 | + $this->assertEquals([ |
|
89 | + 55 => [$section], |
|
90 | + ], $this->manager->getPersonalSections()); |
|
91 | + } |
|
92 | + |
|
93 | + public function testGetAdminSectionsEmptySection(): void { |
|
94 | + $this->assertEquals([], $this->manager->getAdminSections()); |
|
95 | + } |
|
96 | + |
|
97 | + public function testGetPersonalSectionsEmptySection(): void { |
|
98 | + $this->l10nFactory |
|
99 | + ->expects($this->once()) |
|
100 | + ->method('get') |
|
101 | + ->with('lib') |
|
102 | + ->willReturn($this->l10n); |
|
103 | + $this->l10n |
|
104 | + ->expects($this->any()) |
|
105 | + ->method('t') |
|
106 | + ->willReturnArgument(0); |
|
107 | + |
|
108 | + $this->assertEquals([], $this->manager->getPersonalSections()); |
|
109 | + } |
|
110 | + |
|
111 | + public function testGetAdminSettings(): void { |
|
112 | + $section = $this->createMock(ISettings::class); |
|
113 | + $section->method('getPriority') |
|
114 | + ->willReturn(13); |
|
115 | + $section->method('getSection') |
|
116 | + ->willReturn('sharing'); |
|
117 | + $this->container->method('get') |
|
118 | + ->with('myAdminClass') |
|
119 | + ->willReturn($section); |
|
120 | + |
|
121 | + $this->manager->registerSetting('admin', 'myAdminClass'); |
|
122 | + $settings = $this->manager->getAdminSettings('sharing'); |
|
123 | + |
|
124 | + $this->assertEquals([ |
|
125 | + 13 => [$section] |
|
126 | + ], $settings); |
|
127 | + } |
|
128 | + |
|
129 | + public function testGetAdminSettingsAsSubAdmin(): void { |
|
130 | + $section = $this->createMock(ISettings::class); |
|
131 | + $section->method('getPriority') |
|
132 | + ->willReturn(13); |
|
133 | + $section->method('getSection') |
|
134 | + ->willReturn('sharing'); |
|
135 | + $this->container->method('get') |
|
136 | + ->with('myAdminClass') |
|
137 | + ->willReturn($section); |
|
138 | + |
|
139 | + $this->manager->registerSetting('admin', 'myAdminClass'); |
|
140 | + $settings = $this->manager->getAdminSettings('sharing', true); |
|
141 | + |
|
142 | + $this->assertEquals([], $settings); |
|
143 | + } |
|
144 | + |
|
145 | + public function testGetSubAdminSettingsAsSubAdmin(): void { |
|
146 | + $section = $this->createMock(ISubAdminSettings::class); |
|
147 | + $section->method('getPriority') |
|
148 | + ->willReturn(13); |
|
149 | + $section->method('getSection') |
|
150 | + ->willReturn('sharing'); |
|
151 | + $this->container->expects($this->once()) |
|
152 | + ->method('get') |
|
153 | + ->with('mySubAdminClass') |
|
154 | + ->willReturn($section); |
|
155 | + |
|
156 | + $this->manager->registerSetting('admin', 'mySubAdminClass'); |
|
157 | + $settings = $this->manager->getAdminSettings('sharing', true); |
|
158 | + |
|
159 | + $this->assertEquals([ |
|
160 | + 13 => [$section] |
|
161 | + ], $settings); |
|
162 | + } |
|
163 | + |
|
164 | + public function testGetPersonalSettings(): void { |
|
165 | + $section = $this->createMock(ISettings::class); |
|
166 | + $section->method('getPriority') |
|
167 | + ->willReturn(16); |
|
168 | + $section->method('getSection') |
|
169 | + ->willReturn('security'); |
|
170 | + $section2 = $this->createMock(ISettings::class); |
|
171 | + $section2->method('getPriority') |
|
172 | + ->willReturn(100); |
|
173 | + $section2->method('getSection') |
|
174 | + ->willReturn('security'); |
|
175 | + |
|
176 | + $this->manager->registerSetting('personal', 'section1'); |
|
177 | + $this->manager->registerSetting('personal', 'section2'); |
|
178 | + |
|
179 | + $this->container->expects($this->exactly(2)) |
|
180 | + ->method('get') |
|
181 | + ->willReturnMap([ |
|
182 | + ['section1', $section], |
|
183 | + ['section2', $section2], |
|
184 | + ]); |
|
185 | + |
|
186 | + $settings = $this->manager->getPersonalSettings('security'); |
|
187 | + |
|
188 | + $this->assertEquals([ |
|
189 | + 16 => [$section], |
|
190 | + 100 => [$section2], |
|
191 | + ], $settings); |
|
192 | + } |
|
193 | + |
|
194 | + public function testSameSectionAsPersonalAndAdmin(): void { |
|
195 | + $this->l10nFactory |
|
196 | + ->expects($this->once()) |
|
197 | + ->method('get') |
|
198 | + ->with('lib') |
|
199 | + ->willReturn($this->l10n); |
|
200 | + $this->l10n |
|
201 | + ->expects($this->any()) |
|
202 | + ->method('t') |
|
203 | + ->willReturnArgument(0); |
|
204 | + |
|
205 | + $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class); |
|
206 | + $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class); |
|
207 | + |
|
208 | + |
|
209 | + $section = \OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class); |
|
210 | + $this->container->method('get') |
|
211 | + ->with(\OCA\WorkflowEngine\Settings\Section::class) |
|
212 | + ->willReturn($section); |
|
213 | + |
|
214 | + $this->assertEquals([ |
|
215 | + 55 => [$section], |
|
216 | + ], $this->manager->getPersonalSections()); |
|
217 | + |
|
218 | + $this->assertEquals([ |
|
219 | + 55 => [$section], |
|
220 | + ], $this->manager->getAdminSections()); |
|
221 | + } |
|
222 | 222 | } |
@@ -10,184 +10,184 @@ |
||
10 | 10 | use OC\OCS\Provider; |
11 | 11 | |
12 | 12 | class ProviderTest extends \Test\TestCase { |
13 | - /** @var \OCP\IRequest */ |
|
14 | - private $request; |
|
15 | - /** @var \OCP\App\IAppManager */ |
|
16 | - private $appManager; |
|
17 | - /** @var Provider */ |
|
18 | - private $ocsProvider; |
|
19 | - |
|
20 | - protected function setUp(): void { |
|
21 | - parent::setUp(); |
|
22 | - |
|
23 | - $this->request = $this->getMockBuilder('\\OCP\\IRequest')->getMock(); |
|
24 | - $this->appManager = $this->getMockBuilder('\\OCP\\App\\IAppManager')->getMock(); |
|
25 | - $this->ocsProvider = new Provider('ocs_provider', $this->request, $this->appManager); |
|
26 | - } |
|
27 | - |
|
28 | - public function testBuildProviderListWithoutAnythingEnabled(): void { |
|
29 | - $this->appManager |
|
30 | - ->expects($this->exactly(4)) |
|
31 | - ->method('isEnabledForUser') |
|
32 | - ->willReturnMap([ |
|
33 | - ['files_sharing', null, false], |
|
34 | - ['federation', null, false], |
|
35 | - ['activity', null, false], |
|
36 | - ['provisioning_api', null, false], |
|
37 | - ]); |
|
38 | - |
|
39 | - $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
40 | - [ |
|
41 | - 'version' => 2, |
|
42 | - 'services' => [ |
|
43 | - 'PRIVATE_DATA' => [ |
|
44 | - 'version' => 1, |
|
45 | - 'endpoints' => [ |
|
46 | - 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
47 | - 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
48 | - 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
49 | - ], |
|
50 | - ], |
|
51 | - ], |
|
52 | - ] |
|
53 | - ); |
|
54 | - |
|
55 | - $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
56 | - } |
|
57 | - |
|
58 | - public function testBuildProviderListWithSharingEnabled(): void { |
|
59 | - $this->appManager |
|
60 | - ->expects($this->exactly(4)) |
|
61 | - ->method('isEnabledForUser') |
|
62 | - ->willReturnMap([ |
|
63 | - ['files_sharing', null, true], |
|
64 | - ['federation', null, false], |
|
65 | - ['activity', null, false], |
|
66 | - ['provisioning_api', null, false], |
|
67 | - ]); |
|
68 | - |
|
69 | - $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
70 | - [ |
|
71 | - 'version' => 2, |
|
72 | - 'services' => [ |
|
73 | - 'PRIVATE_DATA' => [ |
|
74 | - 'version' => 1, |
|
75 | - 'endpoints' => [ |
|
76 | - 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
77 | - 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
78 | - 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
79 | - ], |
|
80 | - ], |
|
81 | - 'FEDERATED_SHARING' => [ |
|
82 | - 'version' => 1, |
|
83 | - 'endpoints' => [ |
|
84 | - 'share' => '/ocs/v2.php/cloud/shares', |
|
85 | - 'webdav' => '/public.php/webdav/', |
|
86 | - ], |
|
87 | - ], |
|
88 | - 'SHARING' => [ |
|
89 | - 'version' => 1, |
|
90 | - 'endpoints' => [ |
|
91 | - 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', |
|
92 | - ], |
|
93 | - ], |
|
94 | - ], |
|
95 | - ] |
|
96 | - ); |
|
97 | - |
|
98 | - $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
99 | - } |
|
100 | - |
|
101 | - public function testBuildProviderListWithFederationEnabled(): void { |
|
102 | - $this->appManager |
|
103 | - ->expects($this->exactly(4)) |
|
104 | - ->method('isEnabledForUser') |
|
105 | - ->willReturnMap([ |
|
106 | - ['files_sharing', null, false], |
|
107 | - ['federation', null, true], |
|
108 | - ['activity', null, false], |
|
109 | - ['provisioning_api', null, false], |
|
110 | - ]); |
|
111 | - |
|
112 | - $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
113 | - [ |
|
114 | - 'version' => 2, |
|
115 | - 'services' => [ |
|
116 | - 'PRIVATE_DATA' => [ |
|
117 | - 'version' => 1, |
|
118 | - 'endpoints' => [ |
|
119 | - 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
120 | - 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
121 | - 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
122 | - ], |
|
123 | - ], |
|
124 | - 'FEDERATED_SHARING' => [ |
|
125 | - 'version' => 1, |
|
126 | - 'endpoints' => [ |
|
127 | - 'shared-secret' => '/ocs/v2.php/cloud/shared-secret', |
|
128 | - 'system-address-book' => '/remote.php/dav/addressbooks/system/system/system', |
|
129 | - 'carddav-user' => 'system' |
|
130 | - ], |
|
131 | - ], |
|
132 | - ], |
|
133 | - ] |
|
134 | - ); |
|
135 | - |
|
136 | - $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
137 | - } |
|
138 | - |
|
139 | - public function testBuildProviderListWithEverythingEnabled(): void { |
|
140 | - $this->appManager |
|
141 | - ->expects($this->any()) |
|
142 | - ->method('isEnabledForUser') |
|
143 | - ->willReturn(true); |
|
144 | - |
|
145 | - $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
146 | - [ |
|
147 | - 'version' => 2, |
|
148 | - 'services' => [ |
|
149 | - 'PRIVATE_DATA' => [ |
|
150 | - 'version' => 1, |
|
151 | - 'endpoints' => [ |
|
152 | - 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
153 | - 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
154 | - 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
155 | - ], |
|
156 | - ], |
|
157 | - 'FEDERATED_SHARING' => [ |
|
158 | - 'version' => 1, |
|
159 | - 'endpoints' => [ |
|
160 | - 'share' => '/ocs/v2.php/cloud/shares', |
|
161 | - 'webdav' => '/public.php/webdav/', |
|
162 | - 'shared-secret' => '/ocs/v2.php/cloud/shared-secret', |
|
163 | - 'system-address-book' => '/remote.php/dav/addressbooks/system/system/system', |
|
164 | - 'carddav-user' => 'system' |
|
165 | - ], |
|
166 | - ], |
|
167 | - 'SHARING' => [ |
|
168 | - 'version' => 1, |
|
169 | - 'endpoints' => [ |
|
170 | - 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', |
|
171 | - ], |
|
172 | - ], |
|
173 | - 'ACTIVITY' => [ |
|
174 | - 'version' => 1, |
|
175 | - 'endpoints' => [ |
|
176 | - 'list' => '/ocs/v2.php/cloud/activity', |
|
177 | - ], |
|
178 | - ], |
|
179 | - 'PROVISIONING' => [ |
|
180 | - 'version' => 1, |
|
181 | - 'endpoints' => [ |
|
182 | - 'user' => '/ocs/v2.php/cloud/users', |
|
183 | - 'groups' => '/ocs/v2.php/cloud/groups', |
|
184 | - 'apps' => '/ocs/v2.php/cloud/apps', |
|
185 | - ], |
|
186 | - ], |
|
187 | - ], |
|
188 | - ] |
|
189 | - ); |
|
190 | - |
|
191 | - $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
192 | - } |
|
13 | + /** @var \OCP\IRequest */ |
|
14 | + private $request; |
|
15 | + /** @var \OCP\App\IAppManager */ |
|
16 | + private $appManager; |
|
17 | + /** @var Provider */ |
|
18 | + private $ocsProvider; |
|
19 | + |
|
20 | + protected function setUp(): void { |
|
21 | + parent::setUp(); |
|
22 | + |
|
23 | + $this->request = $this->getMockBuilder('\\OCP\\IRequest')->getMock(); |
|
24 | + $this->appManager = $this->getMockBuilder('\\OCP\\App\\IAppManager')->getMock(); |
|
25 | + $this->ocsProvider = new Provider('ocs_provider', $this->request, $this->appManager); |
|
26 | + } |
|
27 | + |
|
28 | + public function testBuildProviderListWithoutAnythingEnabled(): void { |
|
29 | + $this->appManager |
|
30 | + ->expects($this->exactly(4)) |
|
31 | + ->method('isEnabledForUser') |
|
32 | + ->willReturnMap([ |
|
33 | + ['files_sharing', null, false], |
|
34 | + ['federation', null, false], |
|
35 | + ['activity', null, false], |
|
36 | + ['provisioning_api', null, false], |
|
37 | + ]); |
|
38 | + |
|
39 | + $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
40 | + [ |
|
41 | + 'version' => 2, |
|
42 | + 'services' => [ |
|
43 | + 'PRIVATE_DATA' => [ |
|
44 | + 'version' => 1, |
|
45 | + 'endpoints' => [ |
|
46 | + 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
47 | + 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
48 | + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
49 | + ], |
|
50 | + ], |
|
51 | + ], |
|
52 | + ] |
|
53 | + ); |
|
54 | + |
|
55 | + $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
56 | + } |
|
57 | + |
|
58 | + public function testBuildProviderListWithSharingEnabled(): void { |
|
59 | + $this->appManager |
|
60 | + ->expects($this->exactly(4)) |
|
61 | + ->method('isEnabledForUser') |
|
62 | + ->willReturnMap([ |
|
63 | + ['files_sharing', null, true], |
|
64 | + ['federation', null, false], |
|
65 | + ['activity', null, false], |
|
66 | + ['provisioning_api', null, false], |
|
67 | + ]); |
|
68 | + |
|
69 | + $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
70 | + [ |
|
71 | + 'version' => 2, |
|
72 | + 'services' => [ |
|
73 | + 'PRIVATE_DATA' => [ |
|
74 | + 'version' => 1, |
|
75 | + 'endpoints' => [ |
|
76 | + 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
77 | + 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
78 | + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
79 | + ], |
|
80 | + ], |
|
81 | + 'FEDERATED_SHARING' => [ |
|
82 | + 'version' => 1, |
|
83 | + 'endpoints' => [ |
|
84 | + 'share' => '/ocs/v2.php/cloud/shares', |
|
85 | + 'webdav' => '/public.php/webdav/', |
|
86 | + ], |
|
87 | + ], |
|
88 | + 'SHARING' => [ |
|
89 | + 'version' => 1, |
|
90 | + 'endpoints' => [ |
|
91 | + 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', |
|
92 | + ], |
|
93 | + ], |
|
94 | + ], |
|
95 | + ] |
|
96 | + ); |
|
97 | + |
|
98 | + $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
99 | + } |
|
100 | + |
|
101 | + public function testBuildProviderListWithFederationEnabled(): void { |
|
102 | + $this->appManager |
|
103 | + ->expects($this->exactly(4)) |
|
104 | + ->method('isEnabledForUser') |
|
105 | + ->willReturnMap([ |
|
106 | + ['files_sharing', null, false], |
|
107 | + ['federation', null, true], |
|
108 | + ['activity', null, false], |
|
109 | + ['provisioning_api', null, false], |
|
110 | + ]); |
|
111 | + |
|
112 | + $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
113 | + [ |
|
114 | + 'version' => 2, |
|
115 | + 'services' => [ |
|
116 | + 'PRIVATE_DATA' => [ |
|
117 | + 'version' => 1, |
|
118 | + 'endpoints' => [ |
|
119 | + 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
120 | + 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
121 | + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
122 | + ], |
|
123 | + ], |
|
124 | + 'FEDERATED_SHARING' => [ |
|
125 | + 'version' => 1, |
|
126 | + 'endpoints' => [ |
|
127 | + 'shared-secret' => '/ocs/v2.php/cloud/shared-secret', |
|
128 | + 'system-address-book' => '/remote.php/dav/addressbooks/system/system/system', |
|
129 | + 'carddav-user' => 'system' |
|
130 | + ], |
|
131 | + ], |
|
132 | + ], |
|
133 | + ] |
|
134 | + ); |
|
135 | + |
|
136 | + $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
137 | + } |
|
138 | + |
|
139 | + public function testBuildProviderListWithEverythingEnabled(): void { |
|
140 | + $this->appManager |
|
141 | + ->expects($this->any()) |
|
142 | + ->method('isEnabledForUser') |
|
143 | + ->willReturn(true); |
|
144 | + |
|
145 | + $expected = new \OCP\AppFramework\Http\JSONResponse( |
|
146 | + [ |
|
147 | + 'version' => 2, |
|
148 | + 'services' => [ |
|
149 | + 'PRIVATE_DATA' => [ |
|
150 | + 'version' => 1, |
|
151 | + 'endpoints' => [ |
|
152 | + 'store' => '/ocs/v2.php/privatedata/setattribute', |
|
153 | + 'read' => '/ocs/v2.php/privatedata/getattribute', |
|
154 | + 'delete' => '/ocs/v2.php/privatedata/deleteattribute', |
|
155 | + ], |
|
156 | + ], |
|
157 | + 'FEDERATED_SHARING' => [ |
|
158 | + 'version' => 1, |
|
159 | + 'endpoints' => [ |
|
160 | + 'share' => '/ocs/v2.php/cloud/shares', |
|
161 | + 'webdav' => '/public.php/webdav/', |
|
162 | + 'shared-secret' => '/ocs/v2.php/cloud/shared-secret', |
|
163 | + 'system-address-book' => '/remote.php/dav/addressbooks/system/system/system', |
|
164 | + 'carddav-user' => 'system' |
|
165 | + ], |
|
166 | + ], |
|
167 | + 'SHARING' => [ |
|
168 | + 'version' => 1, |
|
169 | + 'endpoints' => [ |
|
170 | + 'share' => '/ocs/v2.php/apps/files_sharing/api/v1/shares', |
|
171 | + ], |
|
172 | + ], |
|
173 | + 'ACTIVITY' => [ |
|
174 | + 'version' => 1, |
|
175 | + 'endpoints' => [ |
|
176 | + 'list' => '/ocs/v2.php/cloud/activity', |
|
177 | + ], |
|
178 | + ], |
|
179 | + 'PROVISIONING' => [ |
|
180 | + 'version' => 1, |
|
181 | + 'endpoints' => [ |
|
182 | + 'user' => '/ocs/v2.php/cloud/users', |
|
183 | + 'groups' => '/ocs/v2.php/cloud/groups', |
|
184 | + 'apps' => '/ocs/v2.php/cloud/apps', |
|
185 | + ], |
|
186 | + ], |
|
187 | + ], |
|
188 | + ] |
|
189 | + ); |
|
190 | + |
|
191 | + $this->assertEquals($expected, $this->ocsProvider->buildProviderList()); |
|
192 | + } |
|
193 | 193 | } |
@@ -20,92 +20,92 @@ discard block |
||
20 | 20 | use Test\TestCase; |
21 | 21 | |
22 | 22 | class ChangesCheckTest extends TestCase { |
23 | - /** @var IClientService|\PHPUnit\Framework\MockObject\MockObject */ |
|
24 | - protected $clientService; |
|
25 | - |
|
26 | - /** @var ChangesCheck */ |
|
27 | - protected $checker; |
|
28 | - |
|
29 | - /** @var ChangesMapper|\PHPUnit\Framework\MockObject\MockObject */ |
|
30 | - protected $mapper; |
|
31 | - |
|
32 | - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ |
|
33 | - protected $logger; |
|
34 | - |
|
35 | - protected function setUp(): void { |
|
36 | - parent::setUp(); |
|
37 | - |
|
38 | - $this->clientService = $this->createMock(IClientService::class); |
|
39 | - $this->mapper = $this->createMock(ChangesMapper::class); |
|
40 | - $this->logger = $this->createMock(LoggerInterface::class); |
|
41 | - |
|
42 | - $this->checker = new ChangesCheck($this->clientService, $this->mapper, $this->logger); |
|
43 | - } |
|
44 | - |
|
45 | - public static function statusCodeProvider(): array { |
|
46 | - return [ |
|
47 | - [200, ChangesCheck::RESPONSE_HAS_CONTENT], |
|
48 | - [304, ChangesCheck::RESPONSE_USE_CACHE], |
|
49 | - [404, ChangesCheck::RESPONSE_NO_CONTENT], |
|
50 | - [418, ChangesCheck::RESPONSE_NO_CONTENT], |
|
51 | - ]; |
|
52 | - } |
|
53 | - |
|
54 | - /** |
|
55 | - * @dataProvider statusCodeProvider |
|
56 | - */ |
|
57 | - public function testEvaluateResponse(int $statusCode, int $expected): void { |
|
58 | - $response = $this->createMock(IResponse::class); |
|
59 | - $response->expects($this->atLeastOnce()) |
|
60 | - ->method('getStatusCode') |
|
61 | - ->willReturn($statusCode); |
|
62 | - |
|
63 | - if (!in_array($statusCode, [200, 304, 404])) { |
|
64 | - $this->logger->expects($this->once()) |
|
65 | - ->method('debug'); |
|
66 | - } |
|
67 | - |
|
68 | - $evaluation = $this->invokePrivate($this->checker, 'evaluateResponse', [$response]); |
|
69 | - $this->assertSame($expected, $evaluation); |
|
70 | - } |
|
71 | - |
|
72 | - public function testCacheResultInsert(): void { |
|
73 | - $version = '13.0.4'; |
|
74 | - $entry = $this->createMock(Changes::class); |
|
75 | - $entry->expects($this->exactly(2)) |
|
76 | - ->method('__call') |
|
77 | - ->willReturnMap([ |
|
78 | - ['getVersion', [], ''], |
|
79 | - ['setVersion', [$version], null], |
|
80 | - ]); |
|
81 | - |
|
82 | - $this->mapper->expects($this->once()) |
|
83 | - ->method('insert'); |
|
84 | - $this->mapper->expects($this->never()) |
|
85 | - ->method('update'); |
|
86 | - |
|
87 | - $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); |
|
88 | - } |
|
89 | - |
|
90 | - public function testCacheResultUpdate(): void { |
|
91 | - $version = '13.0.4'; |
|
92 | - $entry = $this->createMock(Changes::class); |
|
93 | - $entry->expects($this->once()) |
|
94 | - ->method('__call') |
|
95 | - ->willReturn($version); |
|
96 | - |
|
97 | - $this->mapper->expects($this->never()) |
|
98 | - ->method('insert'); |
|
99 | - $this->mapper->expects($this->once()) |
|
100 | - ->method('update'); |
|
101 | - |
|
102 | - $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); |
|
103 | - } |
|
104 | - |
|
105 | - public static function changesXMLProvider(): array { |
|
106 | - return [ |
|
107 | - [ # 0 - full example |
|
108 | - '<?xml version="1.0" encoding="utf-8" ?> |
|
23 | + /** @var IClientService|\PHPUnit\Framework\MockObject\MockObject */ |
|
24 | + protected $clientService; |
|
25 | + |
|
26 | + /** @var ChangesCheck */ |
|
27 | + protected $checker; |
|
28 | + |
|
29 | + /** @var ChangesMapper|\PHPUnit\Framework\MockObject\MockObject */ |
|
30 | + protected $mapper; |
|
31 | + |
|
32 | + /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ |
|
33 | + protected $logger; |
|
34 | + |
|
35 | + protected function setUp(): void { |
|
36 | + parent::setUp(); |
|
37 | + |
|
38 | + $this->clientService = $this->createMock(IClientService::class); |
|
39 | + $this->mapper = $this->createMock(ChangesMapper::class); |
|
40 | + $this->logger = $this->createMock(LoggerInterface::class); |
|
41 | + |
|
42 | + $this->checker = new ChangesCheck($this->clientService, $this->mapper, $this->logger); |
|
43 | + } |
|
44 | + |
|
45 | + public static function statusCodeProvider(): array { |
|
46 | + return [ |
|
47 | + [200, ChangesCheck::RESPONSE_HAS_CONTENT], |
|
48 | + [304, ChangesCheck::RESPONSE_USE_CACHE], |
|
49 | + [404, ChangesCheck::RESPONSE_NO_CONTENT], |
|
50 | + [418, ChangesCheck::RESPONSE_NO_CONTENT], |
|
51 | + ]; |
|
52 | + } |
|
53 | + |
|
54 | + /** |
|
55 | + * @dataProvider statusCodeProvider |
|
56 | + */ |
|
57 | + public function testEvaluateResponse(int $statusCode, int $expected): void { |
|
58 | + $response = $this->createMock(IResponse::class); |
|
59 | + $response->expects($this->atLeastOnce()) |
|
60 | + ->method('getStatusCode') |
|
61 | + ->willReturn($statusCode); |
|
62 | + |
|
63 | + if (!in_array($statusCode, [200, 304, 404])) { |
|
64 | + $this->logger->expects($this->once()) |
|
65 | + ->method('debug'); |
|
66 | + } |
|
67 | + |
|
68 | + $evaluation = $this->invokePrivate($this->checker, 'evaluateResponse', [$response]); |
|
69 | + $this->assertSame($expected, $evaluation); |
|
70 | + } |
|
71 | + |
|
72 | + public function testCacheResultInsert(): void { |
|
73 | + $version = '13.0.4'; |
|
74 | + $entry = $this->createMock(Changes::class); |
|
75 | + $entry->expects($this->exactly(2)) |
|
76 | + ->method('__call') |
|
77 | + ->willReturnMap([ |
|
78 | + ['getVersion', [], ''], |
|
79 | + ['setVersion', [$version], null], |
|
80 | + ]); |
|
81 | + |
|
82 | + $this->mapper->expects($this->once()) |
|
83 | + ->method('insert'); |
|
84 | + $this->mapper->expects($this->never()) |
|
85 | + ->method('update'); |
|
86 | + |
|
87 | + $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); |
|
88 | + } |
|
89 | + |
|
90 | + public function testCacheResultUpdate(): void { |
|
91 | + $version = '13.0.4'; |
|
92 | + $entry = $this->createMock(Changes::class); |
|
93 | + $entry->expects($this->once()) |
|
94 | + ->method('__call') |
|
95 | + ->willReturn($version); |
|
96 | + |
|
97 | + $this->mapper->expects($this->never()) |
|
98 | + ->method('insert'); |
|
99 | + $this->mapper->expects($this->once()) |
|
100 | + ->method('update'); |
|
101 | + |
|
102 | + $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); |
|
103 | + } |
|
104 | + |
|
105 | + public static function changesXMLProvider(): array { |
|
106 | + return [ |
|
107 | + [ # 0 - full example |
|
108 | + '<?xml version="1.0" encoding="utf-8" ?> |
|
109 | 109 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
110 | 110 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
111 | 111 | version="13.0.0"> |
@@ -133,36 +133,36 @@ discard block |
||
133 | 133 | </admin> |
134 | 134 | </whatsNew> |
135 | 135 | </release>', |
136 | - [ |
|
137 | - 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
138 | - 'whatsNew' => [ |
|
139 | - 'en' => [ |
|
140 | - 'regular' => [ |
|
141 | - 'Refined user interface', |
|
142 | - 'End-to-end Encryption', |
|
143 | - 'Video and Text Chat' |
|
144 | - ], |
|
145 | - 'admin' => [ |
|
146 | - 'Changes to the Nginx configuration', |
|
147 | - 'Theming: CSS files were consolidated' |
|
148 | - ], |
|
149 | - ], |
|
150 | - 'de' => [ |
|
151 | - 'regular' => [ |
|
152 | - 'Überarbeitete Benutzerschnittstelle', |
|
153 | - 'Ende-zu-Ende Verschlüsselung', |
|
154 | - 'Video- und Text-Chat' |
|
155 | - ], |
|
156 | - 'admin' => [ |
|
157 | - 'Änderungen an der Nginx Konfiguration', |
|
158 | - 'Theming: CSS Dateien wurden konsolidiert' |
|
159 | - ], |
|
160 | - ], |
|
161 | - ], |
|
162 | - ] |
|
163 | - ], |
|
164 | - [ # 1- admin part not translated |
|
165 | - '<?xml version="1.0" encoding="utf-8" ?> |
|
136 | + [ |
|
137 | + 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
138 | + 'whatsNew' => [ |
|
139 | + 'en' => [ |
|
140 | + 'regular' => [ |
|
141 | + 'Refined user interface', |
|
142 | + 'End-to-end Encryption', |
|
143 | + 'Video and Text Chat' |
|
144 | + ], |
|
145 | + 'admin' => [ |
|
146 | + 'Changes to the Nginx configuration', |
|
147 | + 'Theming: CSS files were consolidated' |
|
148 | + ], |
|
149 | + ], |
|
150 | + 'de' => [ |
|
151 | + 'regular' => [ |
|
152 | + 'Überarbeitete Benutzerschnittstelle', |
|
153 | + 'Ende-zu-Ende Verschlüsselung', |
|
154 | + 'Video- und Text-Chat' |
|
155 | + ], |
|
156 | + 'admin' => [ |
|
157 | + 'Änderungen an der Nginx Konfiguration', |
|
158 | + 'Theming: CSS Dateien wurden konsolidiert' |
|
159 | + ], |
|
160 | + ], |
|
161 | + ], |
|
162 | + ] |
|
163 | + ], |
|
164 | + [ # 1- admin part not translated |
|
165 | + '<?xml version="1.0" encoding="utf-8" ?> |
|
166 | 166 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
167 | 167 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
168 | 168 | version="13.0.0"> |
@@ -186,34 +186,34 @@ discard block |
||
186 | 186 | </regular> |
187 | 187 | </whatsNew> |
188 | 188 | </release>', |
189 | - [ |
|
190 | - 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
191 | - 'whatsNew' => [ |
|
192 | - 'en' => [ |
|
193 | - 'regular' => [ |
|
194 | - 'Refined user interface', |
|
195 | - 'End-to-end Encryption', |
|
196 | - 'Video and Text Chat' |
|
197 | - ], |
|
198 | - 'admin' => [ |
|
199 | - 'Changes to the Nginx configuration', |
|
200 | - 'Theming: CSS files were consolidated' |
|
201 | - ], |
|
202 | - ], |
|
203 | - 'de' => [ |
|
204 | - 'regular' => [ |
|
205 | - 'Überarbeitete Benutzerschnittstelle', |
|
206 | - 'Ende-zu-Ende Verschlüsselung', |
|
207 | - 'Video- und Text-Chat' |
|
208 | - ], |
|
209 | - 'admin' => [ |
|
210 | - ], |
|
211 | - ], |
|
212 | - ], |
|
213 | - ] |
|
214 | - ], |
|
215 | - [ # 2 - minimal set |
|
216 | - '<?xml version="1.0" encoding="utf-8" ?> |
|
189 | + [ |
|
190 | + 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
191 | + 'whatsNew' => [ |
|
192 | + 'en' => [ |
|
193 | + 'regular' => [ |
|
194 | + 'Refined user interface', |
|
195 | + 'End-to-end Encryption', |
|
196 | + 'Video and Text Chat' |
|
197 | + ], |
|
198 | + 'admin' => [ |
|
199 | + 'Changes to the Nginx configuration', |
|
200 | + 'Theming: CSS files were consolidated' |
|
201 | + ], |
|
202 | + ], |
|
203 | + 'de' => [ |
|
204 | + 'regular' => [ |
|
205 | + 'Überarbeitete Benutzerschnittstelle', |
|
206 | + 'Ende-zu-Ende Verschlüsselung', |
|
207 | + 'Video- und Text-Chat' |
|
208 | + ], |
|
209 | + 'admin' => [ |
|
210 | + ], |
|
211 | + ], |
|
212 | + ], |
|
213 | + ] |
|
214 | + ], |
|
215 | + [ # 2 - minimal set |
|
216 | + '<?xml version="1.0" encoding="utf-8" ?> |
|
217 | 217 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
218 | 218 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
219 | 219 | version="13.0.0"> |
@@ -226,22 +226,22 @@ discard block |
||
226 | 226 | </regular> |
227 | 227 | </whatsNew> |
228 | 228 | </release>', |
229 | - [ |
|
230 | - 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
231 | - 'whatsNew' => [ |
|
232 | - 'en' => [ |
|
233 | - 'regular' => [ |
|
234 | - 'Refined user interface', |
|
235 | - 'End-to-end Encryption', |
|
236 | - 'Video and Text Chat' |
|
237 | - ], |
|
238 | - 'admin' => [], |
|
239 | - ], |
|
240 | - ], |
|
241 | - ] |
|
242 | - ], |
|
243 | - [ # 3 - minimal set (procrastinator edition) |
|
244 | - '<?xml version="1.0" encoding="utf-8" ?> |
|
229 | + [ |
|
230 | + 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
231 | + 'whatsNew' => [ |
|
232 | + 'en' => [ |
|
233 | + 'regular' => [ |
|
234 | + 'Refined user interface', |
|
235 | + 'End-to-end Encryption', |
|
236 | + 'Video and Text Chat' |
|
237 | + ], |
|
238 | + 'admin' => [], |
|
239 | + ], |
|
240 | + ], |
|
241 | + ] |
|
242 | + ], |
|
243 | + [ # 3 - minimal set (procrastinator edition) |
|
244 | + '<?xml version="1.0" encoding="utf-8" ?> |
|
245 | 245 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
246 | 246 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
247 | 247 | version="13.0.0"> |
@@ -252,138 +252,138 @@ discard block |
||
252 | 252 | </regular> |
253 | 253 | </whatsNew> |
254 | 254 | </release>', |
255 | - [ |
|
256 | - 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
257 | - 'whatsNew' => [ |
|
258 | - 'en' => [ |
|
259 | - 'regular' => [ |
|
260 | - 'Write this tomorrow', |
|
261 | - ], |
|
262 | - 'admin' => [], |
|
263 | - ], |
|
264 | - ], |
|
265 | - ] |
|
266 | - ], |
|
267 | - [ # 4 - empty |
|
268 | - '', |
|
269 | - [] |
|
270 | - ], |
|
271 | - ]; |
|
272 | - } |
|
273 | - |
|
274 | - /** |
|
275 | - * @dataProvider changesXMLProvider |
|
276 | - */ |
|
277 | - public function testExtractData(string $body, array $expected): void { |
|
278 | - $actual = $this->invokePrivate($this->checker, 'extractData', [$body]); |
|
279 | - $this->assertSame($expected, $actual); |
|
280 | - } |
|
281 | - |
|
282 | - public static function etagProvider() { |
|
283 | - return [ |
|
284 | - [''], |
|
285 | - ['a27aab83d8205d73978435076e53d143'] |
|
286 | - ]; |
|
287 | - } |
|
288 | - |
|
289 | - /** |
|
290 | - * @dataProvider etagProvider |
|
291 | - */ |
|
292 | - public function testQueryChangesServer(string $etag): void { |
|
293 | - $uri = 'https://changes.nextcloud.server/?13.0.5'; |
|
294 | - $entry = $this->createMock(Changes::class); |
|
295 | - $entry->expects($this->any()) |
|
296 | - ->method('__call') |
|
297 | - ->willReturn($etag); |
|
298 | - |
|
299 | - $expectedHeaders = $etag === '' ? [] : ['If-None-Match' => [$etag]]; |
|
300 | - |
|
301 | - $client = $this->createMock(IClient::class); |
|
302 | - $client->expects($this->once()) |
|
303 | - ->method('get') |
|
304 | - ->with($uri, ['headers' => $expectedHeaders]) |
|
305 | - ->willReturn($this->createMock(IResponse::class)); |
|
306 | - |
|
307 | - $this->clientService->expects($this->once()) |
|
308 | - ->method('newClient') |
|
309 | - ->willReturn($client); |
|
310 | - |
|
311 | - $response = $this->invokePrivate($this->checker, 'queryChangesServer', [$uri, $entry]); |
|
312 | - $this->assertInstanceOf(IResponse::class, $response); |
|
313 | - } |
|
314 | - |
|
315 | - public static function versionProvider(): array { |
|
316 | - return [ |
|
317 | - ['13.0.7', '13.0.7'], |
|
318 | - ['13.0.7.3', '13.0.7'], |
|
319 | - ['13.0.7.3.42', '13.0.7'], |
|
320 | - ['13.0', '13.0.0'], |
|
321 | - ['13', '13.0.0'], |
|
322 | - ['', '0.0.0'], |
|
323 | - ]; |
|
324 | - } |
|
325 | - |
|
326 | - /** |
|
327 | - * @dataProvider versionProvider |
|
328 | - */ |
|
329 | - public function testNormalizeVersion(string $input, string $expected): void { |
|
330 | - $normalized = $this->checker->normalizeVersion($input); |
|
331 | - $this->assertSame($expected, $normalized); |
|
332 | - } |
|
333 | - |
|
334 | - public static function changeDataProvider():array { |
|
335 | - $testDataFound = $testDataNotFound = self::versionProvider(); |
|
336 | - array_walk($testDataFound, static function (&$params) { |
|
337 | - $params[] = true; |
|
338 | - }); |
|
339 | - array_walk($testDataNotFound, static function (&$params) { |
|
340 | - $params[] = false; |
|
341 | - }); |
|
342 | - return array_merge($testDataFound, $testDataNotFound); |
|
343 | - } |
|
344 | - |
|
345 | - /** |
|
346 | - * @dataProvider changeDataProvider |
|
347 | - * |
|
348 | - */ |
|
349 | - public function testGetChangesForVersion(string $inputVersion, string $normalizedVersion, bool $isFound): void { |
|
350 | - $mocker = $this->mapper->expects($this->once()) |
|
351 | - ->method('getChanges') |
|
352 | - ->with($normalizedVersion); |
|
353 | - |
|
354 | - if (!$isFound) { |
|
355 | - $this->expectException(DoesNotExistException::class); |
|
356 | - $mocker->willThrowException(new DoesNotExistException('Changes info is not present')); |
|
357 | - } else { |
|
358 | - $entry = $this->createMock(Changes::class); |
|
359 | - $entry->expects($this->once()) |
|
360 | - ->method('__call') |
|
361 | - ->with('getData') |
|
362 | - ->willReturn('{"changelogURL":"https:\/\/nextcloud.com\/changelog\/#13-0-0","whatsNew":{"en":{"regular":["Refined user interface","End-to-end Encryption","Video and Text Chat"],"admin":["Changes to the Nginx configuration","Theming: CSS files were consolidated"]},"de":{"regular":["\u00dcberarbeitete Benutzerschnittstelle","Ende-zu-Ende Verschl\u00fcsselung","Video- und Text-Chat"],"admin":["\u00c4nderungen an der Nginx Konfiguration","Theming: CSS Dateien wurden konsolidiert"]}}}'); |
|
363 | - |
|
364 | - $mocker->willReturn($entry); |
|
365 | - } |
|
366 | - |
|
367 | - /** @noinspection PhpUnhandledExceptionInspection */ |
|
368 | - $data = $this->checker->getChangesForVersion($inputVersion); |
|
369 | - $this->assertTrue(isset($data['whatsNew']['en']['regular'])); |
|
370 | - $this->assertTrue(isset($data['changelogURL'])); |
|
371 | - } |
|
372 | - |
|
373 | - public function testGetChangesForVersionEmptyData(): void { |
|
374 | - $entry = $this->createMock(Changes::class); |
|
375 | - $entry->expects($this->once()) |
|
376 | - ->method('__call') |
|
377 | - ->with('getData') |
|
378 | - ->willReturn(''); |
|
379 | - |
|
380 | - $this->mapper->expects($this->once()) |
|
381 | - ->method('getChanges') |
|
382 | - ->with('13.0.7') |
|
383 | - ->willReturn($entry); |
|
384 | - |
|
385 | - $this->expectException(DoesNotExistException::class); |
|
386 | - /** @noinspection PhpUnhandledExceptionInspection */ |
|
387 | - $this->checker->getChangesForVersion('13.0.7'); |
|
388 | - } |
|
255 | + [ |
|
256 | + 'changelogURL' => 'https://nextcloud.com/changelog/#13-0-0', |
|
257 | + 'whatsNew' => [ |
|
258 | + 'en' => [ |
|
259 | + 'regular' => [ |
|
260 | + 'Write this tomorrow', |
|
261 | + ], |
|
262 | + 'admin' => [], |
|
263 | + ], |
|
264 | + ], |
|
265 | + ] |
|
266 | + ], |
|
267 | + [ # 4 - empty |
|
268 | + '', |
|
269 | + [] |
|
270 | + ], |
|
271 | + ]; |
|
272 | + } |
|
273 | + |
|
274 | + /** |
|
275 | + * @dataProvider changesXMLProvider |
|
276 | + */ |
|
277 | + public function testExtractData(string $body, array $expected): void { |
|
278 | + $actual = $this->invokePrivate($this->checker, 'extractData', [$body]); |
|
279 | + $this->assertSame($expected, $actual); |
|
280 | + } |
|
281 | + |
|
282 | + public static function etagProvider() { |
|
283 | + return [ |
|
284 | + [''], |
|
285 | + ['a27aab83d8205d73978435076e53d143'] |
|
286 | + ]; |
|
287 | + } |
|
288 | + |
|
289 | + /** |
|
290 | + * @dataProvider etagProvider |
|
291 | + */ |
|
292 | + public function testQueryChangesServer(string $etag): void { |
|
293 | + $uri = 'https://changes.nextcloud.server/?13.0.5'; |
|
294 | + $entry = $this->createMock(Changes::class); |
|
295 | + $entry->expects($this->any()) |
|
296 | + ->method('__call') |
|
297 | + ->willReturn($etag); |
|
298 | + |
|
299 | + $expectedHeaders = $etag === '' ? [] : ['If-None-Match' => [$etag]]; |
|
300 | + |
|
301 | + $client = $this->createMock(IClient::class); |
|
302 | + $client->expects($this->once()) |
|
303 | + ->method('get') |
|
304 | + ->with($uri, ['headers' => $expectedHeaders]) |
|
305 | + ->willReturn($this->createMock(IResponse::class)); |
|
306 | + |
|
307 | + $this->clientService->expects($this->once()) |
|
308 | + ->method('newClient') |
|
309 | + ->willReturn($client); |
|
310 | + |
|
311 | + $response = $this->invokePrivate($this->checker, 'queryChangesServer', [$uri, $entry]); |
|
312 | + $this->assertInstanceOf(IResponse::class, $response); |
|
313 | + } |
|
314 | + |
|
315 | + public static function versionProvider(): array { |
|
316 | + return [ |
|
317 | + ['13.0.7', '13.0.7'], |
|
318 | + ['13.0.7.3', '13.0.7'], |
|
319 | + ['13.0.7.3.42', '13.0.7'], |
|
320 | + ['13.0', '13.0.0'], |
|
321 | + ['13', '13.0.0'], |
|
322 | + ['', '0.0.0'], |
|
323 | + ]; |
|
324 | + } |
|
325 | + |
|
326 | + /** |
|
327 | + * @dataProvider versionProvider |
|
328 | + */ |
|
329 | + public function testNormalizeVersion(string $input, string $expected): void { |
|
330 | + $normalized = $this->checker->normalizeVersion($input); |
|
331 | + $this->assertSame($expected, $normalized); |
|
332 | + } |
|
333 | + |
|
334 | + public static function changeDataProvider():array { |
|
335 | + $testDataFound = $testDataNotFound = self::versionProvider(); |
|
336 | + array_walk($testDataFound, static function (&$params) { |
|
337 | + $params[] = true; |
|
338 | + }); |
|
339 | + array_walk($testDataNotFound, static function (&$params) { |
|
340 | + $params[] = false; |
|
341 | + }); |
|
342 | + return array_merge($testDataFound, $testDataNotFound); |
|
343 | + } |
|
344 | + |
|
345 | + /** |
|
346 | + * @dataProvider changeDataProvider |
|
347 | + * |
|
348 | + */ |
|
349 | + public function testGetChangesForVersion(string $inputVersion, string $normalizedVersion, bool $isFound): void { |
|
350 | + $mocker = $this->mapper->expects($this->once()) |
|
351 | + ->method('getChanges') |
|
352 | + ->with($normalizedVersion); |
|
353 | + |
|
354 | + if (!$isFound) { |
|
355 | + $this->expectException(DoesNotExistException::class); |
|
356 | + $mocker->willThrowException(new DoesNotExistException('Changes info is not present')); |
|
357 | + } else { |
|
358 | + $entry = $this->createMock(Changes::class); |
|
359 | + $entry->expects($this->once()) |
|
360 | + ->method('__call') |
|
361 | + ->with('getData') |
|
362 | + ->willReturn('{"changelogURL":"https:\/\/nextcloud.com\/changelog\/#13-0-0","whatsNew":{"en":{"regular":["Refined user interface","End-to-end Encryption","Video and Text Chat"],"admin":["Changes to the Nginx configuration","Theming: CSS files were consolidated"]},"de":{"regular":["\u00dcberarbeitete Benutzerschnittstelle","Ende-zu-Ende Verschl\u00fcsselung","Video- und Text-Chat"],"admin":["\u00c4nderungen an der Nginx Konfiguration","Theming: CSS Dateien wurden konsolidiert"]}}}'); |
|
363 | + |
|
364 | + $mocker->willReturn($entry); |
|
365 | + } |
|
366 | + |
|
367 | + /** @noinspection PhpUnhandledExceptionInspection */ |
|
368 | + $data = $this->checker->getChangesForVersion($inputVersion); |
|
369 | + $this->assertTrue(isset($data['whatsNew']['en']['regular'])); |
|
370 | + $this->assertTrue(isset($data['changelogURL'])); |
|
371 | + } |
|
372 | + |
|
373 | + public function testGetChangesForVersionEmptyData(): void { |
|
374 | + $entry = $this->createMock(Changes::class); |
|
375 | + $entry->expects($this->once()) |
|
376 | + ->method('__call') |
|
377 | + ->with('getData') |
|
378 | + ->willReturn(''); |
|
379 | + |
|
380 | + $this->mapper->expects($this->once()) |
|
381 | + ->method('getChanges') |
|
382 | + ->with('13.0.7') |
|
383 | + ->willReturn($entry); |
|
384 | + |
|
385 | + $this->expectException(DoesNotExistException::class); |
|
386 | + /** @noinspection PhpUnhandledExceptionInspection */ |
|
387 | + $this->checker->getChangesForVersion('13.0.7'); |
|
388 | + } |
|
389 | 389 | } |
@@ -104,7 +104,7 @@ discard block |
||
104 | 104 | |
105 | 105 | public static function changesXMLProvider(): array { |
106 | 106 | return [ |
107 | - [ # 0 - full example |
|
107 | + [# 0 - full example |
|
108 | 108 | '<?xml version="1.0" encoding="utf-8" ?> |
109 | 109 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
110 | 110 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
@@ -161,7 +161,7 @@ discard block |
||
161 | 161 | ], |
162 | 162 | ] |
163 | 163 | ], |
164 | - [ # 1- admin part not translated |
|
164 | + [# 1- admin part not translated |
|
165 | 165 | '<?xml version="1.0" encoding="utf-8" ?> |
166 | 166 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
167 | 167 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
@@ -212,7 +212,7 @@ discard block |
||
212 | 212 | ], |
213 | 213 | ] |
214 | 214 | ], |
215 | - [ # 2 - minimal set |
|
215 | + [# 2 - minimal set |
|
216 | 216 | '<?xml version="1.0" encoding="utf-8" ?> |
217 | 217 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
218 | 218 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
@@ -240,7 +240,7 @@ discard block |
||
240 | 240 | ], |
241 | 241 | ] |
242 | 242 | ], |
243 | - [ # 3 - minimal set (procrastinator edition) |
|
243 | + [# 3 - minimal set (procrastinator edition) |
|
244 | 244 | '<?xml version="1.0" encoding="utf-8" ?> |
245 | 245 | <release xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
246 | 246 | xsi:noNamespaceSchemaLocation="https://updates.nextcloud.com/changelog_server/schema.xsd" |
@@ -264,7 +264,7 @@ discard block |
||
264 | 264 | ], |
265 | 265 | ] |
266 | 266 | ], |
267 | - [ # 4 - empty |
|
267 | + [# 4 - empty |
|
268 | 268 | '', |
269 | 269 | [] |
270 | 270 | ], |
@@ -333,10 +333,10 @@ discard block |
||
333 | 333 | |
334 | 334 | public static function changeDataProvider():array { |
335 | 335 | $testDataFound = $testDataNotFound = self::versionProvider(); |
336 | - array_walk($testDataFound, static function (&$params) { |
|
336 | + array_walk($testDataFound, static function(&$params) { |
|
337 | 337 | $params[] = true; |
338 | 338 | }); |
339 | - array_walk($testDataNotFound, static function (&$params) { |
|
339 | + array_walk($testDataNotFound, static function(&$params) { |
|
340 | 340 | $params[] = false; |
341 | 341 | }); |
342 | 342 | return array_merge($testDataFound, $testDataNotFound); |
@@ -41,902 +41,902 @@ |
||
41 | 41 | * @package Test\DB |
42 | 42 | */ |
43 | 43 | class MigrationsTest extends \Test\TestCase { |
44 | - private MigrationService|MockObject $migrationService; |
|
45 | - private MockObject|IDBConnection $db; |
|
46 | - private IAppManager $appManager; |
|
47 | - |
|
48 | - protected function setUp(): void { |
|
49 | - parent::setUp(); |
|
50 | - |
|
51 | - $this->db = $this->createMock(Connection::class); |
|
52 | - $this->db->expects($this->any())->method('getPrefix')->willReturn('test_oc_'); |
|
53 | - $this->migrationService = new MigrationService('testing', $this->db); |
|
54 | - |
|
55 | - $this->appManager = Server::get(IAppManager::class); |
|
56 | - } |
|
57 | - |
|
58 | - public function testGetters(): void { |
|
59 | - $this->assertEquals('testing', $this->migrationService->getApp()); |
|
60 | - $this->assertEquals(\OC::$SERVERROOT . '/apps/testing/lib/Migration', $this->migrationService->getMigrationsDirectory()); |
|
61 | - $this->assertEquals('OCA\Testing\Migration', $this->migrationService->getMigrationsNamespace()); |
|
62 | - $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
|
63 | - } |
|
64 | - |
|
65 | - public function testCore(): void { |
|
66 | - $this->migrationService = new MigrationService('core', $this->db); |
|
67 | - |
|
68 | - $this->assertEquals('core', $this->migrationService->getApp()); |
|
69 | - $this->assertEquals(\OC::$SERVERROOT . '/core/Migrations', $this->migrationService->getMigrationsDirectory()); |
|
70 | - $this->assertEquals('OC\Core\Migrations', $this->migrationService->getMigrationsNamespace()); |
|
71 | - $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
|
72 | - } |
|
73 | - |
|
74 | - |
|
75 | - public function testExecuteUnknownStep(): void { |
|
76 | - $this->expectException(\InvalidArgumentException::class); |
|
77 | - $this->expectExceptionMessage('Version 20170130180000 is unknown.'); |
|
78 | - |
|
79 | - $this->migrationService->executeStep('20170130180000'); |
|
80 | - } |
|
81 | - |
|
82 | - |
|
83 | - public function testUnknownApp(): void { |
|
84 | - $this->expectException(\Exception::class); |
|
85 | - $this->expectExceptionMessage('App not found'); |
|
86 | - |
|
87 | - $migrationService = new MigrationService('unknown-bloody-app', $this->db); |
|
88 | - } |
|
89 | - |
|
90 | - |
|
91 | - public function testExecuteStepWithUnknownClass(): void { |
|
92 | - $this->expectException(\Exception::class); |
|
93 | - $this->expectExceptionMessage('Migration step \'X\' is unknown'); |
|
94 | - |
|
95 | - $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
96 | - ->onlyMethods(['findMigrations']) |
|
97 | - ->setConstructorArgs(['testing', $this->db]) |
|
98 | - ->getMock(); |
|
99 | - $this->migrationService->expects($this->any())->method('findMigrations')->willReturn( |
|
100 | - ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
101 | - ); |
|
102 | - $this->migrationService->executeStep('20170130180000'); |
|
103 | - } |
|
104 | - |
|
105 | - public function testExecuteStepWithSchemaChange(): void { |
|
106 | - $schema = $this->createMock(Schema::class); |
|
107 | - $this->db->expects($this->any()) |
|
108 | - ->method('createSchema') |
|
109 | - ->willReturn($schema); |
|
110 | - |
|
111 | - $this->db->expects($this->once()) |
|
112 | - ->method('migrateToSchema'); |
|
113 | - |
|
114 | - $wrappedSchema = $this->createMock(Schema::class); |
|
115 | - $wrappedSchema->expects($this->exactly(2)) |
|
116 | - ->method('getTables') |
|
117 | - ->willReturn([]); |
|
118 | - $wrappedSchema->expects($this->exactly(2)) |
|
119 | - ->method('getSequences') |
|
120 | - ->willReturn([]); |
|
121 | - |
|
122 | - $schemaResult = $this->createMock(SchemaWrapper::class); |
|
123 | - $schemaResult->expects($this->once()) |
|
124 | - ->method('getWrappedSchema') |
|
125 | - ->willReturn($wrappedSchema); |
|
126 | - |
|
127 | - $step = $this->createMock(IMigrationStep::class); |
|
128 | - $step->expects($this->once()) |
|
129 | - ->method('preSchemaChange'); |
|
130 | - $step->expects($this->once()) |
|
131 | - ->method('changeSchema') |
|
132 | - ->willReturn($schemaResult); |
|
133 | - $step->expects($this->once()) |
|
134 | - ->method('postSchemaChange'); |
|
135 | - |
|
136 | - $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
137 | - ->onlyMethods(['createInstance']) |
|
138 | - ->setConstructorArgs(['testing', $this->db]) |
|
139 | - ->getMock(); |
|
140 | - |
|
141 | - $this->migrationService->expects($this->any()) |
|
142 | - ->method('createInstance') |
|
143 | - ->with('20170130180000') |
|
144 | - ->willReturn($step); |
|
145 | - $this->migrationService->executeStep('20170130180000'); |
|
146 | - } |
|
147 | - |
|
148 | - public function testExecuteStepWithoutSchemaChange(): void { |
|
149 | - $schema = $this->createMock(Schema::class); |
|
150 | - $this->db->expects($this->any()) |
|
151 | - ->method('createSchema') |
|
152 | - ->willReturn($schema); |
|
153 | - |
|
154 | - $this->db->expects($this->never()) |
|
155 | - ->method('migrateToSchema'); |
|
156 | - |
|
157 | - $step = $this->createMock(IMigrationStep::class); |
|
158 | - $step->expects($this->once()) |
|
159 | - ->method('preSchemaChange'); |
|
160 | - $step->expects($this->once()) |
|
161 | - ->method('changeSchema') |
|
162 | - ->willReturn(null); |
|
163 | - $step->expects($this->once()) |
|
164 | - ->method('postSchemaChange'); |
|
165 | - |
|
166 | - $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
167 | - ->onlyMethods(['createInstance']) |
|
168 | - ->setConstructorArgs(['testing', $this->db]) |
|
169 | - ->getMock(); |
|
170 | - |
|
171 | - $this->migrationService->expects($this->any()) |
|
172 | - ->method('createInstance') |
|
173 | - ->with('20170130180000') |
|
174 | - ->willReturn($step); |
|
175 | - $this->migrationService->executeStep('20170130180000'); |
|
176 | - } |
|
177 | - |
|
178 | - public function dataGetMigration() { |
|
179 | - return [ |
|
180 | - ['current', '20170130180001'], |
|
181 | - ['prev', '20170130180000'], |
|
182 | - ['next', '20170130180002'], |
|
183 | - ['latest', '20170130180003'], |
|
184 | - ]; |
|
185 | - } |
|
186 | - |
|
187 | - /** |
|
188 | - * @dataProvider dataGetMigration |
|
189 | - * @param string $alias |
|
190 | - * @param string $expected |
|
191 | - */ |
|
192 | - public function testGetMigration($alias, $expected): void { |
|
193 | - $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
194 | - ->onlyMethods(['getMigratedVersions', 'findMigrations']) |
|
195 | - ->setConstructorArgs(['testing', $this->db]) |
|
196 | - ->getMock(); |
|
197 | - $this->migrationService->expects($this->any())->method('getMigratedVersions')->willReturn( |
|
198 | - ['20170130180000', '20170130180001'] |
|
199 | - ); |
|
200 | - $this->migrationService->expects($this->any())->method('findMigrations')->willReturn( |
|
201 | - ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
202 | - ); |
|
203 | - |
|
204 | - $this->assertEquals( |
|
205 | - ['20170130180000', '20170130180001', '20170130180002', '20170130180003'], |
|
206 | - $this->migrationService->getAvailableVersions()); |
|
207 | - |
|
208 | - $migration = $this->migrationService->getMigration($alias); |
|
209 | - $this->assertEquals($expected, $migration); |
|
210 | - } |
|
211 | - |
|
212 | - public function testMigrate(): void { |
|
213 | - $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
214 | - ->onlyMethods(['getMigratedVersions', 'findMigrations', 'executeStep']) |
|
215 | - ->setConstructorArgs(['testing', $this->db]) |
|
216 | - ->getMock(); |
|
217 | - $this->migrationService->method('getMigratedVersions') |
|
218 | - ->willReturn( |
|
219 | - ['20170130180000', '20170130180001'] |
|
220 | - ); |
|
221 | - $this->migrationService->method('findMigrations') |
|
222 | - ->willReturn( |
|
223 | - ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
224 | - ); |
|
225 | - |
|
226 | - $this->assertEquals( |
|
227 | - ['20170130180000', '20170130180001', '20170130180002', '20170130180003'], |
|
228 | - $this->migrationService->getAvailableVersions() |
|
229 | - ); |
|
230 | - |
|
231 | - $calls = [ |
|
232 | - ['20170130180002', false], |
|
233 | - ['20170130180003', false], |
|
234 | - ]; |
|
235 | - $this->migrationService->expects($this->exactly(2)) |
|
236 | - ->method('executeStep') |
|
237 | - ->willReturnCallback(function () use (&$calls) { |
|
238 | - $expected = array_shift($calls); |
|
239 | - $this->assertEquals($expected, func_get_args()); |
|
240 | - }); |
|
241 | - $this->migrationService->migrate(); |
|
242 | - } |
|
243 | - |
|
244 | - public function testEnsureOracleConstraintsValid(): void { |
|
245 | - $column = $this->createMock(Column::class); |
|
246 | - $column->expects($this->once()) |
|
247 | - ->method('getName') |
|
248 | - ->willReturn(\str_repeat('a', 30)); |
|
249 | - |
|
250 | - $index = $this->createMock(Index::class); |
|
251 | - $index->expects($this->once()) |
|
252 | - ->method('getName') |
|
253 | - ->willReturn(\str_repeat('a', 30)); |
|
254 | - |
|
255 | - $foreignKey = $this->createMock(ForeignKeyConstraint::class); |
|
256 | - $foreignKey->expects($this->once()) |
|
257 | - ->method('getName') |
|
258 | - ->willReturn(\str_repeat('a', 30)); |
|
259 | - |
|
260 | - $table = $this->createMock(Table::class); |
|
261 | - $table->expects($this->atLeastOnce()) |
|
262 | - ->method('getName') |
|
263 | - ->willReturn(\str_repeat('a', 30)); |
|
264 | - |
|
265 | - $sequence = $this->createMock(Sequence::class); |
|
266 | - $sequence->expects($this->atLeastOnce()) |
|
267 | - ->method('getName') |
|
268 | - ->willReturn(\str_repeat('a', 30)); |
|
269 | - |
|
270 | - $primaryKey = $this->createMock(Index::class); |
|
271 | - $primaryKey->expects($this->once()) |
|
272 | - ->method('getName') |
|
273 | - ->willReturn(\str_repeat('a', 30)); |
|
274 | - |
|
275 | - $table->expects($this->once()) |
|
276 | - ->method('getColumns') |
|
277 | - ->willReturn([$column]); |
|
278 | - $table->expects($this->once()) |
|
279 | - ->method('getIndexes') |
|
280 | - ->willReturn([$index]); |
|
281 | - $table->expects($this->once()) |
|
282 | - ->method('getForeignKeys') |
|
283 | - ->willReturn([$foreignKey]); |
|
284 | - $table->expects($this->once()) |
|
285 | - ->method('getPrimaryKey') |
|
286 | - ->willReturn($primaryKey); |
|
287 | - |
|
288 | - $schema = $this->createMock(Schema::class); |
|
289 | - $schema->expects($this->once()) |
|
290 | - ->method('getTables') |
|
291 | - ->willReturn([$table]); |
|
292 | - $schema->expects($this->once()) |
|
293 | - ->method('getSequences') |
|
294 | - ->willReturn([$sequence]); |
|
295 | - |
|
296 | - $sourceSchema = $this->createMock(Schema::class); |
|
297 | - $sourceSchema->expects($this->any()) |
|
298 | - ->method('getTable') |
|
299 | - ->willThrowException(new SchemaException()); |
|
300 | - $sourceSchema->expects($this->any()) |
|
301 | - ->method('hasSequence') |
|
302 | - ->willReturn(false); |
|
303 | - |
|
304 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
305 | - } |
|
306 | - |
|
307 | - public function testEnsureOracleConstraintsValidWithPrimaryKey(): void { |
|
308 | - $index = $this->createMock(Index::class); |
|
309 | - $index->expects($this->any()) |
|
310 | - ->method('getName') |
|
311 | - ->willReturn(\str_repeat('a', 30)); |
|
312 | - |
|
313 | - $table = $this->createMock(Table::class); |
|
314 | - $table->expects($this->any()) |
|
315 | - ->method('getName') |
|
316 | - ->willReturn(\str_repeat('a', 26)); |
|
317 | - |
|
318 | - $table->expects($this->once()) |
|
319 | - ->method('getColumns') |
|
320 | - ->willReturn([]); |
|
321 | - $table->expects($this->once()) |
|
322 | - ->method('getIndexes') |
|
323 | - ->willReturn([]); |
|
324 | - $table->expects($this->once()) |
|
325 | - ->method('getForeignKeys') |
|
326 | - ->willReturn([]); |
|
327 | - $table->expects($this->once()) |
|
328 | - ->method('getPrimaryKey') |
|
329 | - ->willReturn($index); |
|
330 | - |
|
331 | - $schema = $this->createMock(Schema::class); |
|
332 | - $schema->expects($this->once()) |
|
333 | - ->method('getTables') |
|
334 | - ->willReturn([$table]); |
|
335 | - $schema->expects($this->once()) |
|
336 | - ->method('getSequences') |
|
337 | - ->willReturn([]); |
|
338 | - |
|
339 | - $sourceSchema = $this->createMock(Schema::class); |
|
340 | - $sourceSchema->expects($this->any()) |
|
341 | - ->method('getTable') |
|
342 | - ->willThrowException(new SchemaException()); |
|
343 | - $sourceSchema->expects($this->any()) |
|
344 | - ->method('hasSequence') |
|
345 | - ->willReturn(false); |
|
346 | - |
|
347 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
348 | - } |
|
349 | - |
|
350 | - public function testEnsureOracleConstraintsValidWithPrimaryKeyDefault(): void { |
|
351 | - $defaultName = 'PRIMARY'; |
|
352 | - if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
|
353 | - $defaultName = \str_repeat('a', 26) . '_' . \str_repeat('b', 30) . '_seq'; |
|
354 | - } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
|
355 | - $defaultName = \str_repeat('a', 26) . '_seq'; |
|
356 | - } |
|
357 | - |
|
358 | - $index = $this->createMock(Index::class); |
|
359 | - $index->expects($this->any()) |
|
360 | - ->method('getName') |
|
361 | - ->willReturn($defaultName); |
|
362 | - $index->expects($this->any()) |
|
363 | - ->method('getColumns') |
|
364 | - ->willReturn([\str_repeat('b', 30)]); |
|
365 | - |
|
366 | - $table = $this->createMock(Table::class); |
|
367 | - $table->expects($this->any()) |
|
368 | - ->method('getName') |
|
369 | - ->willReturn(\str_repeat('a', 25)); |
|
370 | - |
|
371 | - $table->expects($this->once()) |
|
372 | - ->method('getColumns') |
|
373 | - ->willReturn([]); |
|
374 | - $table->expects($this->once()) |
|
375 | - ->method('getIndexes') |
|
376 | - ->willReturn([]); |
|
377 | - $table->expects($this->once()) |
|
378 | - ->method('getForeignKeys') |
|
379 | - ->willReturn([]); |
|
380 | - $table->expects($this->once()) |
|
381 | - ->method('getPrimaryKey') |
|
382 | - ->willReturn($index); |
|
383 | - |
|
384 | - $schema = $this->createMock(Schema::class); |
|
385 | - $schema->expects($this->once()) |
|
386 | - ->method('getTables') |
|
387 | - ->willReturn([$table]); |
|
388 | - $schema->expects($this->once()) |
|
389 | - ->method('getSequences') |
|
390 | - ->willReturn([]); |
|
391 | - |
|
392 | - $sourceSchema = $this->createMock(Schema::class); |
|
393 | - $sourceSchema->expects($this->any()) |
|
394 | - ->method('getTable') |
|
395 | - ->willThrowException(new SchemaException()); |
|
396 | - $sourceSchema->expects($this->any()) |
|
397 | - ->method('hasSequence') |
|
398 | - ->willReturn(false); |
|
399 | - |
|
400 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
401 | - } |
|
402 | - |
|
403 | - |
|
404 | - public function testEnsureOracleConstraintsTooLongTableName(): void { |
|
405 | - $this->expectException(\InvalidArgumentException::class); |
|
406 | - |
|
407 | - $table = $this->createMock(Table::class); |
|
408 | - $table->expects($this->any()) |
|
409 | - ->method('getName') |
|
410 | - ->willReturn(\str_repeat('a', 31)); |
|
411 | - |
|
412 | - $schema = $this->createMock(Schema::class); |
|
413 | - $schema->expects($this->once()) |
|
414 | - ->method('getTables') |
|
415 | - ->willReturn([$table]); |
|
416 | - |
|
417 | - $sourceSchema = $this->createMock(Schema::class); |
|
418 | - $sourceSchema->expects($this->any()) |
|
419 | - ->method('getTable') |
|
420 | - ->willThrowException(new SchemaException()); |
|
421 | - $sourceSchema->expects($this->any()) |
|
422 | - ->method('hasSequence') |
|
423 | - ->willReturn(false); |
|
424 | - |
|
425 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
426 | - } |
|
427 | - |
|
428 | - |
|
429 | - public function testEnsureOracleConstraintsTooLongPrimaryWithDefault(): void { |
|
430 | - $this->expectException(\InvalidArgumentException::class); |
|
431 | - |
|
432 | - $defaultName = 'PRIMARY'; |
|
433 | - if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
|
434 | - $defaultName = \str_repeat('a', 27) . '_' . \str_repeat('b', 30) . '_seq'; |
|
435 | - } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
|
436 | - $defaultName = \str_repeat('a', 27) . '_seq'; |
|
437 | - } |
|
438 | - |
|
439 | - $index = $this->createMock(Index::class); |
|
440 | - $index->expects($this->any()) |
|
441 | - ->method('getName') |
|
442 | - ->willReturn($defaultName); |
|
443 | - $index->expects($this->any()) |
|
444 | - ->method('getColumns') |
|
445 | - ->willReturn([\str_repeat('b', 30)]); |
|
446 | - |
|
447 | - $table = $this->createMock(Table::class); |
|
448 | - $table->expects($this->any()) |
|
449 | - ->method('getName') |
|
450 | - ->willReturn(\str_repeat('a', 27)); |
|
451 | - |
|
452 | - $table->expects($this->once()) |
|
453 | - ->method('getColumns') |
|
454 | - ->willReturn([]); |
|
455 | - $table->expects($this->once()) |
|
456 | - ->method('getIndexes') |
|
457 | - ->willReturn([]); |
|
458 | - $table->expects($this->once()) |
|
459 | - ->method('getForeignKeys') |
|
460 | - ->willReturn([]); |
|
461 | - $table->expects($this->once()) |
|
462 | - ->method('getPrimaryKey') |
|
463 | - ->willReturn($index); |
|
464 | - |
|
465 | - $schema = $this->createMock(Schema::class); |
|
466 | - $schema->expects($this->once()) |
|
467 | - ->method('getTables') |
|
468 | - ->willReturn([$table]); |
|
469 | - |
|
470 | - $sourceSchema = $this->createMock(Schema::class); |
|
471 | - $sourceSchema->expects($this->any()) |
|
472 | - ->method('getTable') |
|
473 | - ->willThrowException(new SchemaException()); |
|
474 | - $sourceSchema->expects($this->any()) |
|
475 | - ->method('hasSequence') |
|
476 | - ->willReturn(false); |
|
477 | - |
|
478 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
479 | - } |
|
480 | - |
|
481 | - |
|
482 | - public function testEnsureOracleConstraintsTooLongPrimaryWithName(): void { |
|
483 | - $this->expectException(\InvalidArgumentException::class); |
|
484 | - |
|
485 | - $index = $this->createMock(Index::class); |
|
486 | - $index->expects($this->any()) |
|
487 | - ->method('getName') |
|
488 | - ->willReturn(\str_repeat('a', 31)); |
|
489 | - |
|
490 | - $table = $this->createMock(Table::class); |
|
491 | - $table->expects($this->any()) |
|
492 | - ->method('getName') |
|
493 | - ->willReturn(\str_repeat('a', 26)); |
|
494 | - |
|
495 | - $table->expects($this->once()) |
|
496 | - ->method('getColumns') |
|
497 | - ->willReturn([]); |
|
498 | - $table->expects($this->once()) |
|
499 | - ->method('getIndexes') |
|
500 | - ->willReturn([]); |
|
501 | - $table->expects($this->once()) |
|
502 | - ->method('getForeignKeys') |
|
503 | - ->willReturn([]); |
|
504 | - $table->expects($this->once()) |
|
505 | - ->method('getPrimaryKey') |
|
506 | - ->willReturn($index); |
|
507 | - |
|
508 | - $schema = $this->createMock(Schema::class); |
|
509 | - $schema->expects($this->once()) |
|
510 | - ->method('getTables') |
|
511 | - ->willReturn([$table]); |
|
512 | - |
|
513 | - $sourceSchema = $this->createMock(Schema::class); |
|
514 | - $sourceSchema->expects($this->any()) |
|
515 | - ->method('getTable') |
|
516 | - ->willThrowException(new SchemaException()); |
|
517 | - $sourceSchema->expects($this->any()) |
|
518 | - ->method('hasSequence') |
|
519 | - ->willReturn(false); |
|
520 | - |
|
521 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
522 | - } |
|
523 | - |
|
524 | - |
|
525 | - public function testEnsureOracleConstraintsTooLongColumnName(): void { |
|
526 | - $this->expectException(\InvalidArgumentException::class); |
|
527 | - |
|
528 | - $column = $this->createMock(Column::class); |
|
529 | - $column->expects($this->any()) |
|
530 | - ->method('getName') |
|
531 | - ->willReturn(\str_repeat('a', 31)); |
|
532 | - |
|
533 | - $table = $this->createMock(Table::class); |
|
534 | - $table->expects($this->any()) |
|
535 | - ->method('getName') |
|
536 | - ->willReturn(\str_repeat('a', 30)); |
|
537 | - |
|
538 | - $table->expects($this->once()) |
|
539 | - ->method('getColumns') |
|
540 | - ->willReturn([$column]); |
|
541 | - |
|
542 | - $schema = $this->createMock(Schema::class); |
|
543 | - $schema->expects($this->once()) |
|
544 | - ->method('getTables') |
|
545 | - ->willReturn([$table]); |
|
546 | - |
|
547 | - $sourceSchema = $this->createMock(Schema::class); |
|
548 | - $sourceSchema->expects($this->any()) |
|
549 | - ->method('getTable') |
|
550 | - ->willThrowException(new SchemaException()); |
|
551 | - $sourceSchema->expects($this->any()) |
|
552 | - ->method('hasSequence') |
|
553 | - ->willReturn(false); |
|
554 | - |
|
555 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
556 | - } |
|
557 | - |
|
558 | - |
|
559 | - public function testEnsureOracleConstraintsTooLongIndexName(): void { |
|
560 | - $this->expectException(\InvalidArgumentException::class); |
|
561 | - |
|
562 | - $index = $this->createMock(Index::class); |
|
563 | - $index->expects($this->any()) |
|
564 | - ->method('getName') |
|
565 | - ->willReturn(\str_repeat('a', 31)); |
|
566 | - |
|
567 | - $table = $this->createMock(Table::class); |
|
568 | - $table->expects($this->any()) |
|
569 | - ->method('getName') |
|
570 | - ->willReturn(\str_repeat('a', 30)); |
|
571 | - |
|
572 | - $table->expects($this->once()) |
|
573 | - ->method('getColumns') |
|
574 | - ->willReturn([]); |
|
575 | - $table->expects($this->once()) |
|
576 | - ->method('getIndexes') |
|
577 | - ->willReturn([$index]); |
|
578 | - |
|
579 | - $schema = $this->createMock(Schema::class); |
|
580 | - $schema->expects($this->once()) |
|
581 | - ->method('getTables') |
|
582 | - ->willReturn([$table]); |
|
583 | - |
|
584 | - $sourceSchema = $this->createMock(Schema::class); |
|
585 | - $sourceSchema->expects($this->any()) |
|
586 | - ->method('getTable') |
|
587 | - ->willThrowException(new SchemaException()); |
|
588 | - $sourceSchema->expects($this->any()) |
|
589 | - ->method('hasSequence') |
|
590 | - ->willReturn(false); |
|
591 | - |
|
592 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
593 | - } |
|
594 | - |
|
595 | - |
|
596 | - public function testEnsureOracleConstraintsTooLongForeignKeyName(): void { |
|
597 | - $this->expectException(\InvalidArgumentException::class); |
|
598 | - |
|
599 | - $foreignKey = $this->createMock(ForeignKeyConstraint::class); |
|
600 | - $foreignKey->expects($this->any()) |
|
601 | - ->method('getName') |
|
602 | - ->willReturn(\str_repeat('a', 31)); |
|
603 | - |
|
604 | - $table = $this->createMock(Table::class); |
|
605 | - $table->expects($this->any()) |
|
606 | - ->method('getName') |
|
607 | - ->willReturn(\str_repeat('a', 30)); |
|
608 | - |
|
609 | - $table->expects($this->once()) |
|
610 | - ->method('getColumns') |
|
611 | - ->willReturn([]); |
|
612 | - $table->expects($this->once()) |
|
613 | - ->method('getIndexes') |
|
614 | - ->willReturn([]); |
|
615 | - $table->expects($this->once()) |
|
616 | - ->method('getForeignKeys') |
|
617 | - ->willReturn([$foreignKey]); |
|
618 | - |
|
619 | - $schema = $this->createMock(Schema::class); |
|
620 | - $schema->expects($this->once()) |
|
621 | - ->method('getTables') |
|
622 | - ->willReturn([$table]); |
|
623 | - |
|
624 | - $sourceSchema = $this->createMock(Schema::class); |
|
625 | - $sourceSchema->expects($this->any()) |
|
626 | - ->method('getTable') |
|
627 | - ->willThrowException(new SchemaException()); |
|
628 | - $sourceSchema->expects($this->any()) |
|
629 | - ->method('hasSequence') |
|
630 | - ->willReturn(false); |
|
631 | - |
|
632 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
633 | - } |
|
634 | - |
|
635 | - |
|
636 | - public function testEnsureOracleConstraintsNoPrimaryKey(): void { |
|
637 | - $this->markTestSkipped('Test disabled for now due to multiple reasons, see https://github.com/nextcloud/server/pull/31580#issuecomment-1069182234 for details.'); |
|
638 | - $this->expectException(\InvalidArgumentException::class); |
|
639 | - |
|
640 | - $table = $this->createMock(Table::class); |
|
641 | - $table->expects($this->atLeastOnce()) |
|
642 | - ->method('getName') |
|
643 | - ->willReturn(\str_repeat('a', 30)); |
|
644 | - $table->expects($this->once()) |
|
645 | - ->method('getColumns') |
|
646 | - ->willReturn([]); |
|
647 | - $table->expects($this->once()) |
|
648 | - ->method('getIndexes') |
|
649 | - ->willReturn([]); |
|
650 | - $table->expects($this->once()) |
|
651 | - ->method('getForeignKeys') |
|
652 | - ->willReturn([]); |
|
653 | - $table->expects($this->once()) |
|
654 | - ->method('getPrimaryKey') |
|
655 | - ->willReturn(null); |
|
656 | - |
|
657 | - $schema = $this->createMock(Schema::class); |
|
658 | - $schema->expects($this->once()) |
|
659 | - ->method('getTables') |
|
660 | - ->willReturn([$table]); |
|
661 | - $schema->expects($this->once()) |
|
662 | - ->method('getSequences') |
|
663 | - ->willReturn([]); |
|
664 | - |
|
665 | - $sourceSchema = $this->createMock(Schema::class); |
|
666 | - $sourceSchema->expects($this->any()) |
|
667 | - ->method('getTable') |
|
668 | - ->willThrowException(new SchemaException()); |
|
669 | - $sourceSchema->expects($this->any()) |
|
670 | - ->method('hasSequence') |
|
671 | - ->willReturn(false); |
|
672 | - |
|
673 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
674 | - } |
|
675 | - |
|
676 | - |
|
677 | - public function testEnsureOracleConstraintsTooLongSequenceName(): void { |
|
678 | - $this->expectException(\InvalidArgumentException::class); |
|
679 | - |
|
680 | - $sequence = $this->createMock(Sequence::class); |
|
681 | - $sequence->expects($this->any()) |
|
682 | - ->method('getName') |
|
683 | - ->willReturn(\str_repeat('a', 31)); |
|
684 | - |
|
685 | - $schema = $this->createMock(Schema::class); |
|
686 | - $schema->expects($this->once()) |
|
687 | - ->method('getTables') |
|
688 | - ->willReturn([]); |
|
689 | - $schema->expects($this->once()) |
|
690 | - ->method('getSequences') |
|
691 | - ->willReturn([$sequence]); |
|
692 | - |
|
693 | - $sourceSchema = $this->createMock(Schema::class); |
|
694 | - $sourceSchema->expects($this->any()) |
|
695 | - ->method('getTable') |
|
696 | - ->willThrowException(new SchemaException()); |
|
697 | - $sourceSchema->expects($this->any()) |
|
698 | - ->method('hasSequence') |
|
699 | - ->willReturn(false); |
|
700 | - |
|
701 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
702 | - } |
|
703 | - |
|
704 | - |
|
705 | - public function testEnsureOracleConstraintsBooleanNotNull(): void { |
|
706 | - $this->expectException(\InvalidArgumentException::class); |
|
707 | - |
|
708 | - $column = $this->createMock(Column::class); |
|
709 | - $column->expects($this->any()) |
|
710 | - ->method('getName') |
|
711 | - ->willReturn('aaaa'); |
|
712 | - $column->expects($this->any()) |
|
713 | - ->method('getType') |
|
714 | - ->willReturn(Type::getType('boolean')); |
|
715 | - $column->expects($this->any()) |
|
716 | - ->method('getNotnull') |
|
717 | - ->willReturn(true); |
|
718 | - |
|
719 | - $table = $this->createMock(Table::class); |
|
720 | - $table->expects($this->any()) |
|
721 | - ->method('getName') |
|
722 | - ->willReturn(\str_repeat('a', 30)); |
|
723 | - |
|
724 | - $table->expects($this->once()) |
|
725 | - ->method('getColumns') |
|
726 | - ->willReturn([$column]); |
|
727 | - |
|
728 | - $schema = $this->createMock(Schema::class); |
|
729 | - $schema->expects($this->once()) |
|
730 | - ->method('getTables') |
|
731 | - ->willReturn([$table]); |
|
732 | - |
|
733 | - $sourceSchema = $this->createMock(Schema::class); |
|
734 | - $sourceSchema->expects($this->any()) |
|
735 | - ->method('getTable') |
|
736 | - ->willThrowException(new SchemaException()); |
|
737 | - $sourceSchema->expects($this->any()) |
|
738 | - ->method('hasSequence') |
|
739 | - ->willReturn(false); |
|
740 | - |
|
741 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
742 | - } |
|
743 | - |
|
744 | - |
|
745 | - public function testEnsureOracleConstraintsStringLength4000(): void { |
|
746 | - $this->expectException(\InvalidArgumentException::class); |
|
747 | - |
|
748 | - $column = $this->createMock(Column::class); |
|
749 | - $column->expects($this->any()) |
|
750 | - ->method('getName') |
|
751 | - ->willReturn('aaaa'); |
|
752 | - $column->expects($this->any()) |
|
753 | - ->method('getType') |
|
754 | - ->willReturn(Type::getType('string')); |
|
755 | - $column->expects($this->any()) |
|
756 | - ->method('getLength') |
|
757 | - ->willReturn(4001); |
|
758 | - |
|
759 | - $table = $this->createMock(Table::class); |
|
760 | - $table->expects($this->any()) |
|
761 | - ->method('getName') |
|
762 | - ->willReturn(\str_repeat('a', 30)); |
|
763 | - |
|
764 | - $table->expects($this->once()) |
|
765 | - ->method('getColumns') |
|
766 | - ->willReturn([$column]); |
|
767 | - |
|
768 | - $schema = $this->createMock(Schema::class); |
|
769 | - $schema->expects($this->once()) |
|
770 | - ->method('getTables') |
|
771 | - ->willReturn([$table]); |
|
772 | - |
|
773 | - $sourceSchema = $this->createMock(Schema::class); |
|
774 | - $sourceSchema->expects($this->any()) |
|
775 | - ->method('getTable') |
|
776 | - ->willThrowException(new SchemaException()); |
|
777 | - $sourceSchema->expects($this->any()) |
|
778 | - ->method('hasSequence') |
|
779 | - ->willReturn(false); |
|
780 | - |
|
781 | - self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
782 | - } |
|
783 | - |
|
784 | - |
|
785 | - public function testExtractMigrationAttributes(): void { |
|
786 | - $metadataManager = Server::get(MetadataManager::class); |
|
787 | - $this->appManager->loadApp('testing'); |
|
788 | - |
|
789 | - $this->assertEquals($this->getMigrationMetadata(), json_decode(json_encode($metadataManager->extractMigrationAttributes('testing')), true)); |
|
790 | - |
|
791 | - $this->appManager->disableApp('testing'); |
|
792 | - } |
|
793 | - |
|
794 | - public function testDeserializeMigrationMetadata(): void { |
|
795 | - $metadataManager = Server::get(MetadataManager::class); |
|
796 | - $this->assertEquals( |
|
797 | - [ |
|
798 | - 'core' => [], |
|
799 | - 'apps' => [ |
|
800 | - 'testing' => [ |
|
801 | - '30000Date20240102030405' => [ |
|
802 | - new DropTable('old_table'), |
|
803 | - new CreateTable('new_table', |
|
804 | - description: 'Table is used to store things, but also to get more things', |
|
805 | - notes: ['this is a notice', 'and another one, if really needed'] |
|
806 | - ), |
|
807 | - new AddColumn('my_table'), |
|
808 | - new AddColumn('my_table', 'another_field'), |
|
809 | - new AddColumn('other_table', 'last_one', ColumnType::DATE), |
|
810 | - new AddIndex('my_table'), |
|
811 | - new AddIndex('my_table', IndexType::PRIMARY), |
|
812 | - new DropColumn('other_table'), |
|
813 | - new DropColumn('other_table', 'old_column', |
|
814 | - description: 'field is not used anymore and replaced by \'last_one\'' |
|
815 | - ), |
|
816 | - new DropIndex('other_table'), |
|
817 | - new ModifyColumn('other_table'), |
|
818 | - new ModifyColumn('other_table', 'this_field'), |
|
819 | - new ModifyColumn('other_table', 'this_field', ColumnType::BIGINT) |
|
820 | - ] |
|
821 | - ] |
|
822 | - ] |
|
823 | - ], |
|
824 | - $metadataManager->getMigrationsAttributesFromReleaseMetadata( |
|
825 | - [ |
|
826 | - 'core' => [], |
|
827 | - 'apps' => ['testing' => $this->getMigrationMetadata()] |
|
828 | - ] |
|
829 | - ) |
|
830 | - ); |
|
831 | - } |
|
832 | - |
|
833 | - private function getMigrationMetadata(): array { |
|
834 | - return [ |
|
835 | - '30000Date20240102030405' => [ |
|
836 | - [ |
|
837 | - 'class' => 'OCP\\Migration\\Attributes\\DropTable', |
|
838 | - 'table' => 'old_table', |
|
839 | - 'description' => '', |
|
840 | - 'notes' => [], |
|
841 | - 'columns' => [] |
|
842 | - ], |
|
843 | - [ |
|
844 | - 'class' => 'OCP\\Migration\\Attributes\\CreateTable', |
|
845 | - 'table' => 'new_table', |
|
846 | - 'description' => 'Table is used to store things, but also to get more things', |
|
847 | - 'notes' => |
|
848 | - [ |
|
849 | - 'this is a notice', |
|
850 | - 'and another one, if really needed' |
|
851 | - ], |
|
852 | - 'columns' => [] |
|
853 | - ], |
|
854 | - [ |
|
855 | - 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
856 | - 'table' => 'my_table', |
|
857 | - 'description' => '', |
|
858 | - 'notes' => [], |
|
859 | - 'name' => '', |
|
860 | - 'type' => '' |
|
861 | - ], |
|
862 | - [ |
|
863 | - 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
864 | - 'table' => 'my_table', |
|
865 | - 'description' => '', |
|
866 | - 'notes' => [], |
|
867 | - 'name' => 'another_field', |
|
868 | - 'type' => '' |
|
869 | - ], |
|
870 | - [ |
|
871 | - 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
872 | - 'table' => 'other_table', |
|
873 | - 'description' => '', |
|
874 | - 'notes' => [], |
|
875 | - 'name' => 'last_one', |
|
876 | - 'type' => 'date' |
|
877 | - ], |
|
878 | - [ |
|
879 | - 'class' => 'OCP\\Migration\\Attributes\\AddIndex', |
|
880 | - 'table' => 'my_table', |
|
881 | - 'description' => '', |
|
882 | - 'notes' => [], |
|
883 | - 'type' => '' |
|
884 | - ], |
|
885 | - [ |
|
886 | - 'class' => 'OCP\\Migration\\Attributes\\AddIndex', |
|
887 | - 'table' => 'my_table', |
|
888 | - 'description' => '', |
|
889 | - 'notes' => [], |
|
890 | - 'type' => 'primary' |
|
891 | - ], |
|
892 | - [ |
|
893 | - 'class' => 'OCP\\Migration\\Attributes\\DropColumn', |
|
894 | - 'table' => 'other_table', |
|
895 | - 'description' => '', |
|
896 | - 'notes' => [], |
|
897 | - 'name' => '', |
|
898 | - 'type' => '' |
|
899 | - ], |
|
900 | - [ |
|
901 | - 'class' => 'OCP\\Migration\\Attributes\\DropColumn', |
|
902 | - 'table' => 'other_table', |
|
903 | - 'description' => 'field is not used anymore and replaced by \'last_one\'', |
|
904 | - 'notes' => [], |
|
905 | - 'name' => 'old_column', |
|
906 | - 'type' => '' |
|
907 | - ], |
|
908 | - [ |
|
909 | - 'class' => 'OCP\\Migration\\Attributes\\DropIndex', |
|
910 | - 'table' => 'other_table', |
|
911 | - 'description' => '', |
|
912 | - 'notes' => [], |
|
913 | - 'type' => '' |
|
914 | - ], |
|
915 | - [ |
|
916 | - 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
917 | - 'table' => 'other_table', |
|
918 | - 'description' => '', |
|
919 | - 'notes' => [], |
|
920 | - 'name' => '', |
|
921 | - 'type' => '' |
|
922 | - ], |
|
923 | - [ |
|
924 | - 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
925 | - 'table' => 'other_table', |
|
926 | - 'description' => '', |
|
927 | - 'notes' => [], |
|
928 | - 'name' => 'this_field', |
|
929 | - 'type' => '' |
|
930 | - ], |
|
931 | - [ |
|
932 | - 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
933 | - 'table' => 'other_table', |
|
934 | - 'description' => '', |
|
935 | - 'notes' => [], |
|
936 | - 'name' => 'this_field', |
|
937 | - 'type' => 'bigint' |
|
938 | - ], |
|
939 | - ] |
|
940 | - ]; |
|
941 | - } |
|
44 | + private MigrationService|MockObject $migrationService; |
|
45 | + private MockObject|IDBConnection $db; |
|
46 | + private IAppManager $appManager; |
|
47 | + |
|
48 | + protected function setUp(): void { |
|
49 | + parent::setUp(); |
|
50 | + |
|
51 | + $this->db = $this->createMock(Connection::class); |
|
52 | + $this->db->expects($this->any())->method('getPrefix')->willReturn('test_oc_'); |
|
53 | + $this->migrationService = new MigrationService('testing', $this->db); |
|
54 | + |
|
55 | + $this->appManager = Server::get(IAppManager::class); |
|
56 | + } |
|
57 | + |
|
58 | + public function testGetters(): void { |
|
59 | + $this->assertEquals('testing', $this->migrationService->getApp()); |
|
60 | + $this->assertEquals(\OC::$SERVERROOT . '/apps/testing/lib/Migration', $this->migrationService->getMigrationsDirectory()); |
|
61 | + $this->assertEquals('OCA\Testing\Migration', $this->migrationService->getMigrationsNamespace()); |
|
62 | + $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
|
63 | + } |
|
64 | + |
|
65 | + public function testCore(): void { |
|
66 | + $this->migrationService = new MigrationService('core', $this->db); |
|
67 | + |
|
68 | + $this->assertEquals('core', $this->migrationService->getApp()); |
|
69 | + $this->assertEquals(\OC::$SERVERROOT . '/core/Migrations', $this->migrationService->getMigrationsDirectory()); |
|
70 | + $this->assertEquals('OC\Core\Migrations', $this->migrationService->getMigrationsNamespace()); |
|
71 | + $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
|
72 | + } |
|
73 | + |
|
74 | + |
|
75 | + public function testExecuteUnknownStep(): void { |
|
76 | + $this->expectException(\InvalidArgumentException::class); |
|
77 | + $this->expectExceptionMessage('Version 20170130180000 is unknown.'); |
|
78 | + |
|
79 | + $this->migrationService->executeStep('20170130180000'); |
|
80 | + } |
|
81 | + |
|
82 | + |
|
83 | + public function testUnknownApp(): void { |
|
84 | + $this->expectException(\Exception::class); |
|
85 | + $this->expectExceptionMessage('App not found'); |
|
86 | + |
|
87 | + $migrationService = new MigrationService('unknown-bloody-app', $this->db); |
|
88 | + } |
|
89 | + |
|
90 | + |
|
91 | + public function testExecuteStepWithUnknownClass(): void { |
|
92 | + $this->expectException(\Exception::class); |
|
93 | + $this->expectExceptionMessage('Migration step \'X\' is unknown'); |
|
94 | + |
|
95 | + $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
96 | + ->onlyMethods(['findMigrations']) |
|
97 | + ->setConstructorArgs(['testing', $this->db]) |
|
98 | + ->getMock(); |
|
99 | + $this->migrationService->expects($this->any())->method('findMigrations')->willReturn( |
|
100 | + ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
101 | + ); |
|
102 | + $this->migrationService->executeStep('20170130180000'); |
|
103 | + } |
|
104 | + |
|
105 | + public function testExecuteStepWithSchemaChange(): void { |
|
106 | + $schema = $this->createMock(Schema::class); |
|
107 | + $this->db->expects($this->any()) |
|
108 | + ->method('createSchema') |
|
109 | + ->willReturn($schema); |
|
110 | + |
|
111 | + $this->db->expects($this->once()) |
|
112 | + ->method('migrateToSchema'); |
|
113 | + |
|
114 | + $wrappedSchema = $this->createMock(Schema::class); |
|
115 | + $wrappedSchema->expects($this->exactly(2)) |
|
116 | + ->method('getTables') |
|
117 | + ->willReturn([]); |
|
118 | + $wrappedSchema->expects($this->exactly(2)) |
|
119 | + ->method('getSequences') |
|
120 | + ->willReturn([]); |
|
121 | + |
|
122 | + $schemaResult = $this->createMock(SchemaWrapper::class); |
|
123 | + $schemaResult->expects($this->once()) |
|
124 | + ->method('getWrappedSchema') |
|
125 | + ->willReturn($wrappedSchema); |
|
126 | + |
|
127 | + $step = $this->createMock(IMigrationStep::class); |
|
128 | + $step->expects($this->once()) |
|
129 | + ->method('preSchemaChange'); |
|
130 | + $step->expects($this->once()) |
|
131 | + ->method('changeSchema') |
|
132 | + ->willReturn($schemaResult); |
|
133 | + $step->expects($this->once()) |
|
134 | + ->method('postSchemaChange'); |
|
135 | + |
|
136 | + $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
137 | + ->onlyMethods(['createInstance']) |
|
138 | + ->setConstructorArgs(['testing', $this->db]) |
|
139 | + ->getMock(); |
|
140 | + |
|
141 | + $this->migrationService->expects($this->any()) |
|
142 | + ->method('createInstance') |
|
143 | + ->with('20170130180000') |
|
144 | + ->willReturn($step); |
|
145 | + $this->migrationService->executeStep('20170130180000'); |
|
146 | + } |
|
147 | + |
|
148 | + public function testExecuteStepWithoutSchemaChange(): void { |
|
149 | + $schema = $this->createMock(Schema::class); |
|
150 | + $this->db->expects($this->any()) |
|
151 | + ->method('createSchema') |
|
152 | + ->willReturn($schema); |
|
153 | + |
|
154 | + $this->db->expects($this->never()) |
|
155 | + ->method('migrateToSchema'); |
|
156 | + |
|
157 | + $step = $this->createMock(IMigrationStep::class); |
|
158 | + $step->expects($this->once()) |
|
159 | + ->method('preSchemaChange'); |
|
160 | + $step->expects($this->once()) |
|
161 | + ->method('changeSchema') |
|
162 | + ->willReturn(null); |
|
163 | + $step->expects($this->once()) |
|
164 | + ->method('postSchemaChange'); |
|
165 | + |
|
166 | + $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
167 | + ->onlyMethods(['createInstance']) |
|
168 | + ->setConstructorArgs(['testing', $this->db]) |
|
169 | + ->getMock(); |
|
170 | + |
|
171 | + $this->migrationService->expects($this->any()) |
|
172 | + ->method('createInstance') |
|
173 | + ->with('20170130180000') |
|
174 | + ->willReturn($step); |
|
175 | + $this->migrationService->executeStep('20170130180000'); |
|
176 | + } |
|
177 | + |
|
178 | + public function dataGetMigration() { |
|
179 | + return [ |
|
180 | + ['current', '20170130180001'], |
|
181 | + ['prev', '20170130180000'], |
|
182 | + ['next', '20170130180002'], |
|
183 | + ['latest', '20170130180003'], |
|
184 | + ]; |
|
185 | + } |
|
186 | + |
|
187 | + /** |
|
188 | + * @dataProvider dataGetMigration |
|
189 | + * @param string $alias |
|
190 | + * @param string $expected |
|
191 | + */ |
|
192 | + public function testGetMigration($alias, $expected): void { |
|
193 | + $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
194 | + ->onlyMethods(['getMigratedVersions', 'findMigrations']) |
|
195 | + ->setConstructorArgs(['testing', $this->db]) |
|
196 | + ->getMock(); |
|
197 | + $this->migrationService->expects($this->any())->method('getMigratedVersions')->willReturn( |
|
198 | + ['20170130180000', '20170130180001'] |
|
199 | + ); |
|
200 | + $this->migrationService->expects($this->any())->method('findMigrations')->willReturn( |
|
201 | + ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
202 | + ); |
|
203 | + |
|
204 | + $this->assertEquals( |
|
205 | + ['20170130180000', '20170130180001', '20170130180002', '20170130180003'], |
|
206 | + $this->migrationService->getAvailableVersions()); |
|
207 | + |
|
208 | + $migration = $this->migrationService->getMigration($alias); |
|
209 | + $this->assertEquals($expected, $migration); |
|
210 | + } |
|
211 | + |
|
212 | + public function testMigrate(): void { |
|
213 | + $this->migrationService = $this->getMockBuilder(MigrationService::class) |
|
214 | + ->onlyMethods(['getMigratedVersions', 'findMigrations', 'executeStep']) |
|
215 | + ->setConstructorArgs(['testing', $this->db]) |
|
216 | + ->getMock(); |
|
217 | + $this->migrationService->method('getMigratedVersions') |
|
218 | + ->willReturn( |
|
219 | + ['20170130180000', '20170130180001'] |
|
220 | + ); |
|
221 | + $this->migrationService->method('findMigrations') |
|
222 | + ->willReturn( |
|
223 | + ['20170130180000' => 'X', '20170130180001' => 'Y', '20170130180002' => 'Z', '20170130180003' => 'A'] |
|
224 | + ); |
|
225 | + |
|
226 | + $this->assertEquals( |
|
227 | + ['20170130180000', '20170130180001', '20170130180002', '20170130180003'], |
|
228 | + $this->migrationService->getAvailableVersions() |
|
229 | + ); |
|
230 | + |
|
231 | + $calls = [ |
|
232 | + ['20170130180002', false], |
|
233 | + ['20170130180003', false], |
|
234 | + ]; |
|
235 | + $this->migrationService->expects($this->exactly(2)) |
|
236 | + ->method('executeStep') |
|
237 | + ->willReturnCallback(function () use (&$calls) { |
|
238 | + $expected = array_shift($calls); |
|
239 | + $this->assertEquals($expected, func_get_args()); |
|
240 | + }); |
|
241 | + $this->migrationService->migrate(); |
|
242 | + } |
|
243 | + |
|
244 | + public function testEnsureOracleConstraintsValid(): void { |
|
245 | + $column = $this->createMock(Column::class); |
|
246 | + $column->expects($this->once()) |
|
247 | + ->method('getName') |
|
248 | + ->willReturn(\str_repeat('a', 30)); |
|
249 | + |
|
250 | + $index = $this->createMock(Index::class); |
|
251 | + $index->expects($this->once()) |
|
252 | + ->method('getName') |
|
253 | + ->willReturn(\str_repeat('a', 30)); |
|
254 | + |
|
255 | + $foreignKey = $this->createMock(ForeignKeyConstraint::class); |
|
256 | + $foreignKey->expects($this->once()) |
|
257 | + ->method('getName') |
|
258 | + ->willReturn(\str_repeat('a', 30)); |
|
259 | + |
|
260 | + $table = $this->createMock(Table::class); |
|
261 | + $table->expects($this->atLeastOnce()) |
|
262 | + ->method('getName') |
|
263 | + ->willReturn(\str_repeat('a', 30)); |
|
264 | + |
|
265 | + $sequence = $this->createMock(Sequence::class); |
|
266 | + $sequence->expects($this->atLeastOnce()) |
|
267 | + ->method('getName') |
|
268 | + ->willReturn(\str_repeat('a', 30)); |
|
269 | + |
|
270 | + $primaryKey = $this->createMock(Index::class); |
|
271 | + $primaryKey->expects($this->once()) |
|
272 | + ->method('getName') |
|
273 | + ->willReturn(\str_repeat('a', 30)); |
|
274 | + |
|
275 | + $table->expects($this->once()) |
|
276 | + ->method('getColumns') |
|
277 | + ->willReturn([$column]); |
|
278 | + $table->expects($this->once()) |
|
279 | + ->method('getIndexes') |
|
280 | + ->willReturn([$index]); |
|
281 | + $table->expects($this->once()) |
|
282 | + ->method('getForeignKeys') |
|
283 | + ->willReturn([$foreignKey]); |
|
284 | + $table->expects($this->once()) |
|
285 | + ->method('getPrimaryKey') |
|
286 | + ->willReturn($primaryKey); |
|
287 | + |
|
288 | + $schema = $this->createMock(Schema::class); |
|
289 | + $schema->expects($this->once()) |
|
290 | + ->method('getTables') |
|
291 | + ->willReturn([$table]); |
|
292 | + $schema->expects($this->once()) |
|
293 | + ->method('getSequences') |
|
294 | + ->willReturn([$sequence]); |
|
295 | + |
|
296 | + $sourceSchema = $this->createMock(Schema::class); |
|
297 | + $sourceSchema->expects($this->any()) |
|
298 | + ->method('getTable') |
|
299 | + ->willThrowException(new SchemaException()); |
|
300 | + $sourceSchema->expects($this->any()) |
|
301 | + ->method('hasSequence') |
|
302 | + ->willReturn(false); |
|
303 | + |
|
304 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
305 | + } |
|
306 | + |
|
307 | + public function testEnsureOracleConstraintsValidWithPrimaryKey(): void { |
|
308 | + $index = $this->createMock(Index::class); |
|
309 | + $index->expects($this->any()) |
|
310 | + ->method('getName') |
|
311 | + ->willReturn(\str_repeat('a', 30)); |
|
312 | + |
|
313 | + $table = $this->createMock(Table::class); |
|
314 | + $table->expects($this->any()) |
|
315 | + ->method('getName') |
|
316 | + ->willReturn(\str_repeat('a', 26)); |
|
317 | + |
|
318 | + $table->expects($this->once()) |
|
319 | + ->method('getColumns') |
|
320 | + ->willReturn([]); |
|
321 | + $table->expects($this->once()) |
|
322 | + ->method('getIndexes') |
|
323 | + ->willReturn([]); |
|
324 | + $table->expects($this->once()) |
|
325 | + ->method('getForeignKeys') |
|
326 | + ->willReturn([]); |
|
327 | + $table->expects($this->once()) |
|
328 | + ->method('getPrimaryKey') |
|
329 | + ->willReturn($index); |
|
330 | + |
|
331 | + $schema = $this->createMock(Schema::class); |
|
332 | + $schema->expects($this->once()) |
|
333 | + ->method('getTables') |
|
334 | + ->willReturn([$table]); |
|
335 | + $schema->expects($this->once()) |
|
336 | + ->method('getSequences') |
|
337 | + ->willReturn([]); |
|
338 | + |
|
339 | + $sourceSchema = $this->createMock(Schema::class); |
|
340 | + $sourceSchema->expects($this->any()) |
|
341 | + ->method('getTable') |
|
342 | + ->willThrowException(new SchemaException()); |
|
343 | + $sourceSchema->expects($this->any()) |
|
344 | + ->method('hasSequence') |
|
345 | + ->willReturn(false); |
|
346 | + |
|
347 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
348 | + } |
|
349 | + |
|
350 | + public function testEnsureOracleConstraintsValidWithPrimaryKeyDefault(): void { |
|
351 | + $defaultName = 'PRIMARY'; |
|
352 | + if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
|
353 | + $defaultName = \str_repeat('a', 26) . '_' . \str_repeat('b', 30) . '_seq'; |
|
354 | + } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
|
355 | + $defaultName = \str_repeat('a', 26) . '_seq'; |
|
356 | + } |
|
357 | + |
|
358 | + $index = $this->createMock(Index::class); |
|
359 | + $index->expects($this->any()) |
|
360 | + ->method('getName') |
|
361 | + ->willReturn($defaultName); |
|
362 | + $index->expects($this->any()) |
|
363 | + ->method('getColumns') |
|
364 | + ->willReturn([\str_repeat('b', 30)]); |
|
365 | + |
|
366 | + $table = $this->createMock(Table::class); |
|
367 | + $table->expects($this->any()) |
|
368 | + ->method('getName') |
|
369 | + ->willReturn(\str_repeat('a', 25)); |
|
370 | + |
|
371 | + $table->expects($this->once()) |
|
372 | + ->method('getColumns') |
|
373 | + ->willReturn([]); |
|
374 | + $table->expects($this->once()) |
|
375 | + ->method('getIndexes') |
|
376 | + ->willReturn([]); |
|
377 | + $table->expects($this->once()) |
|
378 | + ->method('getForeignKeys') |
|
379 | + ->willReturn([]); |
|
380 | + $table->expects($this->once()) |
|
381 | + ->method('getPrimaryKey') |
|
382 | + ->willReturn($index); |
|
383 | + |
|
384 | + $schema = $this->createMock(Schema::class); |
|
385 | + $schema->expects($this->once()) |
|
386 | + ->method('getTables') |
|
387 | + ->willReturn([$table]); |
|
388 | + $schema->expects($this->once()) |
|
389 | + ->method('getSequences') |
|
390 | + ->willReturn([]); |
|
391 | + |
|
392 | + $sourceSchema = $this->createMock(Schema::class); |
|
393 | + $sourceSchema->expects($this->any()) |
|
394 | + ->method('getTable') |
|
395 | + ->willThrowException(new SchemaException()); |
|
396 | + $sourceSchema->expects($this->any()) |
|
397 | + ->method('hasSequence') |
|
398 | + ->willReturn(false); |
|
399 | + |
|
400 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
401 | + } |
|
402 | + |
|
403 | + |
|
404 | + public function testEnsureOracleConstraintsTooLongTableName(): void { |
|
405 | + $this->expectException(\InvalidArgumentException::class); |
|
406 | + |
|
407 | + $table = $this->createMock(Table::class); |
|
408 | + $table->expects($this->any()) |
|
409 | + ->method('getName') |
|
410 | + ->willReturn(\str_repeat('a', 31)); |
|
411 | + |
|
412 | + $schema = $this->createMock(Schema::class); |
|
413 | + $schema->expects($this->once()) |
|
414 | + ->method('getTables') |
|
415 | + ->willReturn([$table]); |
|
416 | + |
|
417 | + $sourceSchema = $this->createMock(Schema::class); |
|
418 | + $sourceSchema->expects($this->any()) |
|
419 | + ->method('getTable') |
|
420 | + ->willThrowException(new SchemaException()); |
|
421 | + $sourceSchema->expects($this->any()) |
|
422 | + ->method('hasSequence') |
|
423 | + ->willReturn(false); |
|
424 | + |
|
425 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
426 | + } |
|
427 | + |
|
428 | + |
|
429 | + public function testEnsureOracleConstraintsTooLongPrimaryWithDefault(): void { |
|
430 | + $this->expectException(\InvalidArgumentException::class); |
|
431 | + |
|
432 | + $defaultName = 'PRIMARY'; |
|
433 | + if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
|
434 | + $defaultName = \str_repeat('a', 27) . '_' . \str_repeat('b', 30) . '_seq'; |
|
435 | + } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
|
436 | + $defaultName = \str_repeat('a', 27) . '_seq'; |
|
437 | + } |
|
438 | + |
|
439 | + $index = $this->createMock(Index::class); |
|
440 | + $index->expects($this->any()) |
|
441 | + ->method('getName') |
|
442 | + ->willReturn($defaultName); |
|
443 | + $index->expects($this->any()) |
|
444 | + ->method('getColumns') |
|
445 | + ->willReturn([\str_repeat('b', 30)]); |
|
446 | + |
|
447 | + $table = $this->createMock(Table::class); |
|
448 | + $table->expects($this->any()) |
|
449 | + ->method('getName') |
|
450 | + ->willReturn(\str_repeat('a', 27)); |
|
451 | + |
|
452 | + $table->expects($this->once()) |
|
453 | + ->method('getColumns') |
|
454 | + ->willReturn([]); |
|
455 | + $table->expects($this->once()) |
|
456 | + ->method('getIndexes') |
|
457 | + ->willReturn([]); |
|
458 | + $table->expects($this->once()) |
|
459 | + ->method('getForeignKeys') |
|
460 | + ->willReturn([]); |
|
461 | + $table->expects($this->once()) |
|
462 | + ->method('getPrimaryKey') |
|
463 | + ->willReturn($index); |
|
464 | + |
|
465 | + $schema = $this->createMock(Schema::class); |
|
466 | + $schema->expects($this->once()) |
|
467 | + ->method('getTables') |
|
468 | + ->willReturn([$table]); |
|
469 | + |
|
470 | + $sourceSchema = $this->createMock(Schema::class); |
|
471 | + $sourceSchema->expects($this->any()) |
|
472 | + ->method('getTable') |
|
473 | + ->willThrowException(new SchemaException()); |
|
474 | + $sourceSchema->expects($this->any()) |
|
475 | + ->method('hasSequence') |
|
476 | + ->willReturn(false); |
|
477 | + |
|
478 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
479 | + } |
|
480 | + |
|
481 | + |
|
482 | + public function testEnsureOracleConstraintsTooLongPrimaryWithName(): void { |
|
483 | + $this->expectException(\InvalidArgumentException::class); |
|
484 | + |
|
485 | + $index = $this->createMock(Index::class); |
|
486 | + $index->expects($this->any()) |
|
487 | + ->method('getName') |
|
488 | + ->willReturn(\str_repeat('a', 31)); |
|
489 | + |
|
490 | + $table = $this->createMock(Table::class); |
|
491 | + $table->expects($this->any()) |
|
492 | + ->method('getName') |
|
493 | + ->willReturn(\str_repeat('a', 26)); |
|
494 | + |
|
495 | + $table->expects($this->once()) |
|
496 | + ->method('getColumns') |
|
497 | + ->willReturn([]); |
|
498 | + $table->expects($this->once()) |
|
499 | + ->method('getIndexes') |
|
500 | + ->willReturn([]); |
|
501 | + $table->expects($this->once()) |
|
502 | + ->method('getForeignKeys') |
|
503 | + ->willReturn([]); |
|
504 | + $table->expects($this->once()) |
|
505 | + ->method('getPrimaryKey') |
|
506 | + ->willReturn($index); |
|
507 | + |
|
508 | + $schema = $this->createMock(Schema::class); |
|
509 | + $schema->expects($this->once()) |
|
510 | + ->method('getTables') |
|
511 | + ->willReturn([$table]); |
|
512 | + |
|
513 | + $sourceSchema = $this->createMock(Schema::class); |
|
514 | + $sourceSchema->expects($this->any()) |
|
515 | + ->method('getTable') |
|
516 | + ->willThrowException(new SchemaException()); |
|
517 | + $sourceSchema->expects($this->any()) |
|
518 | + ->method('hasSequence') |
|
519 | + ->willReturn(false); |
|
520 | + |
|
521 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
522 | + } |
|
523 | + |
|
524 | + |
|
525 | + public function testEnsureOracleConstraintsTooLongColumnName(): void { |
|
526 | + $this->expectException(\InvalidArgumentException::class); |
|
527 | + |
|
528 | + $column = $this->createMock(Column::class); |
|
529 | + $column->expects($this->any()) |
|
530 | + ->method('getName') |
|
531 | + ->willReturn(\str_repeat('a', 31)); |
|
532 | + |
|
533 | + $table = $this->createMock(Table::class); |
|
534 | + $table->expects($this->any()) |
|
535 | + ->method('getName') |
|
536 | + ->willReturn(\str_repeat('a', 30)); |
|
537 | + |
|
538 | + $table->expects($this->once()) |
|
539 | + ->method('getColumns') |
|
540 | + ->willReturn([$column]); |
|
541 | + |
|
542 | + $schema = $this->createMock(Schema::class); |
|
543 | + $schema->expects($this->once()) |
|
544 | + ->method('getTables') |
|
545 | + ->willReturn([$table]); |
|
546 | + |
|
547 | + $sourceSchema = $this->createMock(Schema::class); |
|
548 | + $sourceSchema->expects($this->any()) |
|
549 | + ->method('getTable') |
|
550 | + ->willThrowException(new SchemaException()); |
|
551 | + $sourceSchema->expects($this->any()) |
|
552 | + ->method('hasSequence') |
|
553 | + ->willReturn(false); |
|
554 | + |
|
555 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
556 | + } |
|
557 | + |
|
558 | + |
|
559 | + public function testEnsureOracleConstraintsTooLongIndexName(): void { |
|
560 | + $this->expectException(\InvalidArgumentException::class); |
|
561 | + |
|
562 | + $index = $this->createMock(Index::class); |
|
563 | + $index->expects($this->any()) |
|
564 | + ->method('getName') |
|
565 | + ->willReturn(\str_repeat('a', 31)); |
|
566 | + |
|
567 | + $table = $this->createMock(Table::class); |
|
568 | + $table->expects($this->any()) |
|
569 | + ->method('getName') |
|
570 | + ->willReturn(\str_repeat('a', 30)); |
|
571 | + |
|
572 | + $table->expects($this->once()) |
|
573 | + ->method('getColumns') |
|
574 | + ->willReturn([]); |
|
575 | + $table->expects($this->once()) |
|
576 | + ->method('getIndexes') |
|
577 | + ->willReturn([$index]); |
|
578 | + |
|
579 | + $schema = $this->createMock(Schema::class); |
|
580 | + $schema->expects($this->once()) |
|
581 | + ->method('getTables') |
|
582 | + ->willReturn([$table]); |
|
583 | + |
|
584 | + $sourceSchema = $this->createMock(Schema::class); |
|
585 | + $sourceSchema->expects($this->any()) |
|
586 | + ->method('getTable') |
|
587 | + ->willThrowException(new SchemaException()); |
|
588 | + $sourceSchema->expects($this->any()) |
|
589 | + ->method('hasSequence') |
|
590 | + ->willReturn(false); |
|
591 | + |
|
592 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
593 | + } |
|
594 | + |
|
595 | + |
|
596 | + public function testEnsureOracleConstraintsTooLongForeignKeyName(): void { |
|
597 | + $this->expectException(\InvalidArgumentException::class); |
|
598 | + |
|
599 | + $foreignKey = $this->createMock(ForeignKeyConstraint::class); |
|
600 | + $foreignKey->expects($this->any()) |
|
601 | + ->method('getName') |
|
602 | + ->willReturn(\str_repeat('a', 31)); |
|
603 | + |
|
604 | + $table = $this->createMock(Table::class); |
|
605 | + $table->expects($this->any()) |
|
606 | + ->method('getName') |
|
607 | + ->willReturn(\str_repeat('a', 30)); |
|
608 | + |
|
609 | + $table->expects($this->once()) |
|
610 | + ->method('getColumns') |
|
611 | + ->willReturn([]); |
|
612 | + $table->expects($this->once()) |
|
613 | + ->method('getIndexes') |
|
614 | + ->willReturn([]); |
|
615 | + $table->expects($this->once()) |
|
616 | + ->method('getForeignKeys') |
|
617 | + ->willReturn([$foreignKey]); |
|
618 | + |
|
619 | + $schema = $this->createMock(Schema::class); |
|
620 | + $schema->expects($this->once()) |
|
621 | + ->method('getTables') |
|
622 | + ->willReturn([$table]); |
|
623 | + |
|
624 | + $sourceSchema = $this->createMock(Schema::class); |
|
625 | + $sourceSchema->expects($this->any()) |
|
626 | + ->method('getTable') |
|
627 | + ->willThrowException(new SchemaException()); |
|
628 | + $sourceSchema->expects($this->any()) |
|
629 | + ->method('hasSequence') |
|
630 | + ->willReturn(false); |
|
631 | + |
|
632 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
633 | + } |
|
634 | + |
|
635 | + |
|
636 | + public function testEnsureOracleConstraintsNoPrimaryKey(): void { |
|
637 | + $this->markTestSkipped('Test disabled for now due to multiple reasons, see https://github.com/nextcloud/server/pull/31580#issuecomment-1069182234 for details.'); |
|
638 | + $this->expectException(\InvalidArgumentException::class); |
|
639 | + |
|
640 | + $table = $this->createMock(Table::class); |
|
641 | + $table->expects($this->atLeastOnce()) |
|
642 | + ->method('getName') |
|
643 | + ->willReturn(\str_repeat('a', 30)); |
|
644 | + $table->expects($this->once()) |
|
645 | + ->method('getColumns') |
|
646 | + ->willReturn([]); |
|
647 | + $table->expects($this->once()) |
|
648 | + ->method('getIndexes') |
|
649 | + ->willReturn([]); |
|
650 | + $table->expects($this->once()) |
|
651 | + ->method('getForeignKeys') |
|
652 | + ->willReturn([]); |
|
653 | + $table->expects($this->once()) |
|
654 | + ->method('getPrimaryKey') |
|
655 | + ->willReturn(null); |
|
656 | + |
|
657 | + $schema = $this->createMock(Schema::class); |
|
658 | + $schema->expects($this->once()) |
|
659 | + ->method('getTables') |
|
660 | + ->willReturn([$table]); |
|
661 | + $schema->expects($this->once()) |
|
662 | + ->method('getSequences') |
|
663 | + ->willReturn([]); |
|
664 | + |
|
665 | + $sourceSchema = $this->createMock(Schema::class); |
|
666 | + $sourceSchema->expects($this->any()) |
|
667 | + ->method('getTable') |
|
668 | + ->willThrowException(new SchemaException()); |
|
669 | + $sourceSchema->expects($this->any()) |
|
670 | + ->method('hasSequence') |
|
671 | + ->willReturn(false); |
|
672 | + |
|
673 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
674 | + } |
|
675 | + |
|
676 | + |
|
677 | + public function testEnsureOracleConstraintsTooLongSequenceName(): void { |
|
678 | + $this->expectException(\InvalidArgumentException::class); |
|
679 | + |
|
680 | + $sequence = $this->createMock(Sequence::class); |
|
681 | + $sequence->expects($this->any()) |
|
682 | + ->method('getName') |
|
683 | + ->willReturn(\str_repeat('a', 31)); |
|
684 | + |
|
685 | + $schema = $this->createMock(Schema::class); |
|
686 | + $schema->expects($this->once()) |
|
687 | + ->method('getTables') |
|
688 | + ->willReturn([]); |
|
689 | + $schema->expects($this->once()) |
|
690 | + ->method('getSequences') |
|
691 | + ->willReturn([$sequence]); |
|
692 | + |
|
693 | + $sourceSchema = $this->createMock(Schema::class); |
|
694 | + $sourceSchema->expects($this->any()) |
|
695 | + ->method('getTable') |
|
696 | + ->willThrowException(new SchemaException()); |
|
697 | + $sourceSchema->expects($this->any()) |
|
698 | + ->method('hasSequence') |
|
699 | + ->willReturn(false); |
|
700 | + |
|
701 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
702 | + } |
|
703 | + |
|
704 | + |
|
705 | + public function testEnsureOracleConstraintsBooleanNotNull(): void { |
|
706 | + $this->expectException(\InvalidArgumentException::class); |
|
707 | + |
|
708 | + $column = $this->createMock(Column::class); |
|
709 | + $column->expects($this->any()) |
|
710 | + ->method('getName') |
|
711 | + ->willReturn('aaaa'); |
|
712 | + $column->expects($this->any()) |
|
713 | + ->method('getType') |
|
714 | + ->willReturn(Type::getType('boolean')); |
|
715 | + $column->expects($this->any()) |
|
716 | + ->method('getNotnull') |
|
717 | + ->willReturn(true); |
|
718 | + |
|
719 | + $table = $this->createMock(Table::class); |
|
720 | + $table->expects($this->any()) |
|
721 | + ->method('getName') |
|
722 | + ->willReturn(\str_repeat('a', 30)); |
|
723 | + |
|
724 | + $table->expects($this->once()) |
|
725 | + ->method('getColumns') |
|
726 | + ->willReturn([$column]); |
|
727 | + |
|
728 | + $schema = $this->createMock(Schema::class); |
|
729 | + $schema->expects($this->once()) |
|
730 | + ->method('getTables') |
|
731 | + ->willReturn([$table]); |
|
732 | + |
|
733 | + $sourceSchema = $this->createMock(Schema::class); |
|
734 | + $sourceSchema->expects($this->any()) |
|
735 | + ->method('getTable') |
|
736 | + ->willThrowException(new SchemaException()); |
|
737 | + $sourceSchema->expects($this->any()) |
|
738 | + ->method('hasSequence') |
|
739 | + ->willReturn(false); |
|
740 | + |
|
741 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
742 | + } |
|
743 | + |
|
744 | + |
|
745 | + public function testEnsureOracleConstraintsStringLength4000(): void { |
|
746 | + $this->expectException(\InvalidArgumentException::class); |
|
747 | + |
|
748 | + $column = $this->createMock(Column::class); |
|
749 | + $column->expects($this->any()) |
|
750 | + ->method('getName') |
|
751 | + ->willReturn('aaaa'); |
|
752 | + $column->expects($this->any()) |
|
753 | + ->method('getType') |
|
754 | + ->willReturn(Type::getType('string')); |
|
755 | + $column->expects($this->any()) |
|
756 | + ->method('getLength') |
|
757 | + ->willReturn(4001); |
|
758 | + |
|
759 | + $table = $this->createMock(Table::class); |
|
760 | + $table->expects($this->any()) |
|
761 | + ->method('getName') |
|
762 | + ->willReturn(\str_repeat('a', 30)); |
|
763 | + |
|
764 | + $table->expects($this->once()) |
|
765 | + ->method('getColumns') |
|
766 | + ->willReturn([$column]); |
|
767 | + |
|
768 | + $schema = $this->createMock(Schema::class); |
|
769 | + $schema->expects($this->once()) |
|
770 | + ->method('getTables') |
|
771 | + ->willReturn([$table]); |
|
772 | + |
|
773 | + $sourceSchema = $this->createMock(Schema::class); |
|
774 | + $sourceSchema->expects($this->any()) |
|
775 | + ->method('getTable') |
|
776 | + ->willThrowException(new SchemaException()); |
|
777 | + $sourceSchema->expects($this->any()) |
|
778 | + ->method('hasSequence') |
|
779 | + ->willReturn(false); |
|
780 | + |
|
781 | + self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]); |
|
782 | + } |
|
783 | + |
|
784 | + |
|
785 | + public function testExtractMigrationAttributes(): void { |
|
786 | + $metadataManager = Server::get(MetadataManager::class); |
|
787 | + $this->appManager->loadApp('testing'); |
|
788 | + |
|
789 | + $this->assertEquals($this->getMigrationMetadata(), json_decode(json_encode($metadataManager->extractMigrationAttributes('testing')), true)); |
|
790 | + |
|
791 | + $this->appManager->disableApp('testing'); |
|
792 | + } |
|
793 | + |
|
794 | + public function testDeserializeMigrationMetadata(): void { |
|
795 | + $metadataManager = Server::get(MetadataManager::class); |
|
796 | + $this->assertEquals( |
|
797 | + [ |
|
798 | + 'core' => [], |
|
799 | + 'apps' => [ |
|
800 | + 'testing' => [ |
|
801 | + '30000Date20240102030405' => [ |
|
802 | + new DropTable('old_table'), |
|
803 | + new CreateTable('new_table', |
|
804 | + description: 'Table is used to store things, but also to get more things', |
|
805 | + notes: ['this is a notice', 'and another one, if really needed'] |
|
806 | + ), |
|
807 | + new AddColumn('my_table'), |
|
808 | + new AddColumn('my_table', 'another_field'), |
|
809 | + new AddColumn('other_table', 'last_one', ColumnType::DATE), |
|
810 | + new AddIndex('my_table'), |
|
811 | + new AddIndex('my_table', IndexType::PRIMARY), |
|
812 | + new DropColumn('other_table'), |
|
813 | + new DropColumn('other_table', 'old_column', |
|
814 | + description: 'field is not used anymore and replaced by \'last_one\'' |
|
815 | + ), |
|
816 | + new DropIndex('other_table'), |
|
817 | + new ModifyColumn('other_table'), |
|
818 | + new ModifyColumn('other_table', 'this_field'), |
|
819 | + new ModifyColumn('other_table', 'this_field', ColumnType::BIGINT) |
|
820 | + ] |
|
821 | + ] |
|
822 | + ] |
|
823 | + ], |
|
824 | + $metadataManager->getMigrationsAttributesFromReleaseMetadata( |
|
825 | + [ |
|
826 | + 'core' => [], |
|
827 | + 'apps' => ['testing' => $this->getMigrationMetadata()] |
|
828 | + ] |
|
829 | + ) |
|
830 | + ); |
|
831 | + } |
|
832 | + |
|
833 | + private function getMigrationMetadata(): array { |
|
834 | + return [ |
|
835 | + '30000Date20240102030405' => [ |
|
836 | + [ |
|
837 | + 'class' => 'OCP\\Migration\\Attributes\\DropTable', |
|
838 | + 'table' => 'old_table', |
|
839 | + 'description' => '', |
|
840 | + 'notes' => [], |
|
841 | + 'columns' => [] |
|
842 | + ], |
|
843 | + [ |
|
844 | + 'class' => 'OCP\\Migration\\Attributes\\CreateTable', |
|
845 | + 'table' => 'new_table', |
|
846 | + 'description' => 'Table is used to store things, but also to get more things', |
|
847 | + 'notes' => |
|
848 | + [ |
|
849 | + 'this is a notice', |
|
850 | + 'and another one, if really needed' |
|
851 | + ], |
|
852 | + 'columns' => [] |
|
853 | + ], |
|
854 | + [ |
|
855 | + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
856 | + 'table' => 'my_table', |
|
857 | + 'description' => '', |
|
858 | + 'notes' => [], |
|
859 | + 'name' => '', |
|
860 | + 'type' => '' |
|
861 | + ], |
|
862 | + [ |
|
863 | + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
864 | + 'table' => 'my_table', |
|
865 | + 'description' => '', |
|
866 | + 'notes' => [], |
|
867 | + 'name' => 'another_field', |
|
868 | + 'type' => '' |
|
869 | + ], |
|
870 | + [ |
|
871 | + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', |
|
872 | + 'table' => 'other_table', |
|
873 | + 'description' => '', |
|
874 | + 'notes' => [], |
|
875 | + 'name' => 'last_one', |
|
876 | + 'type' => 'date' |
|
877 | + ], |
|
878 | + [ |
|
879 | + 'class' => 'OCP\\Migration\\Attributes\\AddIndex', |
|
880 | + 'table' => 'my_table', |
|
881 | + 'description' => '', |
|
882 | + 'notes' => [], |
|
883 | + 'type' => '' |
|
884 | + ], |
|
885 | + [ |
|
886 | + 'class' => 'OCP\\Migration\\Attributes\\AddIndex', |
|
887 | + 'table' => 'my_table', |
|
888 | + 'description' => '', |
|
889 | + 'notes' => [], |
|
890 | + 'type' => 'primary' |
|
891 | + ], |
|
892 | + [ |
|
893 | + 'class' => 'OCP\\Migration\\Attributes\\DropColumn', |
|
894 | + 'table' => 'other_table', |
|
895 | + 'description' => '', |
|
896 | + 'notes' => [], |
|
897 | + 'name' => '', |
|
898 | + 'type' => '' |
|
899 | + ], |
|
900 | + [ |
|
901 | + 'class' => 'OCP\\Migration\\Attributes\\DropColumn', |
|
902 | + 'table' => 'other_table', |
|
903 | + 'description' => 'field is not used anymore and replaced by \'last_one\'', |
|
904 | + 'notes' => [], |
|
905 | + 'name' => 'old_column', |
|
906 | + 'type' => '' |
|
907 | + ], |
|
908 | + [ |
|
909 | + 'class' => 'OCP\\Migration\\Attributes\\DropIndex', |
|
910 | + 'table' => 'other_table', |
|
911 | + 'description' => '', |
|
912 | + 'notes' => [], |
|
913 | + 'type' => '' |
|
914 | + ], |
|
915 | + [ |
|
916 | + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
917 | + 'table' => 'other_table', |
|
918 | + 'description' => '', |
|
919 | + 'notes' => [], |
|
920 | + 'name' => '', |
|
921 | + 'type' => '' |
|
922 | + ], |
|
923 | + [ |
|
924 | + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
925 | + 'table' => 'other_table', |
|
926 | + 'description' => '', |
|
927 | + 'notes' => [], |
|
928 | + 'name' => 'this_field', |
|
929 | + 'type' => '' |
|
930 | + ], |
|
931 | + [ |
|
932 | + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', |
|
933 | + 'table' => 'other_table', |
|
934 | + 'description' => '', |
|
935 | + 'notes' => [], |
|
936 | + 'name' => 'this_field', |
|
937 | + 'type' => 'bigint' |
|
938 | + ], |
|
939 | + ] |
|
940 | + ]; |
|
941 | + } |
|
942 | 942 | } |
@@ -41,8 +41,8 @@ discard block |
||
41 | 41 | * @package Test\DB |
42 | 42 | */ |
43 | 43 | class MigrationsTest extends \Test\TestCase { |
44 | - private MigrationService|MockObject $migrationService; |
|
45 | - private MockObject|IDBConnection $db; |
|
44 | + private MigrationService | MockObject $migrationService; |
|
45 | + private MockObject | IDBConnection $db; |
|
46 | 46 | private IAppManager $appManager; |
47 | 47 | |
48 | 48 | protected function setUp(): void { |
@@ -57,7 +57,7 @@ discard block |
||
57 | 57 | |
58 | 58 | public function testGetters(): void { |
59 | 59 | $this->assertEquals('testing', $this->migrationService->getApp()); |
60 | - $this->assertEquals(\OC::$SERVERROOT . '/apps/testing/lib/Migration', $this->migrationService->getMigrationsDirectory()); |
|
60 | + $this->assertEquals(\OC::$SERVERROOT.'/apps/testing/lib/Migration', $this->migrationService->getMigrationsDirectory()); |
|
61 | 61 | $this->assertEquals('OCA\Testing\Migration', $this->migrationService->getMigrationsNamespace()); |
62 | 62 | $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
63 | 63 | } |
@@ -66,7 +66,7 @@ discard block |
||
66 | 66 | $this->migrationService = new MigrationService('core', $this->db); |
67 | 67 | |
68 | 68 | $this->assertEquals('core', $this->migrationService->getApp()); |
69 | - $this->assertEquals(\OC::$SERVERROOT . '/core/Migrations', $this->migrationService->getMigrationsDirectory()); |
|
69 | + $this->assertEquals(\OC::$SERVERROOT.'/core/Migrations', $this->migrationService->getMigrationsDirectory()); |
|
70 | 70 | $this->assertEquals('OC\Core\Migrations', $this->migrationService->getMigrationsNamespace()); |
71 | 71 | $this->assertEquals('test_oc_migrations', $this->migrationService->getMigrationsTableName()); |
72 | 72 | } |
@@ -234,7 +234,7 @@ discard block |
||
234 | 234 | ]; |
235 | 235 | $this->migrationService->expects($this->exactly(2)) |
236 | 236 | ->method('executeStep') |
237 | - ->willReturnCallback(function () use (&$calls) { |
|
237 | + ->willReturnCallback(function() use (&$calls) { |
|
238 | 238 | $expected = array_shift($calls); |
239 | 239 | $this->assertEquals($expected, func_get_args()); |
240 | 240 | }); |
@@ -350,9 +350,9 @@ discard block |
||
350 | 350 | public function testEnsureOracleConstraintsValidWithPrimaryKeyDefault(): void { |
351 | 351 | $defaultName = 'PRIMARY'; |
352 | 352 | if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
353 | - $defaultName = \str_repeat('a', 26) . '_' . \str_repeat('b', 30) . '_seq'; |
|
353 | + $defaultName = \str_repeat('a', 26).'_'.\str_repeat('b', 30).'_seq'; |
|
354 | 354 | } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
355 | - $defaultName = \str_repeat('a', 26) . '_seq'; |
|
355 | + $defaultName = \str_repeat('a', 26).'_seq'; |
|
356 | 356 | } |
357 | 357 | |
358 | 358 | $index = $this->createMock(Index::class); |
@@ -431,9 +431,9 @@ discard block |
||
431 | 431 | |
432 | 432 | $defaultName = 'PRIMARY'; |
433 | 433 | if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) { |
434 | - $defaultName = \str_repeat('a', 27) . '_' . \str_repeat('b', 30) . '_seq'; |
|
434 | + $defaultName = \str_repeat('a', 27).'_'.\str_repeat('b', 30).'_seq'; |
|
435 | 435 | } elseif ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) { |
436 | - $defaultName = \str_repeat('a', 27) . '_seq'; |
|
436 | + $defaultName = \str_repeat('a', 27).'_seq'; |
|
437 | 437 | } |
438 | 438 | |
439 | 439 | $index = $this->createMock(Index::class); |
@@ -23,198 +23,198 @@ |
||
23 | 23 | use Test\TestCase; |
24 | 24 | |
25 | 25 | class AvailabilityCoordinatorTest extends TestCase { |
26 | - private AvailabilityCoordinator $availabilityCoordinator; |
|
27 | - private ICacheFactory $cacheFactory; |
|
28 | - private ICache $cache; |
|
29 | - private IConfig|MockObject $config; |
|
30 | - private AbsenceService $absenceService; |
|
31 | - private LoggerInterface $logger; |
|
32 | - private MockObject|TimezoneService $timezoneService; |
|
33 | - |
|
34 | - protected function setUp(): void { |
|
35 | - parent::setUp(); |
|
36 | - |
|
37 | - $this->cacheFactory = $this->createMock(ICacheFactory::class); |
|
38 | - $this->cache = $this->createMock(ICache::class); |
|
39 | - $this->absenceService = $this->createMock(AbsenceService::class); |
|
40 | - $this->config = $this->createMock(IConfig::class); |
|
41 | - $this->logger = $this->createMock(LoggerInterface::class); |
|
42 | - $this->timezoneService = $this->createMock(TimezoneService::class); |
|
43 | - |
|
44 | - $this->cacheFactory->expects(self::once()) |
|
45 | - ->method('createLocal') |
|
46 | - ->willReturn($this->cache); |
|
47 | - |
|
48 | - $this->availabilityCoordinator = new AvailabilityCoordinator( |
|
49 | - $this->cacheFactory, |
|
50 | - $this->config, |
|
51 | - $this->absenceService, |
|
52 | - $this->logger, |
|
53 | - $this->timezoneService, |
|
54 | - ); |
|
55 | - } |
|
56 | - |
|
57 | - public function testIsEnabled(): void { |
|
58 | - $this->config->expects(self::once()) |
|
59 | - ->method('getAppValue') |
|
60 | - ->with('dav', 'hide_absence_settings', 'no') |
|
61 | - ->willReturn('no'); |
|
62 | - |
|
63 | - $isEnabled = $this->availabilityCoordinator->isEnabled(); |
|
64 | - |
|
65 | - self::assertTrue($isEnabled); |
|
66 | - } |
|
67 | - |
|
68 | - public function testGetOutOfOfficeDataInEffect(): void { |
|
69 | - $absence = new Absence(); |
|
70 | - $absence->setId(420); |
|
71 | - $absence->setUserId('user'); |
|
72 | - $absence->setFirstDay('2023-10-01'); |
|
73 | - $absence->setLastDay('2023-10-08'); |
|
74 | - $absence->setStatus('Vacation'); |
|
75 | - $absence->setMessage('On vacation'); |
|
76 | - $absence->setReplacementUserId('batman'); |
|
77 | - $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
78 | - $this->timezoneService->method('getUserTimezone')->with('user')->willReturn('Europe/Berlin'); |
|
79 | - |
|
80 | - $user = $this->createMock(IUser::class); |
|
81 | - $user->method('getUID') |
|
82 | - ->willReturn('user'); |
|
83 | - |
|
84 | - $this->cache->expects(self::exactly(2)) |
|
85 | - ->method('get') |
|
86 | - ->willReturnOnConsecutiveCalls(null, null); |
|
87 | - $this->absenceService->expects(self::once()) |
|
88 | - ->method('getAbsence') |
|
89 | - ->with($user->getUID()) |
|
90 | - ->willReturn($absence); |
|
91 | - |
|
92 | - $calls = [ |
|
93 | - [$user->getUID() . '_timezone', 'Europe/Berlin', 3600], |
|
94 | - [$user->getUID(), '{"id":"420","startDate":1696111200,"endDate":1696802340,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}', 300], |
|
95 | - ]; |
|
96 | - $this->cache->expects(self::exactly(2)) |
|
97 | - ->method('set') |
|
98 | - ->willReturnCallback(static function () use (&$calls): void { |
|
99 | - $expected = array_shift($calls); |
|
100 | - self::assertEquals($expected, func_get_args()); |
|
101 | - }); |
|
102 | - |
|
103 | - $expected = new OutOfOfficeData( |
|
104 | - '420', |
|
105 | - $user, |
|
106 | - 1696111200, |
|
107 | - 1696802340, |
|
108 | - 'Vacation', |
|
109 | - 'On vacation', |
|
110 | - 'batman', |
|
111 | - 'Bruce Wayne', |
|
112 | - ); |
|
113 | - $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
114 | - self::assertEquals($expected, $actual); |
|
115 | - } |
|
116 | - |
|
117 | - public function testGetOutOfOfficeDataCachedAll(): void { |
|
118 | - $absence = new Absence(); |
|
119 | - $absence->setId(420); |
|
120 | - $absence->setUserId('user'); |
|
121 | - $absence->setFirstDay('2023-10-01'); |
|
122 | - $absence->setLastDay('2023-10-08'); |
|
123 | - $absence->setStatus('Vacation'); |
|
124 | - $absence->setMessage('On vacation'); |
|
125 | - $absence->setReplacementUserId('batman'); |
|
126 | - $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
127 | - |
|
128 | - $user = $this->createMock(IUser::class); |
|
129 | - $user->method('getUID') |
|
130 | - ->willReturn('user'); |
|
131 | - |
|
132 | - $this->cache->expects(self::exactly(2)) |
|
133 | - ->method('get') |
|
134 | - ->willReturnOnConsecutiveCalls('UTC', '{"id":"420","startDate":1696118400,"endDate":1696809540,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}'); |
|
135 | - $this->absenceService->expects(self::never()) |
|
136 | - ->method('getAbsence'); |
|
137 | - $this->cache->expects(self::exactly(1)) |
|
138 | - ->method('set'); |
|
139 | - |
|
140 | - $expected = new OutOfOfficeData( |
|
141 | - '420', |
|
142 | - $user, |
|
143 | - 1696118400, |
|
144 | - 1696809540, |
|
145 | - 'Vacation', |
|
146 | - 'On vacation', |
|
147 | - 'batman', |
|
148 | - 'Bruce Wayne' |
|
149 | - ); |
|
150 | - $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
151 | - self::assertEquals($expected, $actual); |
|
152 | - } |
|
153 | - |
|
154 | - public function testGetOutOfOfficeDataNoData(): void { |
|
155 | - $absence = new Absence(); |
|
156 | - $absence->setId(420); |
|
157 | - $absence->setUserId('user'); |
|
158 | - $absence->setFirstDay('2023-10-01'); |
|
159 | - $absence->setLastDay('2023-10-08'); |
|
160 | - $absence->setStatus('Vacation'); |
|
161 | - $absence->setMessage('On vacation'); |
|
162 | - |
|
163 | - $user = $this->createMock(IUser::class); |
|
164 | - $user->method('getUID') |
|
165 | - ->willReturn('user'); |
|
166 | - |
|
167 | - $this->cache->expects(self::exactly(2)) |
|
168 | - ->method('get') |
|
169 | - ->willReturnOnConsecutiveCalls('UTC', null); |
|
170 | - $this->absenceService->expects(self::once()) |
|
171 | - ->method('getAbsence') |
|
172 | - ->willReturn(null); |
|
173 | - $this->cache->expects(self::never()) |
|
174 | - ->method('set'); |
|
175 | - |
|
176 | - $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
177 | - self::assertNull($actual); |
|
178 | - } |
|
179 | - |
|
180 | - public function testGetOutOfOfficeDataWithInvalidCachedData(): void { |
|
181 | - $absence = new Absence(); |
|
182 | - $absence->setId(420); |
|
183 | - $absence->setUserId('user'); |
|
184 | - $absence->setFirstDay('2023-10-01'); |
|
185 | - $absence->setLastDay('2023-10-08'); |
|
186 | - $absence->setStatus('Vacation'); |
|
187 | - $absence->setMessage('On vacation'); |
|
188 | - $absence->setReplacementUserId('batman'); |
|
189 | - $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
190 | - $this->timezoneService->method('getUserTimezone')->with('user')->willReturn('Europe/Berlin'); |
|
191 | - |
|
192 | - $user = $this->createMock(IUser::class); |
|
193 | - $user->method('getUID') |
|
194 | - ->willReturn('user'); |
|
195 | - |
|
196 | - $this->cache->expects(self::exactly(2)) |
|
197 | - ->method('get') |
|
198 | - ->willReturnOnConsecutiveCalls('UTC', '{"id":"420",}'); |
|
199 | - $this->absenceService->expects(self::once()) |
|
200 | - ->method('getAbsence') |
|
201 | - ->with('user') |
|
202 | - ->willReturn($absence); |
|
203 | - $this->cache->expects(self::once()) |
|
204 | - ->method('set') |
|
205 | - ->with('user', '{"id":"420","startDate":1696118400,"endDate":1696809540,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}', 300); |
|
206 | - |
|
207 | - $expected = new OutOfOfficeData( |
|
208 | - '420', |
|
209 | - $user, |
|
210 | - 1696118400, |
|
211 | - 1696809540, |
|
212 | - 'Vacation', |
|
213 | - 'On vacation', |
|
214 | - 'batman', |
|
215 | - 'Bruce Wayne' |
|
216 | - ); |
|
217 | - $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
218 | - self::assertEquals($expected, $actual); |
|
219 | - } |
|
26 | + private AvailabilityCoordinator $availabilityCoordinator; |
|
27 | + private ICacheFactory $cacheFactory; |
|
28 | + private ICache $cache; |
|
29 | + private IConfig|MockObject $config; |
|
30 | + private AbsenceService $absenceService; |
|
31 | + private LoggerInterface $logger; |
|
32 | + private MockObject|TimezoneService $timezoneService; |
|
33 | + |
|
34 | + protected function setUp(): void { |
|
35 | + parent::setUp(); |
|
36 | + |
|
37 | + $this->cacheFactory = $this->createMock(ICacheFactory::class); |
|
38 | + $this->cache = $this->createMock(ICache::class); |
|
39 | + $this->absenceService = $this->createMock(AbsenceService::class); |
|
40 | + $this->config = $this->createMock(IConfig::class); |
|
41 | + $this->logger = $this->createMock(LoggerInterface::class); |
|
42 | + $this->timezoneService = $this->createMock(TimezoneService::class); |
|
43 | + |
|
44 | + $this->cacheFactory->expects(self::once()) |
|
45 | + ->method('createLocal') |
|
46 | + ->willReturn($this->cache); |
|
47 | + |
|
48 | + $this->availabilityCoordinator = new AvailabilityCoordinator( |
|
49 | + $this->cacheFactory, |
|
50 | + $this->config, |
|
51 | + $this->absenceService, |
|
52 | + $this->logger, |
|
53 | + $this->timezoneService, |
|
54 | + ); |
|
55 | + } |
|
56 | + |
|
57 | + public function testIsEnabled(): void { |
|
58 | + $this->config->expects(self::once()) |
|
59 | + ->method('getAppValue') |
|
60 | + ->with('dav', 'hide_absence_settings', 'no') |
|
61 | + ->willReturn('no'); |
|
62 | + |
|
63 | + $isEnabled = $this->availabilityCoordinator->isEnabled(); |
|
64 | + |
|
65 | + self::assertTrue($isEnabled); |
|
66 | + } |
|
67 | + |
|
68 | + public function testGetOutOfOfficeDataInEffect(): void { |
|
69 | + $absence = new Absence(); |
|
70 | + $absence->setId(420); |
|
71 | + $absence->setUserId('user'); |
|
72 | + $absence->setFirstDay('2023-10-01'); |
|
73 | + $absence->setLastDay('2023-10-08'); |
|
74 | + $absence->setStatus('Vacation'); |
|
75 | + $absence->setMessage('On vacation'); |
|
76 | + $absence->setReplacementUserId('batman'); |
|
77 | + $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
78 | + $this->timezoneService->method('getUserTimezone')->with('user')->willReturn('Europe/Berlin'); |
|
79 | + |
|
80 | + $user = $this->createMock(IUser::class); |
|
81 | + $user->method('getUID') |
|
82 | + ->willReturn('user'); |
|
83 | + |
|
84 | + $this->cache->expects(self::exactly(2)) |
|
85 | + ->method('get') |
|
86 | + ->willReturnOnConsecutiveCalls(null, null); |
|
87 | + $this->absenceService->expects(self::once()) |
|
88 | + ->method('getAbsence') |
|
89 | + ->with($user->getUID()) |
|
90 | + ->willReturn($absence); |
|
91 | + |
|
92 | + $calls = [ |
|
93 | + [$user->getUID() . '_timezone', 'Europe/Berlin', 3600], |
|
94 | + [$user->getUID(), '{"id":"420","startDate":1696111200,"endDate":1696802340,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}', 300], |
|
95 | + ]; |
|
96 | + $this->cache->expects(self::exactly(2)) |
|
97 | + ->method('set') |
|
98 | + ->willReturnCallback(static function () use (&$calls): void { |
|
99 | + $expected = array_shift($calls); |
|
100 | + self::assertEquals($expected, func_get_args()); |
|
101 | + }); |
|
102 | + |
|
103 | + $expected = new OutOfOfficeData( |
|
104 | + '420', |
|
105 | + $user, |
|
106 | + 1696111200, |
|
107 | + 1696802340, |
|
108 | + 'Vacation', |
|
109 | + 'On vacation', |
|
110 | + 'batman', |
|
111 | + 'Bruce Wayne', |
|
112 | + ); |
|
113 | + $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
114 | + self::assertEquals($expected, $actual); |
|
115 | + } |
|
116 | + |
|
117 | + public function testGetOutOfOfficeDataCachedAll(): void { |
|
118 | + $absence = new Absence(); |
|
119 | + $absence->setId(420); |
|
120 | + $absence->setUserId('user'); |
|
121 | + $absence->setFirstDay('2023-10-01'); |
|
122 | + $absence->setLastDay('2023-10-08'); |
|
123 | + $absence->setStatus('Vacation'); |
|
124 | + $absence->setMessage('On vacation'); |
|
125 | + $absence->setReplacementUserId('batman'); |
|
126 | + $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
127 | + |
|
128 | + $user = $this->createMock(IUser::class); |
|
129 | + $user->method('getUID') |
|
130 | + ->willReturn('user'); |
|
131 | + |
|
132 | + $this->cache->expects(self::exactly(2)) |
|
133 | + ->method('get') |
|
134 | + ->willReturnOnConsecutiveCalls('UTC', '{"id":"420","startDate":1696118400,"endDate":1696809540,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}'); |
|
135 | + $this->absenceService->expects(self::never()) |
|
136 | + ->method('getAbsence'); |
|
137 | + $this->cache->expects(self::exactly(1)) |
|
138 | + ->method('set'); |
|
139 | + |
|
140 | + $expected = new OutOfOfficeData( |
|
141 | + '420', |
|
142 | + $user, |
|
143 | + 1696118400, |
|
144 | + 1696809540, |
|
145 | + 'Vacation', |
|
146 | + 'On vacation', |
|
147 | + 'batman', |
|
148 | + 'Bruce Wayne' |
|
149 | + ); |
|
150 | + $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
151 | + self::assertEquals($expected, $actual); |
|
152 | + } |
|
153 | + |
|
154 | + public function testGetOutOfOfficeDataNoData(): void { |
|
155 | + $absence = new Absence(); |
|
156 | + $absence->setId(420); |
|
157 | + $absence->setUserId('user'); |
|
158 | + $absence->setFirstDay('2023-10-01'); |
|
159 | + $absence->setLastDay('2023-10-08'); |
|
160 | + $absence->setStatus('Vacation'); |
|
161 | + $absence->setMessage('On vacation'); |
|
162 | + |
|
163 | + $user = $this->createMock(IUser::class); |
|
164 | + $user->method('getUID') |
|
165 | + ->willReturn('user'); |
|
166 | + |
|
167 | + $this->cache->expects(self::exactly(2)) |
|
168 | + ->method('get') |
|
169 | + ->willReturnOnConsecutiveCalls('UTC', null); |
|
170 | + $this->absenceService->expects(self::once()) |
|
171 | + ->method('getAbsence') |
|
172 | + ->willReturn(null); |
|
173 | + $this->cache->expects(self::never()) |
|
174 | + ->method('set'); |
|
175 | + |
|
176 | + $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
177 | + self::assertNull($actual); |
|
178 | + } |
|
179 | + |
|
180 | + public function testGetOutOfOfficeDataWithInvalidCachedData(): void { |
|
181 | + $absence = new Absence(); |
|
182 | + $absence->setId(420); |
|
183 | + $absence->setUserId('user'); |
|
184 | + $absence->setFirstDay('2023-10-01'); |
|
185 | + $absence->setLastDay('2023-10-08'); |
|
186 | + $absence->setStatus('Vacation'); |
|
187 | + $absence->setMessage('On vacation'); |
|
188 | + $absence->setReplacementUserId('batman'); |
|
189 | + $absence->setReplacementUserDisplayName('Bruce Wayne'); |
|
190 | + $this->timezoneService->method('getUserTimezone')->with('user')->willReturn('Europe/Berlin'); |
|
191 | + |
|
192 | + $user = $this->createMock(IUser::class); |
|
193 | + $user->method('getUID') |
|
194 | + ->willReturn('user'); |
|
195 | + |
|
196 | + $this->cache->expects(self::exactly(2)) |
|
197 | + ->method('get') |
|
198 | + ->willReturnOnConsecutiveCalls('UTC', '{"id":"420",}'); |
|
199 | + $this->absenceService->expects(self::once()) |
|
200 | + ->method('getAbsence') |
|
201 | + ->with('user') |
|
202 | + ->willReturn($absence); |
|
203 | + $this->cache->expects(self::once()) |
|
204 | + ->method('set') |
|
205 | + ->with('user', '{"id":"420","startDate":1696118400,"endDate":1696809540,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}', 300); |
|
206 | + |
|
207 | + $expected = new OutOfOfficeData( |
|
208 | + '420', |
|
209 | + $user, |
|
210 | + 1696118400, |
|
211 | + 1696809540, |
|
212 | + 'Vacation', |
|
213 | + 'On vacation', |
|
214 | + 'batman', |
|
215 | + 'Bruce Wayne' |
|
216 | + ); |
|
217 | + $actual = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); |
|
218 | + self::assertEquals($expected, $actual); |
|
219 | + } |
|
220 | 220 | } |
@@ -26,10 +26,10 @@ discard block |
||
26 | 26 | private AvailabilityCoordinator $availabilityCoordinator; |
27 | 27 | private ICacheFactory $cacheFactory; |
28 | 28 | private ICache $cache; |
29 | - private IConfig|MockObject $config; |
|
29 | + private IConfig | MockObject $config; |
|
30 | 30 | private AbsenceService $absenceService; |
31 | 31 | private LoggerInterface $logger; |
32 | - private MockObject|TimezoneService $timezoneService; |
|
32 | + private MockObject | TimezoneService $timezoneService; |
|
33 | 33 | |
34 | 34 | protected function setUp(): void { |
35 | 35 | parent::setUp(); |
@@ -90,12 +90,12 @@ discard block |
||
90 | 90 | ->willReturn($absence); |
91 | 91 | |
92 | 92 | $calls = [ |
93 | - [$user->getUID() . '_timezone', 'Europe/Berlin', 3600], |
|
93 | + [$user->getUID().'_timezone', 'Europe/Berlin', 3600], |
|
94 | 94 | [$user->getUID(), '{"id":"420","startDate":1696111200,"endDate":1696802340,"shortMessage":"Vacation","message":"On vacation","replacementUserId":"batman","replacementUserDisplayName":"Bruce Wayne"}', 300], |
95 | 95 | ]; |
96 | 96 | $this->cache->expects(self::exactly(2)) |
97 | 97 | ->method('set') |
98 | - ->willReturnCallback(static function () use (&$calls): void { |
|
98 | + ->willReturnCallback(static function() use (&$calls): void { |
|
99 | 99 | $expected = array_shift($calls); |
100 | 100 | self::assertEquals($expected, func_get_args()); |
101 | 101 | }); |
@@ -17,82 +17,82 @@ |
||
17 | 17 | use Test\TestCase; |
18 | 18 | |
19 | 19 | class ProviderManagerTest extends TestCase { |
20 | - /** @var IServerContainer */ |
|
21 | - protected $serverContainer; |
|
22 | - /** @var LoggerInterface */ |
|
23 | - protected $logger; |
|
24 | - /** @var IProviderManager */ |
|
25 | - protected $providerManager; |
|
26 | - |
|
27 | - protected function setUp(): void { |
|
28 | - parent::setUp(); |
|
29 | - |
|
30 | - $this->serverContainer = $this->createMock(IServerContainer::class); |
|
31 | - $this->logger = $this->createMock(LoggerInterface::class); |
|
32 | - |
|
33 | - $this->providerManager = new class($this->serverContainer, $this->logger) extends ProviderManager { |
|
34 | - public function countProviders(): int { |
|
35 | - return count($this->providers); |
|
36 | - } |
|
37 | - }; |
|
38 | - } |
|
39 | - |
|
40 | - public function testRegisterResourceProvider(): void { |
|
41 | - $this->providerManager->registerResourceProvider('AwesomeResourceProvider'); |
|
42 | - $this->assertSame(1, $this->providerManager->countProviders()); |
|
43 | - } |
|
44 | - |
|
45 | - public function testGetResourceProvidersNoProvider(): void { |
|
46 | - $this->assertCount(0, $this->providerManager->getResourceProviders()); |
|
47 | - } |
|
48 | - |
|
49 | - public function testGetResourceProvidersValidProvider(): void { |
|
50 | - $this->serverContainer->expects($this->once()) |
|
51 | - ->method('query') |
|
52 | - ->with($this->equalTo(ResourceProvider::class)) |
|
53 | - ->willReturn($this->createMock(ResourceProvider::class)); |
|
54 | - |
|
55 | - $this->providerManager->registerResourceProvider(ResourceProvider::class); |
|
56 | - $resourceProviders = $this->providerManager->getResourceProviders(); |
|
57 | - |
|
58 | - $this->assertCount(1, $resourceProviders); |
|
59 | - $this->assertInstanceOf(ResourceProvider::class, $resourceProviders[0]); |
|
60 | - } |
|
61 | - |
|
62 | - public function testGetResourceProvidersInvalidProvider(): void { |
|
63 | - $this->serverContainer->expects($this->once()) |
|
64 | - ->method('query') |
|
65 | - ->with($this->equalTo('InvalidResourceProvider')) |
|
66 | - ->willThrowException(new QueryException('A meaningful error message')); |
|
67 | - |
|
68 | - $this->logger->expects($this->once()) |
|
69 | - ->method('error'); |
|
70 | - |
|
71 | - $this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|
72 | - $resourceProviders = $this->providerManager->getResourceProviders(); |
|
73 | - |
|
74 | - $this->assertCount(0, $resourceProviders); |
|
75 | - } |
|
76 | - |
|
77 | - public function testGetResourceProvidersValidAndInvalidProvider(): void { |
|
78 | - $this->serverContainer->expects($this->exactly(2)) |
|
79 | - ->method('query') |
|
80 | - ->willReturnCallback(function (string $service) { |
|
81 | - if ($service === 'InvalidResourceProvider') { |
|
82 | - throw new QueryException('A meaningful error message'); |
|
83 | - } |
|
84 | - if ($service === ResourceProvider::class) { |
|
85 | - return $this->createMock(ResourceProvider::class); |
|
86 | - } |
|
87 | - }); |
|
88 | - |
|
89 | - $this->logger->expects($this->once()) |
|
90 | - ->method('error'); |
|
91 | - |
|
92 | - $this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|
93 | - $this->providerManager->registerResourceProvider(ResourceProvider::class); |
|
94 | - $resourceProviders = $this->providerManager->getResourceProviders(); |
|
95 | - |
|
96 | - $this->assertCount(1, $resourceProviders); |
|
97 | - } |
|
20 | + /** @var IServerContainer */ |
|
21 | + protected $serverContainer; |
|
22 | + /** @var LoggerInterface */ |
|
23 | + protected $logger; |
|
24 | + /** @var IProviderManager */ |
|
25 | + protected $providerManager; |
|
26 | + |
|
27 | + protected function setUp(): void { |
|
28 | + parent::setUp(); |
|
29 | + |
|
30 | + $this->serverContainer = $this->createMock(IServerContainer::class); |
|
31 | + $this->logger = $this->createMock(LoggerInterface::class); |
|
32 | + |
|
33 | + $this->providerManager = new class($this->serverContainer, $this->logger) extends ProviderManager { |
|
34 | + public function countProviders(): int { |
|
35 | + return count($this->providers); |
|
36 | + } |
|
37 | + }; |
|
38 | + } |
|
39 | + |
|
40 | + public function testRegisterResourceProvider(): void { |
|
41 | + $this->providerManager->registerResourceProvider('AwesomeResourceProvider'); |
|
42 | + $this->assertSame(1, $this->providerManager->countProviders()); |
|
43 | + } |
|
44 | + |
|
45 | + public function testGetResourceProvidersNoProvider(): void { |
|
46 | + $this->assertCount(0, $this->providerManager->getResourceProviders()); |
|
47 | + } |
|
48 | + |
|
49 | + public function testGetResourceProvidersValidProvider(): void { |
|
50 | + $this->serverContainer->expects($this->once()) |
|
51 | + ->method('query') |
|
52 | + ->with($this->equalTo(ResourceProvider::class)) |
|
53 | + ->willReturn($this->createMock(ResourceProvider::class)); |
|
54 | + |
|
55 | + $this->providerManager->registerResourceProvider(ResourceProvider::class); |
|
56 | + $resourceProviders = $this->providerManager->getResourceProviders(); |
|
57 | + |
|
58 | + $this->assertCount(1, $resourceProviders); |
|
59 | + $this->assertInstanceOf(ResourceProvider::class, $resourceProviders[0]); |
|
60 | + } |
|
61 | + |
|
62 | + public function testGetResourceProvidersInvalidProvider(): void { |
|
63 | + $this->serverContainer->expects($this->once()) |
|
64 | + ->method('query') |
|
65 | + ->with($this->equalTo('InvalidResourceProvider')) |
|
66 | + ->willThrowException(new QueryException('A meaningful error message')); |
|
67 | + |
|
68 | + $this->logger->expects($this->once()) |
|
69 | + ->method('error'); |
|
70 | + |
|
71 | + $this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|
72 | + $resourceProviders = $this->providerManager->getResourceProviders(); |
|
73 | + |
|
74 | + $this->assertCount(0, $resourceProviders); |
|
75 | + } |
|
76 | + |
|
77 | + public function testGetResourceProvidersValidAndInvalidProvider(): void { |
|
78 | + $this->serverContainer->expects($this->exactly(2)) |
|
79 | + ->method('query') |
|
80 | + ->willReturnCallback(function (string $service) { |
|
81 | + if ($service === 'InvalidResourceProvider') { |
|
82 | + throw new QueryException('A meaningful error message'); |
|
83 | + } |
|
84 | + if ($service === ResourceProvider::class) { |
|
85 | + return $this->createMock(ResourceProvider::class); |
|
86 | + } |
|
87 | + }); |
|
88 | + |
|
89 | + $this->logger->expects($this->once()) |
|
90 | + ->method('error'); |
|
91 | + |
|
92 | + $this->providerManager->registerResourceProvider('InvalidResourceProvider'); |
|
93 | + $this->providerManager->registerResourceProvider(ResourceProvider::class); |
|
94 | + $resourceProviders = $this->providerManager->getResourceProviders(); |
|
95 | + |
|
96 | + $this->assertCount(1, $resourceProviders); |
|
97 | + } |
|
98 | 98 | } |
@@ -77,7 +77,7 @@ |
||
77 | 77 | public function testGetResourceProvidersValidAndInvalidProvider(): void { |
78 | 78 | $this->serverContainer->expects($this->exactly(2)) |
79 | 79 | ->method('query') |
80 | - ->willReturnCallback(function (string $service) { |
|
80 | + ->willReturnCallback(function(string $service) { |
|
81 | 81 | if ($service === 'InvalidResourceProvider') { |
82 | 82 | throw new QueryException('A meaningful error message'); |
83 | 83 | } |
@@ -21,127 +21,127 @@ |
||
21 | 21 | * @package Test\Log |
22 | 22 | */ |
23 | 23 | class LogFactoryTest extends TestCase { |
24 | - /** @var IServerContainer|\PHPUnit\Framework\MockObject\MockObject */ |
|
25 | - protected $c; |
|
26 | - |
|
27 | - /** @var LogFactory */ |
|
28 | - protected $factory; |
|
29 | - |
|
30 | - /** @var SystemConfig|\PHPUnit\Framework\MockObject\MockObject */ |
|
31 | - protected $systemConfig; |
|
32 | - |
|
33 | - protected function setUp(): void { |
|
34 | - parent::setUp(); |
|
35 | - |
|
36 | - $this->c = $this->createMock(IServerContainer::class); |
|
37 | - $this->systemConfig = $this->createMock(SystemConfig::class); |
|
38 | - |
|
39 | - $this->factory = new LogFactory($this->c, $this->systemConfig); |
|
40 | - } |
|
41 | - |
|
42 | - public static function fileTypeProvider(): array { |
|
43 | - return [ |
|
44 | - [ |
|
45 | - 'file' |
|
46 | - ], |
|
47 | - [ |
|
48 | - 'nextcloud' |
|
49 | - ], |
|
50 | - [ |
|
51 | - 'owncloud' |
|
52 | - ], |
|
53 | - [ |
|
54 | - 'krzxkyr_default' |
|
55 | - ] |
|
56 | - ]; |
|
57 | - } |
|
58 | - |
|
59 | - /** |
|
60 | - * @param string $type |
|
61 | - * @dataProvider fileTypeProvider |
|
62 | - * @throws \OCP\AppFramework\QueryException |
|
63 | - */ |
|
64 | - public function testFile(string $type): void { |
|
65 | - $datadir = \OC::$SERVERROOT . '/data'; |
|
66 | - $defaultLog = $datadir . '/nextcloud.log'; |
|
67 | - |
|
68 | - $this->systemConfig->expects($this->exactly(3)) |
|
69 | - ->method('getValue') |
|
70 | - ->willReturnMap([ |
|
71 | - ['datadirectory', $datadir, $datadir], |
|
72 | - ['logfile', $defaultLog, $defaultLog], |
|
73 | - ['logfilemode', 0640, 0640], |
|
74 | - ]); |
|
75 | - |
|
76 | - $log = $this->factory->get($type); |
|
77 | - $this->assertInstanceOf(File::class, $log); |
|
78 | - } |
|
79 | - |
|
80 | - public static function logFilePathProvider():array { |
|
81 | - return [ |
|
82 | - [ |
|
83 | - '/dev/null', |
|
84 | - '/dev/null' |
|
85 | - ], |
|
86 | - [ |
|
87 | - '/xdev/youshallfallback', |
|
88 | - \OC::$SERVERROOT . '/data/nextcloud.log' |
|
89 | - ] |
|
90 | - ]; |
|
91 | - } |
|
92 | - |
|
93 | - /** |
|
94 | - * @dataProvider logFilePathProvider |
|
95 | - * @throws \OCP\AppFramework\QueryException |
|
96 | - */ |
|
97 | - public function testFileCustomPath($path, $expected): void { |
|
98 | - $datadir = \OC::$SERVERROOT . '/data'; |
|
99 | - $defaultLog = $datadir . '/nextcloud.log'; |
|
100 | - |
|
101 | - $this->systemConfig->expects($this->exactly(3)) |
|
102 | - ->method('getValue') |
|
103 | - ->willReturnMap([ |
|
104 | - ['datadirectory', $datadir, $datadir], |
|
105 | - ['logfile', $defaultLog, $path], |
|
106 | - ['logfilemode', 0640, 0640], |
|
107 | - ]); |
|
108 | - |
|
109 | - $log = $this->factory->get('file'); |
|
110 | - $this->assertInstanceOf(File::class, $log); |
|
111 | - $this->assertSame($expected, $log->getLogFilePath()); |
|
112 | - } |
|
113 | - |
|
114 | - /** |
|
115 | - * @throws \OCP\AppFramework\QueryException |
|
116 | - */ |
|
117 | - public function testErrorLog(): void { |
|
118 | - $log = $this->factory->get('errorlog'); |
|
119 | - $this->assertInstanceOf(Errorlog::class, $log); |
|
120 | - } |
|
121 | - |
|
122 | - /** |
|
123 | - * @throws \OCP\AppFramework\QueryException |
|
124 | - */ |
|
125 | - public function testSystemLog(): void { |
|
126 | - $this->c->expects($this->once()) |
|
127 | - ->method('resolve') |
|
128 | - ->with(Syslog::class) |
|
129 | - ->willReturn($this->createMock(Syslog::class)); |
|
130 | - |
|
131 | - $log = $this->factory->get('syslog'); |
|
132 | - $this->assertInstanceOf(Syslog::class, $log); |
|
133 | - } |
|
134 | - |
|
135 | - /** |
|
136 | - * @throws \OCP\AppFramework\QueryException |
|
137 | - */ |
|
138 | - public function testSystemdLog(): void { |
|
139 | - $this->c->expects($this->once()) |
|
140 | - ->method('resolve') |
|
141 | - ->with(Systemdlog::class) |
|
142 | - ->willReturn($this->createMock(Systemdlog::class)); |
|
143 | - |
|
144 | - $log = $this->factory->get('systemd'); |
|
145 | - $this->assertInstanceOf(Systemdlog::class, $log); |
|
146 | - } |
|
24 | + /** @var IServerContainer|\PHPUnit\Framework\MockObject\MockObject */ |
|
25 | + protected $c; |
|
26 | + |
|
27 | + /** @var LogFactory */ |
|
28 | + protected $factory; |
|
29 | + |
|
30 | + /** @var SystemConfig|\PHPUnit\Framework\MockObject\MockObject */ |
|
31 | + protected $systemConfig; |
|
32 | + |
|
33 | + protected function setUp(): void { |
|
34 | + parent::setUp(); |
|
35 | + |
|
36 | + $this->c = $this->createMock(IServerContainer::class); |
|
37 | + $this->systemConfig = $this->createMock(SystemConfig::class); |
|
38 | + |
|
39 | + $this->factory = new LogFactory($this->c, $this->systemConfig); |
|
40 | + } |
|
41 | + |
|
42 | + public static function fileTypeProvider(): array { |
|
43 | + return [ |
|
44 | + [ |
|
45 | + 'file' |
|
46 | + ], |
|
47 | + [ |
|
48 | + 'nextcloud' |
|
49 | + ], |
|
50 | + [ |
|
51 | + 'owncloud' |
|
52 | + ], |
|
53 | + [ |
|
54 | + 'krzxkyr_default' |
|
55 | + ] |
|
56 | + ]; |
|
57 | + } |
|
58 | + |
|
59 | + /** |
|
60 | + * @param string $type |
|
61 | + * @dataProvider fileTypeProvider |
|
62 | + * @throws \OCP\AppFramework\QueryException |
|
63 | + */ |
|
64 | + public function testFile(string $type): void { |
|
65 | + $datadir = \OC::$SERVERROOT . '/data'; |
|
66 | + $defaultLog = $datadir . '/nextcloud.log'; |
|
67 | + |
|
68 | + $this->systemConfig->expects($this->exactly(3)) |
|
69 | + ->method('getValue') |
|
70 | + ->willReturnMap([ |
|
71 | + ['datadirectory', $datadir, $datadir], |
|
72 | + ['logfile', $defaultLog, $defaultLog], |
|
73 | + ['logfilemode', 0640, 0640], |
|
74 | + ]); |
|
75 | + |
|
76 | + $log = $this->factory->get($type); |
|
77 | + $this->assertInstanceOf(File::class, $log); |
|
78 | + } |
|
79 | + |
|
80 | + public static function logFilePathProvider():array { |
|
81 | + return [ |
|
82 | + [ |
|
83 | + '/dev/null', |
|
84 | + '/dev/null' |
|
85 | + ], |
|
86 | + [ |
|
87 | + '/xdev/youshallfallback', |
|
88 | + \OC::$SERVERROOT . '/data/nextcloud.log' |
|
89 | + ] |
|
90 | + ]; |
|
91 | + } |
|
92 | + |
|
93 | + /** |
|
94 | + * @dataProvider logFilePathProvider |
|
95 | + * @throws \OCP\AppFramework\QueryException |
|
96 | + */ |
|
97 | + public function testFileCustomPath($path, $expected): void { |
|
98 | + $datadir = \OC::$SERVERROOT . '/data'; |
|
99 | + $defaultLog = $datadir . '/nextcloud.log'; |
|
100 | + |
|
101 | + $this->systemConfig->expects($this->exactly(3)) |
|
102 | + ->method('getValue') |
|
103 | + ->willReturnMap([ |
|
104 | + ['datadirectory', $datadir, $datadir], |
|
105 | + ['logfile', $defaultLog, $path], |
|
106 | + ['logfilemode', 0640, 0640], |
|
107 | + ]); |
|
108 | + |
|
109 | + $log = $this->factory->get('file'); |
|
110 | + $this->assertInstanceOf(File::class, $log); |
|
111 | + $this->assertSame($expected, $log->getLogFilePath()); |
|
112 | + } |
|
113 | + |
|
114 | + /** |
|
115 | + * @throws \OCP\AppFramework\QueryException |
|
116 | + */ |
|
117 | + public function testErrorLog(): void { |
|
118 | + $log = $this->factory->get('errorlog'); |
|
119 | + $this->assertInstanceOf(Errorlog::class, $log); |
|
120 | + } |
|
121 | + |
|
122 | + /** |
|
123 | + * @throws \OCP\AppFramework\QueryException |
|
124 | + */ |
|
125 | + public function testSystemLog(): void { |
|
126 | + $this->c->expects($this->once()) |
|
127 | + ->method('resolve') |
|
128 | + ->with(Syslog::class) |
|
129 | + ->willReturn($this->createMock(Syslog::class)); |
|
130 | + |
|
131 | + $log = $this->factory->get('syslog'); |
|
132 | + $this->assertInstanceOf(Syslog::class, $log); |
|
133 | + } |
|
134 | + |
|
135 | + /** |
|
136 | + * @throws \OCP\AppFramework\QueryException |
|
137 | + */ |
|
138 | + public function testSystemdLog(): void { |
|
139 | + $this->c->expects($this->once()) |
|
140 | + ->method('resolve') |
|
141 | + ->with(Systemdlog::class) |
|
142 | + ->willReturn($this->createMock(Systemdlog::class)); |
|
143 | + |
|
144 | + $log = $this->factory->get('systemd'); |
|
145 | + $this->assertInstanceOf(Systemdlog::class, $log); |
|
146 | + } |
|
147 | 147 | } |