‪TYPO3CMS  ‪main
SlugServiceTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\Test;
21 use Psr\EventDispatcher\EventDispatcherInterface;
22 use Psr\Log\NullLogger;
23 use Symfony\Component\DependencyInjection\Container;
41 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
42 
48 final class ‪SlugServiceTest extends FunctionalTestCase
49 {
53  private ‪$subject;
54 
59 
60  private array ‪$languages = [
61  [
62  'title' => 'English',
63  'enabled' => true,
64  'languageId' => '0',
65  'base' => '/en/',
66  'locale' => 'en_US.UTF-8',
67  'navigationTitle' => 'English',
68  'flag' => 'us',
69  ],
70  [
71  'title' => 'German',
72  'enabled' => true,
73  'languageId' => '1',
74  'base' => 'https://de.example.com/',
75  'locale' => 'de_DE.UTF-8',
76  'navigationTitle' => 'German',
77  'flag' => 'de',
78  ],
79  [
80  'title' => 'Spanish',
81  'enabled' => true,
82  'languageId' => '2',
83  'base' => '/es/',
84  'locale' => 'es_ES.UTF-8',
85  'navigationTitle' => 'Spanish',
86  'flag' => 'es',
87  ],
88  ];
89 
90  protected array ‪$coreExtensionsToLoad = ['redirects'];
91 
92  protected function ‪setUp(): void
93  {
94  parent::setUp();
95  $this->correlationId = ‪CorrelationId::forScope(‪StringUtility::getUniqueId('test'));
96  $this->importCSVDataSet(__DIR__ . '/Fixtures/be_users.csv');
97  $backendUser = $this->setUpBackendUser(1);
98  ‪$GLOBALS['LANG'] = $this->get(LanguageServiceFactory::class)->createFromUserPreferences($backendUser);
99  }
100 
101  protected function ‪tearDown(): void
102  {
103  unset($this->subject, $this->correlationId);
104  parent::tearDown();
105  }
106 
113  #[Test]
115  {
116  $newPageSlug = '/test-new';
117  $this->‪buildBaseSite();
118  $this->‪createSubject();
119  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test1.csv');
120  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
121  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
122  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
123  $this->‪setPageSlug(2, $newPageSlug);
124 
125  // These are the slugs after rebuildSlugsForSlugChange() has run
126  $slugs = [
127  '/',
128  '/test-new',
129  '/dummy-1-3',
130  '/dummy-1-4',
131  '/test-new/dummy-1-2-5',
132  '/test-new/dummy-1-2-6',
133  '/test-new/dummy-1-2-7',
134  '/dummy-1-3/dummy-1-3-8',
135  '/dummy-1-3/dummy-1-3-9',
136  '/dummy-1-4/dummy-1-4-10',
137  ];
138 
139  // This redirects should exist, after rebuildSlugsForSlugChange() has run
140  $redirects = [
141  ['source_host' => '*', 'source_path' => '/dummy-1-2', 'target' => 't3://page?uid=2&_language=0'],
142  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-5', 'target' => 't3://page?uid=5&_language=0'],
143  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-6', 'target' => 't3://page?uid=6&_language=0'],
144  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-7', 'target' => 't3://page?uid=7&_language=0'],
145  ];
146 
147  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
148  }
149 
156  #[Test]
158  {
159  $newPageSlug = '/new-home';
160  $this->‪buildBaseSite();
161  $this->‪createSubject();
162  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test2.csv');
163  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(1);
164  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
165  $this->subject->rebuildSlugsForSlugChange(1, $changeItem, $this->correlationId);
166  $this->‪setPageSlug(1, $newPageSlug);
167 
168  // These are the slugs after rebuildSlugsForSlugChange() has run
169  $slugs = [
170  '/new-home',
171  '/new-home/dummy-1-2',
172  '/new-home/dummy-1-3',
173  '/new-home/dummy-1-4',
174  '/new-home/dummy-1-2/dummy-1-2-5',
175  '/new-home/dummy-1-2/dummy-1-2-6',
176  '/new-home/dummy-1-2/dummy-1-2-7',
177  '/new-home/dummy-1-3/dummy-1-3-8',
178  '/new-home/dummy-1-3/dummy-1-3-9',
179  '/new-home/dummy-1-4/dummy-1-4-10',
180  ];
181 
182  // This redirects should exist, after rebuildSlugsForSlugChange() has run
183  $redirects = [
184  ['source_host' => '*', 'source_path' => '/', 'target' => 't3://page?uid=1&_language=0'],
185  ['source_host' => '*', 'source_path' => '/dummy-1-2', 'target' => 't3://page?uid=2&_language=0'],
186  ['source_host' => '*', 'source_path' => '/dummy-1-3', 'target' => 't3://page?uid=3&_language=0'],
187  ['source_host' => '*', 'source_path' => '/dummy-1-4', 'target' => 't3://page?uid=4&_language=0'],
188  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-5', 'target' => 't3://page?uid=5&_language=0'],
189  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-6', 'target' => 't3://page?uid=6&_language=0'],
190  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-7', 'target' => 't3://page?uid=7&_language=0'],
191  ['source_host' => '*', 'source_path' => '/dummy-1-3/dummy-1-3-8', 'target' => 't3://page?uid=8&_language=0'],
192  ['source_host' => '*', 'source_path' => '/dummy-1-3/dummy-1-3-9', 'target' => 't3://page?uid=9&_language=0'],
193  ['source_host' => '*', 'source_path' => '/dummy-1-4/dummy-1-4-10', 'target' => 't3://page?uid=10&_language=0'],
194  ];
195 
196  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
197  }
198 
205  #[Test]
207  {
208  $newPageSlug = '/test-new';
210  $this->‪createSubject();
211  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test1.csv');
212  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
213  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
214  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
215  $this->‪setPageSlug(2, $newPageSlug);
216 
217  // These are the slugs after rebuildSlugsForSlugChange() has run
218  $slugs = [
219  '/',
220  '/test-new',
221  '/dummy-1-3',
222  '/dummy-1-4',
223  '/test-new/dummy-1-2-5',
224  '/test-new/dummy-1-2-6',
225  '/test-new/dummy-1-2-7',
226  '/dummy-1-3/dummy-1-3-8',
227  '/dummy-1-3/dummy-1-3-9',
228  '/dummy-1-4/dummy-1-4-10',
229  ];
230 
231  // This redirects should exists, after rebuildSlugsForSlugChange() has run
232  $redirects = [
233  ['source_host' => '*', 'source_path' => '/sub-folder/dummy-1-2', 'target' => 't3://page?uid=2&_language=0'],
234  ['source_host' => '*', 'source_path' => '/sub-folder/dummy-1-2/dummy-1-2-5', 'target' => 't3://page?uid=5&_language=0'],
235  ['source_host' => '*', 'source_path' => '/sub-folder/dummy-1-2/dummy-1-2-6', 'target' => 't3://page?uid=6&_language=0'],
236  ['source_host' => '*', 'source_path' => '/sub-folder/dummy-1-2/dummy-1-2-7', 'target' => 't3://page?uid=7&_language=0'],
237  ];
238 
239  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
240  }
241 
248  #[Test]
250  {
251  $newPageSlug = '/test-new';
253  $this->‪createSubject();
254  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test3.csv');
255  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(31);
256  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
257  $this->subject->rebuildSlugsForSlugChange(31, $changeItem, $this->correlationId);
258  $this->‪setPageSlug(31, $newPageSlug);
259 
260  // These are the slugs after rebuildSlugsForSlugChange() has run
261  $slugs = [
262  '/',
263  '/dummy-1-2',
264  '/test-new',
265  '/dummy-1-3',
266  '/dummy-1-4',
267  '/dummy-1-2/dummy-1-2-5',
268  '/dummy-1-2/dummy-1-2-6',
269  '/dummy-1-2/dummy-1-2-7',
270  '/dummy-1-3/dummy-1-3-8',
271  '/test-new/dummy-1-3-8',
272  '/dummy-1-3/dummy-1-3-9',
273  '/dummy-1-4/dummy-1-4-10',
274  ];
275 
276  // This redirects should exist, after rebuildSlugsForSlugChange() has run
277  $redirects = [
278  ['source_host' => 'de.example.com', 'source_path' => '/dummy-1-3', 'target' => 't3://page?uid=3&_language=1'],
279  ['source_host' => 'de.example.com', 'source_path' => '/dummy-1-3/dummy-1-3-8', 'target' => 't3://page?uid=8&_language=1'],
280  ];
281 
282  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
283  }
284 
291  #[Test]
293  {
294  $newPageSlug = '/test-new';
296  $this->‪createSubject();
297  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test3.csv');
298  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(31);
299  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
300  $this->subject->rebuildSlugsForSlugChange(31, $changeItem, $this->correlationId);
301  $this->‪setPageSlug(31, $newPageSlug);
302 
303  // These are the slugs after rebuildSlugsForSlugChange() has run
304  $slugs = [
305  '/',
306  '/dummy-1-2',
307  '/test-new',
308  '/dummy-1-3',
309  '/dummy-1-4',
310  '/dummy-1-2/dummy-1-2-5',
311  '/dummy-1-2/dummy-1-2-6',
312  '/dummy-1-2/dummy-1-2-7',
313  '/dummy-1-3/dummy-1-3-8',
314  '/test-new/dummy-1-3-8',
315  '/dummy-1-3/dummy-1-3-9',
316  '/dummy-1-4/dummy-1-4-10',
317  ];
318 
319  // This redirects should exist, after rebuildSlugsForSlugChange() has run
320  $redirects = [
321  ['source_host' => 'de.example.com', 'source_path' => '/sub-folder/dummy-1-3', 'target' => 't3://page?uid=3&_language=1'],
322  ['source_host' => 'de.example.com', 'source_path' => '/sub-folder/dummy-1-3/dummy-1-3-8', 'target' => 't3://page?uid=8&_language=1'],
323  ];
324 
325  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
326  }
327 
334  #[Test]
336  {
337  $newPageSlug = '/test-new';
339  $this->‪createSubject();
340  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test3.csv');
341  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(3);
342  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
343  $this->subject->rebuildSlugsForSlugChange(3, $changeItem, $this->correlationId);
344  $this->‪setPageSlug(3, $newPageSlug);
345 
346  // These are the slugs after rebuildSlugsForSlugChange() has run
347  $slugs = [
348  '/',
349  '/dummy-1-2',
350  '/test-new',
351  '/dummy-1-3',
352  '/dummy-1-4',
353  '/dummy-1-2/dummy-1-2-5',
354  '/dummy-1-2/dummy-1-2-6',
355  '/dummy-1-2/dummy-1-2-7',
356  '/dummy-1-3/dummy-1-3-8',
357  '/test-new/dummy-1-3-8',
358  '/test-new/dummy-1-3-9',
359  '/dummy-1-4/dummy-1-4-10',
360  ];
361 
362  // This redirects should exist, after rebuildSlugsForSlugChange() has run
363  $redirects = [
364  ['source_host' => '*', 'source_path' => '/sub-folder/en/dummy-1-3', 'target' => 't3://page?uid=3&_language=0'],
365  ['source_host' => '*', 'source_path' => '/sub-folder/en/dummy-1-3/dummy-1-3-8', 'target' => 't3://page?uid=8&_language=0'],
366  ['source_host' => '*', 'source_path' => '/sub-folder/en/dummy-1-3/dummy-1-3-9', 'target' => 't3://page?uid=9&_language=0'],
367  ];
368 
369  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
370  }
371 
378  #[Test]
380  {
381  $newPageSlug = '/test-new';
383  $this->‪createSubject();
384  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_pages_test4.csv');
385  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(5);
386  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
387  $this->subject->rebuildSlugsForSlugChange(5, $changeItem, $this->correlationId);
388  $this->‪setPageSlug(5, $newPageSlug);
389 
390  // These are the slugs after rebuildSlugsForSlugChange() has run
391  $slugs = [
392  '/',
393  '/dummy-1-2',
394  '/dummy-1-3',
395  '/dummy-1-2/dummy-1-2-3',
396  '/test-new',
397  '/test-new/dummy-1-2',
398  '/test-new/dummy-1-3',
399  '/test-new/dummy-1-2/dummy-1-2-3',
400  ];
401 
402  // This redirects should exist, after rebuildSlugsForSlugChange() has run
403  $redirects = [
404  ['source_host' => 'de.example.com', 'source_path' => '/', 'target' => 't3://page?uid=1&_language=1'],
405  ['source_host' => 'de.example.com', 'source_path' => '/dummy-1-2', 'target' => 't3://page?uid=2&_language=1'],
406  ['source_host' => 'de.example.com', 'source_path' => '/dummy-1-3', 'target' => 't3://page?uid=3&_language=1'],
407  ['source_host' => 'de.example.com', 'source_path' => '/dummy-1-2/dummy-1-2-3', 'target' => 't3://page?uid=4&_language=1'],
408  ];
409 
410  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
411  }
412 
413  #[Test]
415  {
416  $newPageSlug = '/test-new';
417  $eventOverrideSource = '/overridden-new';
419  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_ModifyAutoCreateRedirectRecordBeforePersistingEvent.csv');
420 
422  $container = $this->get('service_container');
423  $container->set(
424  'modify-auto-create-redirect-record-before-persisting',
425  static function (‪ModifyAutoCreateRedirectRecordBeforePersistingEvent $event) use (
426  &$modifyAutoCreateRedirectRecordBeforePersisting,
427  $eventOverrideSource
428  ) {
429  $modifyAutoCreateRedirectRecordBeforePersisting = $event;
430  $event->‪setRedirectRecord(
431  array_replace(
432  $event->‪getRedirectRecord(),
433  [
434  'source_path' => $eventOverrideSource,
435  ],
436  )
437  );
438  }
439  );
440  $listenerProvider = $container->get(ListenerProvider::class);
441  $listenerProvider->addListener(ModifyAutoCreateRedirectRecordBeforePersistingEvent::class, 'modify-auto-create-redirect-record-before-persisting');
442  $this->‪createSubject();
443 
445  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
446  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
447  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
448  $this->‪setPageSlug(2, $newPageSlug);
449 
450  self::assertInstanceOf(ModifyAutoCreateRedirectRecordBeforePersistingEvent::class, $modifyAutoCreateRedirectRecordBeforePersisting);
451  self::assertSame($eventOverrideSource, $modifyAutoCreateRedirectRecordBeforePersisting->getRedirectRecord()['source_path']);
452 
454  slugs: [
455  '/',
456  $newPageSlug,
457  ],
458  redirects: [
459  ['source_host' => '*', 'source_path' => $eventOverrideSource, 'target' => 't3://page?uid=2&_language=0'],
460  ],
461  );
462  }
463 
464  #[Test]
466  {
467  $newPageSlug = '/test-new';
469  $this->importCSVDataSet(__DIR__ . '/Fixtures/SlugServiceTest_AfterAutoCreateRedirectHasBeenPersistedEvent.csv');
470 
472  $container = $this->get('service_container');
473  $container->set(
474  'after-auto-create-redirect-has-been-persisted',
475  static function (‪AfterAutoCreateRedirectHasBeenPersistedEvent $event) use (
476  &$afterAutoCreateRedirectHasBeenPersisted
477  ) {
478  $afterAutoCreateRedirectHasBeenPersisted = $event;
479  }
480  );
481  $listenerProvider = $container->get(ListenerProvider::class);
482  $listenerProvider->addListener(AfterAutoCreateRedirectHasBeenPersistedEvent::class, 'after-auto-create-redirect-has-been-persisted');
483  $this->‪createSubject();
484 
486  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
487  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
488  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
489  $this->‪setPageSlug(2, $newPageSlug);
490 
491  self::assertInstanceOf(AfterAutoCreateRedirectHasBeenPersistedEvent::class, $afterAutoCreateRedirectHasBeenPersisted);
492  self::assertSame(1, $afterAutoCreateRedirectHasBeenPersisted->getRedirectRecord()['uid'] ?? null);
493 
495  slugs: [
496  '/',
497  $newPageSlug,
498  ],
499  redirects: [
500  ['uid' => 1, 'source_host' => '*', 'source_path' => '/en/dummy-1-2', 'target' => 't3://page?uid=2&_language=0'],
501  ],
502  withRedirectUid: true,
503  );
504  }
505 
506  #[Test]
508  {
509  $newPageSlug = '/test-new';
510  $this->‪buildBaseSite();
511  $this->‪createSubject();
512  $this->importCSVDataSet(__DIR__ . '/Fixtures/SysFolderSubPages_Test1.csv');
513  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
514  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
515  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
516  $this->‪setPageSlug(2, $newPageSlug);
517 
518  // These are the slugs after rebuildSlugsForSlugChange() has run
519  $slugs = [
520  '/',
521  '/test-new',
522  '/dummy-1-3',
523  '/test-new/dummy-1-2-3',
524  ];
525 
526  // This redirects should exist, after rebuildSlugsForSlugChange() has run
527  $redirects = [
528  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-3', 'target' => 't3://page?uid=4&_language=0'],
529  ];
530  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
531  }
532 
533  #[Test]
535  {
536  $newPageSlug = '/test-new';
537  $this->‪buildBaseSite();
538  $this->‪createSubject();
539  $this->importCSVDataSet(__DIR__ . '/Fixtures/SpacerSubPages_Test1.csv');
540  $changeItem = $this->get(SlugRedirectChangeItemFactory::class)->create(2);
541  $changeItem = $changeItem->withChanged(array_merge($changeItem->getOriginal(), ['slug' => $newPageSlug]));
542  $this->subject->rebuildSlugsForSlugChange(2, $changeItem, $this->correlationId);
543  $this->‪setPageSlug(2, $newPageSlug);
544 
545  // These are the slugs after rebuildSlugsForSlugChange() has run
546  $slugs = [
547  '/',
548  '/test-new',
549  '/dummy-1-3',
550  '/test-new/dummy-1-2-3',
551  ];
552 
553  // This redirects should exist, after rebuildSlugsForSlugChange() has run
554  $redirects = [
555  ['source_host' => '*', 'source_path' => '/dummy-1-2/dummy-1-2-3', 'target' => 't3://page?uid=4&_language=0'],
556  ];
557  $this->‪assertSlugsAndRedirectsExists($slugs, $redirects);
558  }
559 
560  protected function ‪buildBaseSite(): void
561  {
562  $configuration = [
563  'rootPageId' => 1,
564  'base' => '/',
565  ];
566  $siteWriter = $this->get(SiteWriter::class);
567  $siteWriter->write('testing', $configuration);
568  }
569 
570  protected function ‪buildBaseSiteInSubfolder(): void
571  {
572  $configuration = [
573  'rootPageId' => 1,
574  'base' => '/sub-folder',
575  ];
576  $siteWriter = $this->get(SiteWriter::class);
577  $siteWriter->write('testing', $configuration);
578  }
579 
580  protected function ‪buildBaseSiteWithLanguages(): void
581  {
582  $configuration = [
583  'rootPageId' => 1,
584  'base' => '/',
585  'languages' => ‪$this->languages,
586  ];
587  $siteWriter = $this->get(SiteWriter::class);
588  $siteWriter->write('testing', $configuration);
589  }
590 
591  protected function ‪buildBaseSiteWithLanguagesInSubFolder(): void
592  {
594  array_walk(‪$languages, static function (&$languageData) {
595  $languageData['base'] = (
596  !str_contains($languageData['base'], 'http')
597  ? $languageData['base']
598  : $languageData['base'] . 'sub-folder/'
599  );
600  });
601  $configuration = [
602  'rootPageId' => 1,
603  'base' => '/sub-folder',
604  'languages' => ‪$languages,
605  ];
606  $siteWriter = $this->get(SiteWriter::class);
607  $siteWriter->write('testing', $configuration);
608  }
609 
610  protected function ‪createSubject(): void
611  {
612  $this->get(SiteMatcher::class)->refresh();
613  $this->get(SiteFinder::class)->getAllSites(false);
614  $this->subject = new ‪SlugService(
615  context: GeneralUtility::makeInstance(Context::class),
616  pageRepository: GeneralUtility::makeInstance(PageRepository::class),
617  linkService: GeneralUtility::makeInstance(LinkService::class),
618  redirectCacheService: GeneralUtility::makeInstance(RedirectCacheService::class),
619  slugRedirectChangeItemFactory: $this->get(SlugRedirectChangeItemFactory::class),
620  eventDispatcher: $this->get(EventDispatcherInterface::class),
621  connectionPool: $this->getConnectionPool(),
622  );
623  $this->subject->setLogger(new NullLogger());
624  }
625 
626  protected function ‪assertSlugsAndRedirectsExists(array $slugs, array $redirects, bool $withRedirectUid = false): void
627  {
628  $pageRecords = $this->getAllRecords('pages');
629  self::assertCount(count($slugs), $pageRecords);
630  foreach ($pageRecords as ‪$record) {
631  self::assertContains(‪$record['slug'], $slugs, 'unexpected slug: ' . ‪$record['slug']);
632  }
633 
634  $redirectRecords = $this->getAllRecords('sys_redirect');
635  self::assertCount(count($redirects), $redirectRecords);
636  foreach ($redirectRecords as ‪$record) {
637  $combination = [
638  'source_host' => ‪$record['source_host'],
639  'source_path' => ‪$record['source_path'],
640  'target' => ‪$record['target'],
641  ];
642  if ($withRedirectUid) {
643  $combination = [
644  'uid' => ‪$record['uid'],
645  'source_host' => ‪$record['source_host'],
646  'source_path' => ‪$record['source_path'],
647  'target' => ‪$record['target'],
648  ];
649  }
650  self::assertContains($combination, $redirects, 'wrong redirect found');
651  }
652  }
653 
654  protected function ‪setPageSlug(int $pageId, string $slug): void
655  {
656  $this->getConnectionPool()->getConnectionForTable('pages')
657  ->update(
658  'pages',
659  [
660  'slug' => $slug,
661  ],
662  [
663  'uid' => $pageId,
664  ]
665  );
666  }
667 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Redirects\RedirectUpdate\SlugRedirectChangeItem
Definition: SlugRedirectChangeItem.php:30
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\$subject
‪SlugService $subject
Definition: SlugServiceTest.php:52
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguagesForSiteroot
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguagesForSiteroot()
Definition: SlugServiceTest.php:377
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirects
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirects()
Definition: SlugServiceTest.php:112
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\spacerWithSubPagesDoesNotCreateAutoRedirectForSpacerButUpdatesSubpagesIfReasonable
‪spacerWithSubPagesDoesNotCreateAutoRedirectForSpacerButUpdatesSubpagesIfReasonable()
Definition: SlugServiceTest.php:532
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\setUp
‪setUp()
Definition: SlugServiceTest.php:90
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsForRootChange
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsForRootChange()
Definition: SlugServiceTest.php:155
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\buildBaseSite
‪buildBaseSite()
Definition: SlugServiceTest.php:558
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguagesInSubFolder
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguagesInSubFolder()
Definition: SlugServiceTest.php:290
‪TYPO3\CMS\Redirects\Event\ModifyAutoCreateRedirectRecordBeforePersistingEvent\getRedirectRecord
‪getRedirectRecord()
Definition: ModifyAutoCreateRedirectRecordBeforePersistingEvent.php:49
‪TYPO3\CMS\Core\DataHandling\Model\CorrelationId\forScope
‪static forScope(string $scope)
Definition: CorrelationId.php:42
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\sysFolderWithSubPagesDoesNotCreateAutoRedirectForSysFolderButUpdatesSubpagesIfReasonable
‪sysFolderWithSubPagesDoesNotCreateAutoRedirectForSysFolderButUpdatesSubpagesIfReasonable()
Definition: SlugServiceTest.php:505
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Redirects\Event\AfterAutoCreateRedirectHasBeenPersistedEvent
Definition: AfterAutoCreateRedirectHasBeenPersistedEvent.php:32
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\buildBaseSiteWithLanguages
‪buildBaseSiteWithLanguages()
Definition: SlugServiceTest.php:578
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithDefaultLanguageInSubFolder
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithDefaultLanguageInSubFolder()
Definition: SlugServiceTest.php:333
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\modifyAutoCreateRedirectRecordBeforePersistingIsTriggered
‪modifyAutoCreateRedirectRecordBeforePersistingIsTriggered()
Definition: SlugServiceTest.php:412
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Redirects\Event\ModifyAutoCreateRedirectRecordBeforePersistingEvent
Definition: ModifyAutoCreateRedirectRecordBeforePersistingEvent.php:32
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguages
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithLanguages()
Definition: SlugServiceTest.php:247
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\setPageSlug
‪setPageSlug(int $pageId, string $slug)
Definition: SlugServiceTest.php:652
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\assertSlugsAndRedirectsExists
‪assertSlugsAndRedirectsExists(array $slugs, array $redirects, bool $withRedirectUid=false)
Definition: SlugServiceTest.php:624
‪TYPO3\CMS\Redirects\Service\RedirectCacheService
Definition: RedirectCacheService.php:34
‪TYPO3\CMS\Redirects\Tests\Functional\Service
Definition: IntegrityServiceTest.php:18
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\tearDown
‪tearDown()
Definition: SlugServiceTest.php:99
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithSubFolderBase
‪rebuildSlugsForSlugChangeRenamesSubSlugsAndCreatesRedirectsWithSubFolderBase()
Definition: SlugServiceTest.php:204
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\buildBaseSiteInSubfolder
‪buildBaseSiteInSubfolder()
Definition: SlugServiceTest.php:568
‪TYPO3\CMS\Core\DataHandling\Model\CorrelationId
Definition: CorrelationId.php:29
‪TYPO3\CMS\Redirects\RedirectUpdate\SlugRedirectChangeItemFactory
Definition: SlugRedirectChangeItemFactory.php:31
‪TYPO3\CMS\Webhooks\Message\$record
‪identifier readonly int readonly array $record
Definition: PageModificationMessage.php:36
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\buildBaseSiteWithLanguagesInSubFolder
‪buildBaseSiteWithLanguagesInSubFolder()
Definition: SlugServiceTest.php:589
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest
Definition: SlugServiceTest.php:49
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\$languages
‪array $languages
Definition: SlugServiceTest.php:58
‪TYPO3\CMS\Core\Configuration\SiteWriter
Definition: SiteWriter.php:39
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\$correlationId
‪CorrelationId $correlationId
Definition: SlugServiceTest.php:56
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\afterAutoCreteRedirectHasBeenPersistedIsTriggered
‪afterAutoCreteRedirectHasBeenPersistedIsTriggered()
Definition: SlugServiceTest.php:463
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\$coreExtensionsToLoad
‪array $coreExtensionsToLoad
Definition: SlugServiceTest.php:88
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:69
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Redirects\Service\SlugService
Definition: SlugService.php:52
‪TYPO3\CMS\Core\EventDispatcher\ListenerProvider
Definition: ListenerProvider.php:30
‪TYPO3\CMS\Redirects\Tests\Functional\Service\SlugServiceTest\createSubject
‪createSubject()
Definition: SlugServiceTest.php:608
‪TYPO3\CMS\Core\Routing\SiteMatcher
Definition: SiteMatcher.php:52
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Redirects\Event\ModifyAutoCreateRedirectRecordBeforePersistingEvent\setRedirectRecord
‪setRedirectRecord(array $redirectRecord)
Definition: ModifyAutoCreateRedirectRecordBeforePersistingEvent.php:54