2 declare(strict_types = 1);
27 use TYPO3\TestingFramework\Core\Functional\Framework\DataHandling\Scenario\DataHandlerFactory;
28 use TYPO3\TestingFramework\Core\Functional\Framework\DataHandling\Scenario\DataHandlerWriter;
29 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
34 'tableName' =>
'tt_content',
35 'routeFieldName' =>
'header',
38 'routeFieldPattern' =>
'^(?P<header>.+)-(?P<layout>\d+)$',
39 'routeFieldResult' =>
'{header}-{layout}',
44 'generatorOptions' => [
45 'prefixParentPageSlug' =>
false,
47 'fallbackCharacter' =>
'-',
48 'eval' =>
'required,uniqueInSite',
76 parent::setUpBeforeClass();
77 static::initializeDatabaseSnapshot();
82 static::destroyDatabaseSnapshot();
83 parent::tearDownAfterClass();
86 protected function setUp(): void
89 $this->withDatabaseSnapshot(
function () {
94 $tableName = self::ASPECT_CONFIGURATION[
'tableName'];
95 $fieldName = self::ASPECT_CONFIGURATION[
'routeFieldName'];
102 'locale' =>
'es_ES.UTF-8',
103 'fallbackType' =>
'fallback',
105 'title' =>
'Spanish',
110 'locale' =>
'fr_CA.UTF-8',
111 'fallbackType' =>
'fallback',
112 'fallbacks' => [1, 0],
113 'title' =>
'Franco-Canadian',
118 'locale' =>
'fr_FR.UTF-8',
119 'fallbackType' =>
'fallback',
125 'base' =>
'en_US.UTF-8',
126 'locale' =>
'/en-us/',
130 'acme' =>
new Site(
'acme-inc', 1000, [
131 'identifier' =>
'acme-inc',
132 'rootPageId' => 1000,
133 'base' =>
'https://acme.com/',
134 'languages' => $languages,
136 'other' =>
new Site(
'other-inc', 5000, [
137 'identifier' =>
'other-inc',
138 'rootPageId' => 5000,
139 'base' =>
'https://other.com/',
140 'languages' => $languages,
145 $this->subject =
new PersistedPatternMapper(self::ASPECT_CONFIGURATION);
146 $this->subject->setSiteLanguage($this->sites[
'acme']->getLanguageById(0));
147 $this->subject->setSite($this->sites[
'acme']);
152 $backendUser = $this->setUpBackendUserFromFixture(1);
155 $scenarioFile = __DIR__ .
'/Fixtures/AspectScenario.yaml';
156 $factory = DataHandlerFactory::fromYamlFile($scenarioFile);
157 $writer = DataHandlerWriter::withBackendUser($backendUser);
158 $writer->invokeFactory($factory);
159 if (!empty($writer->getErrors())) {
160 self::fail(var_export($writer->getErrors(),
true));
166 unset($this->subject, $this->sites);
173 'non-existing, default language' => [
'this-value-does-not-exist',
'default',
null],
175 '30xx-slug, default language' => [
'30xx-slug-0',
'default',
'3010'],
176 '30xx-slug, fr-fr language' => [
'30xx-slug-0',
'fr-fr',
'3010'],
177 '30xx-slug, fr-ca language' => [
'30xx-slug-0',
'fr-ca',
'3010'],
179 '30xx-slug-fr-ca, fr-ca language' => [
'30xx-slug-fr-ca-0',
'fr-ca',
'3010'],
181 '30xx-slug-fr-ca, fr-fr language' => [
'30xx-slug-fr-ca-0',
'fr-fr',
'3030'],
183 '30xx-slug-fr-ca, default language' => [
'30xx-slug-fr-ca-0',
'default',
'3030'],
185 '30xx-slug-fr, fr-ca language' => [
'30xx-slug-fr-0',
'fr-ca',
'3010'],
186 '30xx-slug-fr, fr-fr language' => [
'30xx-slug-fr-0',
'fr-fr',
'3010'],
188 '30xx-slug-fr, default language' => [
'30xx-slug-fr-0',
'default',
'3020'],
191 '40xx-slug, default language' => [
'40xx-slug-0',
'default',
'4040'],
192 '40xx-slug, fr-fr language' => [
'40xx-slug-0',
'fr-fr',
'4040'],
193 '40xx-slug, fr-ca language' => [
'40xx-slug-0',
'fr-ca',
'4040'],
195 '40xx-slug-fr-ca, fr-ca language' => [
'40xx-slug-fr-ca-0',
'fr-ca',
'4040'],
197 '40xx-slug-fr-ca, fr-fr language' => [
'40xx-slug-fr-ca-0',
'fr-fr',
'4030'],
199 '40xx-slug-fr-ca, default language' => [
'40xx-slug-fr-ca-0',
'default',
'4030'],
201 '40xx-slug-fr, fr-ca language' => [
'40xx-slug-fr-0',
'fr-ca',
'4040'],
202 '40xx-slug-fr, fr-fr language' => [
'40xx-slug-fr-0',
'fr-fr',
'4040'],
204 '40xx-slug-fr, default language' => [
'40xx-slug-fr-0',
'default',
'4020'],
209 foreach ([
'acme',
'other'] as $site) {
210 foreach ($baseDataSet as $key => $arguments) {
211 array_unshift($arguments, $site);
212 $dataSet[$site .
':' . $key] = $arguments;
229 $this->subject->setSiteLanguage(
230 $this->sites[$identifier]->getLanguageById(self::LANGUAGE_MAP[$language])
232 $this->subject->setSite(
233 $this->sites[$identifier]
235 if ($expectation !==
null) {
236 $expectation += self::SITE_ADDITION[$identifier];
237 $expectation = (string)$expectation;
239 self::assertSame($expectation, $this->subject->resolve($requestValue));
246 $visibleContext->setAspect(
250 $frontendGroupsContext =
new Context();
251 $frontendGroupsContext->setAspect(
256 $scheduledContext->setAspect(
262 'hidden-visibility-slug, raw context' => [
264 [
'slug' =>
'hidden-visibility-slug-0',
'uid' =>
'4051'],
268 'restricted-visibility-slug, raw context' => [
270 [
'slug' =>
'restricted-visibility-slug-0',
'uid' =>
'4052'],
273 'scheduled-visibility-slug, raw context' => [
275 [
'slug' =>
'scheduled-visibility-slug-0',
'uid' =>
'4053'],
278 'hidden-visibility-slug, visibility context (include hidden content)' => [
280 [
'slug' =>
'hidden-visibility-slug-0',
'uid' =>
'4051'],
284 'restricted-visibility-slug, frontend-groups context (13)' => [
285 $frontendGroupsContext,
286 [
'slug' =>
'restricted-visibility-slug-0',
'uid' =>
'4052'],
289 'scheduled-visibility-slug, scheduled context (timestamp 20000)' => [
291 [
'slug' =>
'scheduled-visibility-slug-0',
'uid' =>
'4053'],
307 $this->subject->setContext($context);
308 $expectedResult = $expectation ? $parameters[
'uid'] :
null;
309 self::assertSame($expectedResult, $this->subject->resolve($parameters[
'slug']));
322 $this->subject->setContext($context);
323 $expectedResult = $expectation ? $parameters[
'slug'] :
null;
324 self::assertSame($expectedResult, $this->subject->generate($parameters[
'uid']));
331 $path = $this->instancePath .
'/typo3conf/sites';
332 GeneralUtility::rmdir($path .
'/' . $site->
getIdentifier(),
true);
335 self::markTestSkipped($exception->getMessage());