‪TYPO3CMS  ‪main
WorkspaceTest.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\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
33 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
36 
37 final class ‪WorkspaceTest extends FunctionalTestCase
38 {
39  protected array ‪$testExtensionsToLoad = [
40  'typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example',
41  ];
42 
43  protected array ‪$coreExtensionsToLoad = ['workspaces'];
44 
46 
47  protected function ‪setUp(): void
48  {
49  parent::setUp();
50  $this->importCSVDataSet(__DIR__ . '/Fixtures/WorkspaceTestImport.csv');
51  }
52 
56  private function ‪setupSubjectInFrontend(int $workspaceId = 1): void
57  {
58  $context = new ‪Context();
59  $context->setAspect('workspace', new ‪WorkspaceAspect($workspaceId));
60  GeneralUtility::setSingletonInstance(Context::class, $context);
61  $frontendTypoScript = new ‪FrontendTypoScript(new ‪RootNode(), [], [], []);
62  $frontendTypoScript->setSetupArray([]);
63  ‪$GLOBALS['TYPO3_REQUEST'] = (new ‪ServerRequest())
64  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE)
65  ->withAttribute('frontend.typoscript', $frontendTypoScript);
66  $this->blogRepository = $this->get(BlogRepository::class);
67  // ConfigurationManager is used by PersistenceManager to retrieve configuration.
68  // We set a proper extensionName and pluginName for the ConfigurationManager singleton
69  // here, to not run into warnings due to incomplete test setup.
70  $configurationManager = $this->get(ConfigurationManager::class);
71  $configurationManager->setConfiguration([
72  'extensionName' => 'blog_example',
73  'pluginName' => 'test',
74  ]);
75  }
76 
80  private function ‪setupSubjectInBackend(int $workspaceId = 1): void
81  {
82  $backendUser = new ‪BackendUserAuthentication();
83  $backendUser->workspace = $workspaceId;
84  ‪$GLOBALS['BE_USER'] = $backendUser;
85  $context = new ‪Context();
86  $context->setAspect('backend.user', new ‪UserAspect($backendUser));
87  $context->setAspect('workspace', new ‪WorkspaceAspect($workspaceId));
88  GeneralUtility::setSingletonInstance(Context::class, $context);
89  $frontendTypoScript = new ‪FrontendTypoScript(new ‪RootNode(), [], [], []);
90  $frontendTypoScript->setSetupArray([]);
91  ‪$GLOBALS['TYPO3_REQUEST'] = (new ‪ServerRequest())
92  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE)
93  ->withAttribute('frontend.typoscript', $frontendTypoScript);
94  $this->blogRepository = $this->get(BlogRepository::class);
95  // ConfigurationManager is used by PersistenceManager to retrieve configuration.
96  // We set a proper extensionName and pluginName for the ConfigurationManager singleton
97  // here, to not run into warnings due to incomplete test setup.
98  $configurationManager = $this->get(ConfigurationManager::class);
99  $configurationManager->setConfiguration([
100  'extensionName' => 'blog_example',
101  'pluginName' => 'test',
102  ]);
103  }
104 
105  public static function ‪contextDataProvider(): array
106  {
107  return [
108  'test frontend context' => [
109  'context' => 'FE',
110  ],
111  'test backend context' => [
112  'context' => 'BE',
113  ],
114  ];
115  }
116 
117  #[DataProvider('contextDataProvider')]
118  #[Test]
119  public function ‪countReturnsCorrectNumberOfBlogs(string $context): void
120  {
121  if ($context === 'FE') {
122  $this->‪setupSubjectInFrontend();
123  } else {
124  $this->‪setupSubjectInBackend();
125  }
126 
127  $query = $this->blogRepository->createQuery();
128  $querySettings = $query->getQuerySettings();
129  $querySettings->setRespectStoragePage(false);
130  // In workspace all records need to be fetched, thus enableFields is ignored
131  // This means we select even hidden (but not deleted) records for count()
132  self::assertSame(6, $query->execute()->count());
133  }
134 
135  #[DataProvider('contextDataProvider')]
136  #[Test]
137  public function ‪fetchingHiddenBlogInWorkspace(string $context): void
138  {
139  // Set up Context for Workspace=1
140  if ($context === 'FE') {
141  $this->‪setupSubjectInFrontend();
142  } else {
143  $this->‪setupSubjectInBackend();
144  }
145 
146  $query = $this->blogRepository->createQuery();
147  $querySettings = $query->getQuerySettings();
148  $querySettings->setStoragePageIds([0]);
149  $query->matching(
150  $query->logicalOr(
151  $query->like('title', '%Blog2%'),
152  $query->like('title', '%Blog4%'),
153  $query->like('title', '%Blog6%')
154  )
155  );
156  $query->setOrderings(['title' => ‪QueryInterface::ORDER_ASCENDING]);
157 
158  // Respect hidden flags, only show the item that was hidden in live, but is now visible in workspace
159  $querySettings->setIgnoreEnableFields(false);
160  $items = $query->execute();
161  $foundItems = [];
162  foreach ($items as $item) {
163  $foundItems[] = $item->getTitle();
164  }
165  self::assertEquals(['WorkspaceOverlay Blog6Enabled'], $foundItems);
166 
167  // Allow hidden records to show up (resulting in 3 blog items)
168  $querySettings->setIgnoreEnableFields(true);
169  $items = $query->execute();
170  $foundItems = [];
171  foreach ($items as $item) {
172  $foundItems[] = $item->getTitle();
173  }
174  self::assertEquals([
175  'WorkspaceOverlay Blog2HiddenInWorkspace',
176  'WorkspaceOverlay Blog4HiddenInLiveAndWorkspace',
177  'WorkspaceOverlay Blog6Enabled',
178  ], $foundItems);
179  }
180 
181  #[DataProvider('contextDataProvider')]
182  #[Test]
183  public function ‪fetchingAllBlogsReturnsCorrectNumberOfBlogs(string $context): void
184  {
185  if ($context === 'FE') {
186  $this->‪setupSubjectInFrontend();
187  } else {
188  $this->‪setupSubjectInBackend();
189  }
190 
191  $query = $this->blogRepository->createQuery();
192  $querySettings = $query->getQuerySettings();
193  $querySettings->setRespectStoragePage(false);
194  $query->setOrderings(['uid' => ‪QueryInterface::ORDER_ASCENDING]);
195  $blogs = $query->execute()->toArray();
196  self::assertCount(4, $blogs);
197  // Check first blog was overlaid with workspace preview
198  $firstBlog = array_shift($blogs);
199  self::assertSame(1, $firstBlog->getUid());
200  self::assertSame('WorkspaceOverlay Blog1', $firstBlog->getTitle());
201  // Check second-last blog was enabled in workspace preview
202  array_pop($blogs);
203  $lastBlog = array_pop($blogs);
204  self::assertSame(6, $lastBlog->getUid());
205  self::assertSame('WorkspaceOverlay Blog6Enabled', $lastBlog->getTitle());
206  }
207 
208  #[DataProvider('contextDataProvider')]
209  #[Test]
210  public function ‪fetchingBlogReturnsOverlaidWorkspaceVersionForRelations(string $context): void
211  {
212  if ($context === 'FE') {
213  $this->‪setupSubjectInFrontend();
214  } else {
215  $this->‪setupSubjectInBackend();
216  }
217 
218  $query = $this->blogRepository->createQuery();
219  $querySettings = $query->getQuerySettings();
220  $querySettings->setStoragePageIds([0]);
221  $query->matching($query->equals('uid', 1));
222  $blog = $query->execute()->getFirst();
223  $posts = $blog->getPosts()->toArray();
224  self::assertSame('WorkspaceOverlay Blog1', $blog->getTitle());
225  self::assertCount(10, (array)$posts);
226  self::assertSame('WorkspaceOverlay Post1', $posts[0]->getTitle());
227  self::assertSame('WorkspaceOverlay Post2', $posts[1]->getTitle());
228  self::assertSame('WorkspaceOverlay Post3', $posts[2]->getTitle());
229  }
230 
231  #[Test]
233  {
234  // Simulate LIVE workspace -> 3 relations
235  $this->‪setupSubjectInFrontend(0);
236  $query = $this->blogRepository->createQuery();
237  $querySettings = $query->getQuerySettings();
238  $querySettings->setRespectStoragePage(false);
239  $query->matching($query->equals('uid', 1));
241  $blog = $query->execute()->getFirst();
242  self::assertEquals('Blog1', $blog->getTitle());
243  self::assertCount(3, $blog->getCategories());
244  }
245 
246  #[Test]
248  {
249  $this->‪setupSubjectInFrontend();
250  $query = $this->blogRepository->createQuery();
251  $querySettings = $query->getQuerySettings();
252  $querySettings->setRespectStoragePage(false);
253  $query->matching($query->equals('uid', 1));
255  $blog = $query->execute()->getFirst();
256  self::assertEquals('WorkspaceOverlay Blog1', $blog->getTitle());
257  self::assertCount(2, $blog->getCategories());
258  }
259 }
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\$blogRepository
‪BlogRepository $blogRepository
Definition: WorkspaceTest.php:45
‪TYPO3\CMS\Core\Context\WorkspaceAspect
Definition: WorkspaceAspect.php:31
‪TYPO3\CMS\Extbase\Persistence\QueryInterface
Definition: QueryInterface.php:30
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\$testExtensionsToLoad
‪array $testExtensionsToLoad
Definition: WorkspaceTest.php:39
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\$coreExtensionsToLoad
‪array $coreExtensionsToLoad
Definition: WorkspaceTest.php:43
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest
Definition: WorkspaceTest.php:38
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\countReturnsCorrectNumberOfBlogs
‪countReturnsCorrectNumberOfBlogs(string $context)
Definition: WorkspaceTest.php:119
‪TYPO3\CMS\Extbase\Configuration\ConfigurationManager
Definition: ConfigurationManager.php:32
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\ORDER_ASCENDING
‪const ORDER_ASCENDING
Definition: QueryInterface.php:99
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsOverlaidWorkspaceVersionForManyToManyRelations
‪fetchingBlogReturnsOverlaidWorkspaceVersionForManyToManyRelations()
Definition: WorkspaceTest.php:247
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingHiddenBlogInWorkspace
‪fetchingHiddenBlogInWorkspace(string $context)
Definition: WorkspaceTest.php:137
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsOverlaidWorkspaceVersionForRelations
‪fetchingBlogReturnsOverlaidWorkspaceVersionForRelations(string $context)
Definition: WorkspaceTest.php:210
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setupSubjectInBackend
‪setupSubjectInBackend(int $workspaceId=1)
Definition: WorkspaceTest.php:80
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence
Definition: AddTest.php:18
‪TYPO3Tests\BlogExample\Domain\Model\Blog
Definition: Blog.php:30
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsManyToManyRelationsInLiveWorkspace
‪fetchingBlogReturnsManyToManyRelationsInLiveWorkspace()
Definition: WorkspaceTest.php:232
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\TypoScript\AST\Node\RootNode
Definition: RootNode.php:26
‪TYPO3Tests\BlogExample\Domain\Repository\BlogRepository
Definition: BlogRepository.php:29
‪TYPO3\CMS\Core\TypoScript\FrontendTypoScript
Definition: FrontendTypoScript.php:30
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingAllBlogsReturnsCorrectNumberOfBlogs
‪fetchingAllBlogsReturnsCorrectNumberOfBlogs(string $context)
Definition: WorkspaceTest.php:183
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\contextDataProvider
‪static contextDataProvider()
Definition: WorkspaceTest.php:105
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder\REQUESTTYPE_FE
‪const REQUESTTYPE_FE
Definition: SystemEnvironmentBuilder.php:43
‪TYPO3\CMS\Core\Context\UserAspect
Definition: UserAspect.php:37
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setupSubjectInFrontend
‪setupSubjectInFrontend(int $workspaceId=1)
Definition: WorkspaceTest.php:56
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setUp
‪setUp()
Definition: WorkspaceTest.php:47