‪TYPO3CMS  ‪main
AddPageTypeZeroSourceTest.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 Symfony\Component\DependencyInjection\Container;
36 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
37 
38 final class ‪AddPageTypeZeroSourceTest extends FunctionalTestCase
39 {
40  protected array ‪$coreExtensionsToLoad = ['redirects'];
41 
42  #[Test]
44  {
45  $this->importCSVDataSet(__DIR__ . '/Fixtures/SimpleSiteRoot.csv');
46  $this->‪buildBaseSite([]);
47  $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByRootPageId(1);
48  $siteLanguage = $site->getDefaultLanguage();
49 
51  $changeItem = $this->get(EventDispatcherInterface::class)->dispatch(
54  1,
55  1,
56  $site,
57  $siteLanguage,
58  ['slug' => '/'],
60  ['slug' => '/changed'],
61  )
62  )
63  )->getSlugRedirectChangeItem();
64 
65  self::assertSame(1, $changeItem->getSourcesCollection()->count());
66 
67  $source = $changeItem->getSourcesCollection()->all()[0] ?? null;
68  self::assertInstanceOf(PageTypeSource::class, $source);
69  self::assertSame('*', $source->getHost());
70  self::assertSame('/', $source->getPath());
71  self::assertSame([], $source->getTargetLinkParameters());
72  self::assertSame(0, $source->getPageType());
73  }
74 
75  #[Test]
77  {
78  $this->importCSVDataSet(__DIR__ . '/Fixtures/SimpleSiteRootWithPage.csv');
79  $this->‪buildSite([
80  'rootPageId' => 1,
81  'base' => '/',
82  'settings' => [],
83  'routeEnhancers' => [
84  'PageTypeSuffix' => [
85  'type' => 'PageType',
86  'default' => '.html',
87  'index' => 'index',
88  'map' => [
89  '.html' => 0,
90  ],
91  ],
92  ],
93  ]);
94  $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByRootPageId(1);
95  $siteLanguage = $site->getDefaultLanguage();
96 
98  $changeItem = $this->get(EventDispatcherInterface::class)->dispatch(
101  2,
102  2,
103  $site,
104  $siteLanguage,
105  ['slug' => '/first-page'],
107  ['slug' => '/changed'],
108  )
109  )
110  )->getSlugRedirectChangeItem();
111 
112  self::assertSame(2, $changeItem->getSourcesCollection()->count());
113  $sources = $changeItem->getSourcesCollection()->all();
114  $source = $sources[0] ?? null;
115  self::assertInstanceOf(PlainSlugReplacementRedirectSource::class, $source);
116  self::assertSame('*', $source->getHost());
117  self::assertSame('/first-page', $source->getPath());
118  self::assertSame([], $source->getTargetLinkParameters());
119 
120  $source = $sources[1] ?? null;
121  self::assertInstanceOf(PageTypeSource::class, $source);
122  self::assertSame('*', $source->getHost());
123  self::assertSame('/first-page.html', $source->getPath());
124  self::assertSame([], $source->getTargetLinkParameters());
125  self::assertSame(0, $source->getPageType());
126  }
127 
128  #[Test]
129  public function ‪customPageTypeSourceCanBeAdded(): void
130  {
131  $this->importCSVDataSet(__DIR__ . '/Fixtures/SimpleSiteRootWithPage.csv');
132  $this->‪buildSite([
133  'rootPageId' => 1,
134  'base' => '/',
135  'settings' => [],
136  'routeEnhancers' => [
137  'PageTypeSuffix' => [
138  'type' => 'PageType',
139  'default' => '.html',
140  'index' => 'index',
141  'map' => [
142  '.html' => 0,
143  '-search.html' => 1,
144  ],
145  ],
146  ],
147  ]);
148  $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByRootPageId(1);
149  $siteLanguage = $site->getDefaultLanguage();
150 
152  $container = $this->get('service_container');
153  $container->set(
154  'add-custom-page-type-source',
155  static function (‪SlugRedirectChangeItemCreatedEvent $event) {
156  $changeItem = $event->‪getSlugRedirectChangeItem();
157  $site = $changeItem->getSite();
158  $siteLanguage = $changeItem->getSiteLanguage();
159  $pageUid = $changeItem->getPageId();
160  $pageType = 1;
161  try {
162  $context = GeneralUtility::makeInstance(Context::class);
163  $uri = $site->getRouter($context)->generateUri(
164  $pageUid,
165  [
166  '_language' => $siteLanguage,
167  'type' => $pageType,
168  ],
169  '',
171  );
172  $source = new ‪PageTypeSource(
173  $uri->getHost() ?: '*',
174  $uri->getPath(),
175  $pageType,
176  [
177  'type' => $pageType,
178  ],
179  );
180  $sources = $changeItem->getSourcesCollection()->all();
181  $sources[] = $source;
182  $changeItem = $changeItem
183  ->withSourcesCollection(new ‪RedirectSourceCollection(...array_values($sources)));
184  $event->‪setSlugRedirectChangeItem($changeItem);
185  } catch (\InvalidArgumentException | ‪InvalidRouteArgumentsException $e) {
187  sprintf(
188  'The link to the page with ID "%d" and type "%d" could not be generated: %s',
189  $pageUid,
190  $pageType,
191  $e->getMessage()
192  ),
193  1675435942,
194  $e
195  );
196  }
197  }
198  );
199 
200  $listenerProvider = $container->get(ListenerProvider::class);
201  $listenerProvider->addListener(SlugRedirectChangeItemCreatedEvent::class, 'add-custom-page-type-source');
202 
204  $changeItem = $this->get(EventDispatcherInterface::class)->dispatch(
207  2,
208  2,
209  $site,
210  $siteLanguage,
211  ['slug' => '/first-page'],
213  ['slug' => '/changed'],
214  )
215  )
216  )->getSlugRedirectChangeItem();
217 
218  self::assertSame(3, $changeItem->getSourcesCollection()->count());
219  $sources = $changeItem->getSourcesCollection()->all();
220  $source = $sources[0] ?? null;
221  self::assertInstanceOf(PlainSlugReplacementRedirectSource::class, $source);
222  self::assertSame('*', $source->getHost());
223  self::assertSame('/first-page', $source->getPath());
224  self::assertSame([], $source->getTargetLinkParameters());
225 
226  $source = $sources[1] ?? null;
227  self::assertInstanceOf(PageTypeSource::class, $source);
228  self::assertSame('*', $source->getHost());
229  self::assertSame('/first-page.html', $source->getPath());
230  self::assertSame([], $source->getTargetLinkParameters());
231  self::assertSame(0, $source->getPageType());
232 
233  $source = $sources[2] ?? null;
234  self::assertInstanceOf(PageTypeSource::class, $source);
235  self::assertSame('*', $source->getHost());
236  self::assertSame('/first-page-search.html', $source->getPath());
237  self::assertSame(['type' => 1], $source->getTargetLinkParameters());
238  self::assertSame(1, $source->getPageType());
239  }
240 
241  protected function ‪buildBaseSite(array $settings): void
242  {
243  $configuration = [
244  'rootPageId' => 1,
245  'base' => '/',
246  'settings' => $settings,
247  ];
248  $this->‪buildSite($configuration);
249  }
250 
251  protected function ‪buildSite(array $configuration): void
252  {
253  $siteWriter = $this->get(SiteWriter::class);
254  $siteWriter->write('testing', $configuration);
255  }
256 }
‪TYPO3\CMS\Redirects\RedirectUpdate\SlugRedirectChangeItem
Definition: SlugRedirectChangeItem.php:30
‪TYPO3\CMS\Core\Routing\RouterInterface
Definition: RouterInterface.php:28
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\buildBaseSite
‪buildBaseSite(array $settings)
Definition: AddPageTypeZeroSourceTest.php:241
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\pageTypeSourceZeroReplacesPlainSlugReplacementSourceToAvoidDuplicates
‪pageTypeSourceZeroReplacesPlainSlugReplacementSourceToAvoidDuplicates()
Definition: AddPageTypeZeroSourceTest.php:43
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\pageTapeSourceZeroWithPageTypeSuffixRouteEnhancerIsAddedAsAdditionalSource
‪pageTapeSourceZeroWithPageTypeSuffixRouteEnhancerIsAddedAsAdditionalSource()
Definition: AddPageTypeZeroSourceTest.php:76
‪TYPO3\CMS\Redirects\Event\SlugRedirectChangeItemCreatedEvent\setSlugRedirectChangeItem
‪setSlugRedirectChangeItem(SlugRedirectChangeItem $slugRedirectChangeItem)
Definition: SlugRedirectChangeItemCreatedEvent.php:42
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Redirects\RedirectUpdate\PlainSlugReplacementRedirectSource
Definition: PlainSlugReplacementRedirectSource.php:25
‪TYPO3\CMS\Redirects\Event\SlugRedirectChangeItemCreatedEvent
Definition: SlugRedirectChangeItemCreatedEvent.php:32
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest
Definition: AddPageTypeZeroSourceTest.php:39
‪TYPO3\CMS\Core\Routing\InvalidRouteArgumentsException
Definition: InvalidRouteArgumentsException.php:25
‪TYPO3\CMS\Core\Configuration\SiteWriter
Definition: SiteWriter.php:39
‪TYPO3\CMS\Redirects\RedirectUpdate\RedirectSourceCollection
Definition: RedirectSourceCollection.php:24
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener
Definition: AddPageTypeZeroSourceTest.php:18
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\$coreExtensionsToLoad
‪array $coreExtensionsToLoad
Definition: AddPageTypeZeroSourceTest.php:40
‪TYPO3\CMS\Redirects\RedirectUpdate\PageTypeSource
Definition: PageTypeSource.php:21
‪TYPO3\CMS\Redirects\Event\SlugRedirectChangeItemCreatedEvent\getSlugRedirectChangeItem
‪getSlugRedirectChangeItem()
Definition: SlugRedirectChangeItemCreatedEvent.php:37
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\customPageTypeSourceCanBeAdded
‪customPageTypeSourceCanBeAdded()
Definition: AddPageTypeZeroSourceTest.php:129
‪TYPO3\CMS\Core\Routing\RouterInterface\ABSOLUTE_URL
‪const ABSOLUTE_URL
Definition: RouterInterface.php:32
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Redirects\Tests\Functional\EventListener\AddPageTypeZeroSourceTest\buildSite
‪buildSite(array $configuration)
Definition: AddPageTypeZeroSourceTest.php:251
‪TYPO3\CMS\Core\EventDispatcher\ListenerProvider
Definition: ListenerProvider.php:30