‪TYPO3CMS  11.5
AbstractRequestHandlingTest.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 Symfony\Component\Mailer\SentMessage;
26 use TYPO3\TestingFramework\Core\Functional\Framework\DataHandling\Scenario\DataHandlerFactory;
27 use TYPO3\TestingFramework\Core\Functional\Framework\DataHandling\Scenario\DataHandlerWriter;
28 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
29 
30 abstract class ‪AbstractRequestHandlingTest extends FunctionalTestCase
31 {
33 
34  protected const ‪ROOT_PAGE_BASE_URI = 'http://localhost';
35 
36  protected const ‪LANGUAGE_PRESETS = [
37  'EN' => ['id' => 0, 'title' => 'English', 'locale' => 'en_GB.UTF8', 'iso' => 'en', 'hrefLang' => 'en-GB', 'direction' => ''],
38  ];
39 
40  protected const ‪MAIL_SPOOL_FOLDER = 'typo3temp/var/transient/spool/';
41 
42  protected ‪$coreExtensionsToLoad = ['form', 'fluid_styled_content'];
43 
44  protected ‪$testExtensionsToLoad = [
45  'typo3/sysext/form/Tests/Functional/RequestHandling/Fixtures/Extensions/form_caching_tests',
46  ];
47 
49  'MAIL' => [
50  'defaultMailFromAddress' => 'hello@typo3.org',
51  'defaultMailFromName' => 'TYPO3',
52  'transport' => 'mbox',
53  'transport_spool_type' => 'file',
54  'transport_spool_filepath' => ‪self::MAIL_SPOOL_FOLDER,
55  ],
56  'SYS' => [
57  'caching' => [
58  'cacheConfigurations' => [
59  'hash' => [
60  'backend' => Typo3DatabaseBackend::class,
61  'frontend' => VariableFrontend::class,
62  ],
63  'pages' => [
64  'backend' => Typo3DatabaseBackend::class,
65  'frontend' => VariableFrontend::class,
66  ],
67  'pagesection' => [
68  'backend' => Typo3DatabaseBackend::class,
69  'frontend' => VariableFrontend::class,
70  ],
71  'rootline' => [
72  'backend' => Typo3DatabaseBackend::class,
73  'frontend' => VariableFrontend::class,
74  ],
75  ],
76  ],
77  'encryptionKey' => '4408d27a916d51e624b69af3554f516dbab61037a9f7b9fd6f81b4d3bedeccb6',
78  ],
79 
80  ];
81 
82  protected string ‪$databaseScenarioFile = '';
83 
84  protected function ‪setUp(): void
85  {
86  parent::setUp();
87 
89  'site1',
90  $this->‪buildSiteConfiguration(1000, static::ROOT_PAGE_BASE_URI . '/'),
91  [
92  $this->‪buildDefaultLanguageConfiguration('EN', '/'),
93  ]
94  );
95 
96  $this->withDatabaseSnapshot(function () {
97  $this->‪setUpDatabase();
98  });
99  }
100 
101  protected function ‪tearDown(): void
102  {
103  $this->purgeMailSpool();
104  parent::tearDown();
105  }
106 
107  private function ‪setUpDatabase(): void
108  {
109  $backendUser = $this->setUpBackendUserFromFixture(1);
111 
112  $factory = DataHandlerFactory::fromYamlFile($this->databaseScenarioFile);
113  $writer = DataHandlerWriter::withBackendUser($backendUser);
114  $writer->invokeFactory($factory);
115  static::failIfArrayIsNotEmpty(
116  $writer->getErrors()
117  );
118  }
119 
120  protected function ‪getMailSpoolMessages(): array
121  {
122  $messages = [];
123  foreach (array_filter(glob($this->instancePath . '/' . self::MAIL_SPOOL_FOLDER . '*'), 'is_file') as $path) {
124  $serializedMessage = file_get_contents($path);
125  $sentMessage = unserialize($serializedMessage);
126  if (!$sentMessage instanceof SentMessage) {
127  continue;
128  }
129  $fluidEmail = $sentMessage->getOriginalMessage();
130  if (!$fluidEmail instanceof ‪FluidEmail) {
131  continue;
132  }
133 
134  $parsedHeaders = $this->parseRawHeaders($sentMessage->toString());
135  $item = [
136  'plaintext' => $fluidEmail->getTextBody(),
137  'html' => $fluidEmail->getHtmlBody(),
138  'subject' => $fluidEmail->getSubject(),
139  'date' => $fluidEmail->getDate() ?? $parsedHeaders['Date'] ?? null,
140  'to' => $fluidEmail->getTo(),
141  ];
142  if (is_string($item['date'])) {
143  // @todo `@timezone` is not handled here - probably tests don't need date at all
144  $item['date'] = new \DateTimeImmutable($item['date']);
145  }
146  $messages[] = $item;
147  }
148 
149  return $messages;
150  }
151 
156  protected function parseRawHeaders(string $rawMessage): array
157  {
158  $rawParts = explode("\r\n\r\n", $rawMessage, 2);
159  $rawLines = explode("\r\n", $rawParts[0]);
160  $rawHeaders = array_map(
161  fn(string $rawLine) => array_map(
162  'trim',
163  explode(':', $rawLine, 2)
164  ),
165  $rawLines
166  );
167  return array_combine(
168  array_column($rawHeaders, 0),
169  array_column($rawHeaders, 1)
170  );
171  }
172 
173  protected function purgeMailSpool(): void
174  {
175  foreach (glob($this->instancePath . '/' . self::MAIL_SPOOL_FOLDER . '*') as $path) {
176  unlink($path);
177  }
178  }
179 }
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\setUp
‪setUp()
Definition: AbstractRequestHandlingTest.php:83
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling
Definition: AbstractRequestHandlingTest.php:18
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\getMailSpoolMessages
‪getMailSpoolMessages()
Definition: AbstractRequestHandlingTest.php:119
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\$databaseScenarioFile
‪string $databaseScenarioFile
Definition: AbstractRequestHandlingTest.php:81
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait
Definition: SiteBasedTestTrait.php:36
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\writeSiteConfiguration
‪writeSiteConfiguration(string $identifier, array $site=[], array $languages=[], array $errorHandling=[])
Definition: SiteBasedTestTrait.php:58
‪TYPO3\CMS\Core\Cache\Backend\Typo3DatabaseBackend
Definition: Typo3DatabaseBackend.php:30
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\ROOT_PAGE_BASE_URI
‪const ROOT_PAGE_BASE_URI
Definition: AbstractRequestHandlingTest.php:33
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\setUpDatabase
‪setUpDatabase()
Definition: AbstractRequestHandlingTest.php:106
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildDefaultLanguageConfiguration
‪array buildDefaultLanguageConfiguration(string $identifier, string $base)
Definition: SiteBasedTestTrait.php:126
‪TYPO3\CMS\Core\Core\Bootstrap\initializeLanguageObject
‪static initializeLanguageObject()
Definition: Bootstrap.php:598
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest
Definition: AbstractRequestHandlingTest.php:31
‪TYPO3\CMS\Core\Mail\FluidEmail
Definition: FluidEmail.php:35
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\LANGUAGE_PRESETS
‪const LANGUAGE_PRESETS
Definition: AbstractRequestHandlingTest.php:35
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\$coreExtensionsToLoad
‪$coreExtensionsToLoad
Definition: AbstractRequestHandlingTest.php:41
‪TYPO3\CMS\Core\Cache\Frontend\VariableFrontend
Definition: VariableFrontend.php:25
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\$configurationToUseInTestInstance
‪$configurationToUseInTestInstance
Definition: AbstractRequestHandlingTest.php:47
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\tearDown
‪tearDown()
Definition: AbstractRequestHandlingTest.php:100
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\$testExtensionsToLoad
‪$testExtensionsToLoad
Definition: AbstractRequestHandlingTest.php:43
‪TYPO3\CMS\Form\Tests\Functional\RequestHandling\AbstractRequestHandlingTest\MAIL_SPOOL_FOLDER
‪const MAIL_SPOOL_FOLDER
Definition: AbstractRequestHandlingTest.php:39
‪TYPO3\CMS\Core\Core\Bootstrap
Definition: Bootstrap.php:70
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildSiteConfiguration
‪array buildSiteConfiguration(int $rootPageId, string $base='')
Definition: SiteBasedTestTrait.php:111