‪TYPO3CMS  11.5
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 
31 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
32 
33 class ‪WorkspaceTest extends FunctionalTestCase
34 {
36  'typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example',
37  ];
38 
39  protected ‪$coreExtensionsToLoad = ['workspaces'];
40 
44  protected ‪$blogRepository;
45 
49  protected function ‪setUp(): void
50  {
51  parent::setUp();
52  $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml');
53  $this->importCsvDataSet(__DIR__ . '/../Persistence/Fixtures/blogs.csv');
54  $this->importCsvDataSet(__DIR__ . '/../Persistence/Fixtures/posts.csv');
55  $this->importCsvDataSet(__DIR__ . '/../Persistence/Fixtures/categories.csv');
56  $this->importCsvDataSet(__DIR__ . '/../Persistence/Fixtures/category-mm.csv');
57  }
58 
59  public function ‪contextDataProvider(): array
60  {
61  return [
62  'test frontend context' => [
63  'context' => 'FE',
64  ],
65  'test backend context' => [
66  'context' => 'BE',
67  ],
68  ];
69  }
70 
76  public function ‪countReturnsCorrectNumberOfBlogs(string $context): void
77  {
78  if ($context === 'FE') {
80  } else {
81  $this->‪setupSubjectInBackend();
82  }
83 
84  $query = $this->blogRepository->createQuery();
85 
86  $querySettings = $query->getQuerySettings();
87  $querySettings->setRespectStoragePage(false);
88 
89  // In workspace all records need to be fetched, thus enableFields is ignored
90  // This means we select even hidden (but not deleted) records for count()
91  self::assertSame(6, $query->execute()->count());
92  }
93 
99  public function ‪fetchingHiddenBlogInWorkspace(string $context): void
100  {
101  // Set up Context for Workspace=1
102  if ($context === 'FE') {
103  $this->‪setupSubjectInFrontend();
104  } else {
105  $this->‪setupSubjectInBackend();
106  }
107 
108  $query = $this->blogRepository->createQuery();
109 
110  $querySettings = $query->getQuerySettings();
111  $querySettings->setStoragePageIds([0]);
112  $query->matching(
113  $query->logicalOr(
114  $query->like('title', '%Blog2%'),
115  $query->like('title', '%Blog4%'),
116  $query->like('title', '%Blog6%')
117  )
118  );
119  $query->setOrderings(['title' => ‪QueryInterface::ORDER_ASCENDING]);
120 
121  // Respect hidden flags, only show the item that was hidden in live, but is now visible in workspace
122  $querySettings->setIgnoreEnableFields(false);
123  $items = $query->execute();
124  $foundItems = [];
125  foreach ($items as $item) {
126  $foundItems[] = $item->getTitle();
127  }
128  self::assertEquals(['WorkspaceOverlay Blog6Enabled'], $foundItems);
129 
130  // Allow hidden records to show up (resulting in 3 blog items)
131  $querySettings->setIgnoreEnableFields(true);
132  $items = $query->execute();
133  $foundItems = [];
134  foreach ($items as $item) {
135  $foundItems[] = $item->getTitle();
136  }
137  self::assertEquals([
138  'WorkspaceOverlay Blog2HiddenInWorkspace',
139  'WorkspaceOverlay Blog4HiddenInLiveAndWorkspace',
140  'WorkspaceOverlay Blog6Enabled',
141  ], $foundItems);
142  }
143 
149  public function ‪fetchingAllBlogsReturnsCorrectNumberOfBlogs(string $context): void
150  {
151  if ($context === 'FE') {
152  $this->‪setupSubjectInFrontend();
153  } else {
154  $this->‪setupSubjectInBackend();
155  }
156 
157  $query = $this->blogRepository->createQuery();
158 
159  $querySettings = $query->getQuerySettings();
160  $querySettings->setRespectStoragePage(false);
161 
162  $query->setOrderings(['uid' => ‪QueryInterface::ORDER_ASCENDING]);
163 
164  $blogs = $query->execute()->toArray();
165 
166  self::assertCount(4, $blogs);
167 
168  // Check first blog was overlaid with workspace preview
169  $firstBlog = array_shift($blogs);
170  self::assertSame(1, $firstBlog->getUid());
171  self::assertSame('WorkspaceOverlay Blog1', $firstBlog->getTitle());
172 
173  // Check second-last blog was enabled in workspace preview
174  array_pop($blogs);
175  $lastBlog = array_pop($blogs);
176  self::assertSame(6, $lastBlog->getUid());
177  self::assertSame('WorkspaceOverlay Blog6Enabled', $lastBlog->getTitle());
178  }
179 
185  public function ‪fetchingBlogReturnsOverlaidWorkspaceVersionForRelations(string $context): void
186  {
187  if ($context === 'FE') {
188  $this->‪setupSubjectInFrontend();
189  } else {
190  $this->‪setupSubjectInBackend();
191  }
192 
193  $query = $this->blogRepository->createQuery();
194 
195  $querySettings = $query->getQuerySettings();
196  $querySettings->setStoragePageIds([0]);
197 
198  $query->matching($query->equals('uid', 1));
199 
200  $blog = $query->execute()->getFirst();
201  $posts = $blog->getPosts()->toArray();
202 
203  self::assertSame('WorkspaceOverlay Blog1', $blog->getTitle());
204  self::assertCount(10, (array)$posts);
205  self::assertSame('WorkspaceOverlay Post1', $posts[0]->getTitle());
206  self::assertSame('WorkspaceOverlay Post2', $posts[1]->getTitle());
207  self::assertSame('WorkspaceOverlay Post3', $posts[2]->getTitle());
208  }
209 
214  {
215  // Simulate LIVE workspace -> 3 relations
216  $this->‪setupSubjectInFrontend(0);
217  $query = $this->blogRepository->createQuery();
218  $querySettings = $query->getQuerySettings();
219  $querySettings->setRespectStoragePage(false);
220  $query->matching($query->equals('uid', 1));
221 
223  $blog = $query->execute()->getFirst();
224  self::assertEquals('Blog1', $blog->getTitle());
225  self::assertCount(3, $blog->getCategories());
226  }
227 
232  {
233  $this->‪setupSubjectInFrontend(1);
234  $query = $this->blogRepository->createQuery();
235  $querySettings = $query->getQuerySettings();
236  $querySettings->setRespectStoragePage(false);
237  $query->matching($query->equals('uid', 1));
238 
240  $blog = $query->execute()->getFirst();
241  self::assertEquals('WorkspaceOverlay Blog1', $blog->getTitle());
242  self::assertCount(2, $blog->getCategories());
243  }
244 
248  protected function ‪setupSubjectInFrontend(int $workspaceId = 1): void
249  {
250  $context = new Context(
251  [
252  'workspace' => new WorkspaceAspect($workspaceId),
253  ]
254  );
255  GeneralUtility::setSingletonInstance(Context::class, $context);
256  ‪$GLOBALS['TYPO3_REQUEST'] = (new ServerRequest())
257  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE);
258  $this->blogRepository = $this->get(BlogRepository::class);
259  // ConfigurationManager is used by PersistenceManager to retrieve configuration.
260  // We set a proper extensionName and pluginName for the ConfigurationManager singleton
261  // here, to not run into warnings due to incomplete test setup.
262  $configurationManager = $this->get(ConfigurationManager::class);
263  $configurationManager->setConfiguration([
264  'extensionName' => 'blog_example',
265  'pluginName' => 'test',
266  ]);
267  }
268 
272  protected function ‪setupSubjectInBackend(int $workspaceId = 1): void
273  {
274  $backendUser = new BackendUserAuthentication();
275  $backendUser->workspace = $workspaceId;
276  ‪$GLOBALS['BE_USER'] = $backendUser;
277  $context = new Context(
278  [
279  'backend.user' => new UserAspect($backendUser),
280  'workspace' => new WorkspaceAspect($workspaceId),
281  ]
282  );
283  GeneralUtility::setSingletonInstance(Context::class, $context);
284  ‪$GLOBALS['TYPO3_REQUEST'] = (new ServerRequest())
285  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE);
286  $this->blogRepository = $this->get(BlogRepository::class);
287  // ConfigurationManager is used by PersistenceManager to retrieve configuration.
288  // We set a proper extensionName and pluginName for the ConfigurationManager singleton
289  // here, to not run into warnings due to incomplete test setup.
290  $configurationManager = $this->get(ConfigurationManager::class);
291  $configurationManager->setConfiguration([
292  'extensionName' => 'blog_example',
293  'pluginName' => 'test',
294  ]);
295  }
296 }
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\$blogRepository
‪BlogRepository $blogRepository
Definition: WorkspaceTest.php:43
‪ExtbaseTeam\BlogExample\Domain\Repository\BlogRepository
Definition: BlogRepository.php:27
‪TYPO3\CMS\Core\Context\WorkspaceAspect
Definition: WorkspaceAspect.php:31
‪TYPO3\CMS\Extbase\Persistence\QueryInterface
Definition: QueryInterface.php:29
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest
Definition: WorkspaceTest.php:34
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\countReturnsCorrectNumberOfBlogs
‪countReturnsCorrectNumberOfBlogs(string $context)
Definition: WorkspaceTest.php:75
‪TYPO3\CMS\Extbase\Configuration\ConfigurationManager
Definition: ConfigurationManager.php:33
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\ORDER_ASCENDING
‪const ORDER_ASCENDING
Definition: QueryInterface.php:98
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsOverlaidWorkspaceVersionForManyToManyRelations
‪fetchingBlogReturnsOverlaidWorkspaceVersionForManyToManyRelations()
Definition: WorkspaceTest.php:230
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingHiddenBlogInWorkspace
‪fetchingHiddenBlogInWorkspace(string $context)
Definition: WorkspaceTest.php:98
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsOverlaidWorkspaceVersionForRelations
‪fetchingBlogReturnsOverlaidWorkspaceVersionForRelations(string $context)
Definition: WorkspaceTest.php:184
‪ExtbaseTeam\BlogExample\Domain\Model\Blog
Definition: Blog.php:29
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setupSubjectInBackend
‪setupSubjectInBackend(int $workspaceId=1)
Definition: WorkspaceTest.php:271
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:37
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence
Definition: AddTest.php:18
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\contextDataProvider
‪contextDataProvider()
Definition: WorkspaceTest.php:58
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\$coreExtensionsToLoad
‪$coreExtensionsToLoad
Definition: WorkspaceTest.php:39
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingBlogReturnsManyToManyRelationsInLiveWorkspace
‪fetchingBlogReturnsManyToManyRelationsInLiveWorkspace()
Definition: WorkspaceTest.php:212
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\fetchingAllBlogsReturnsCorrectNumberOfBlogs
‪fetchingAllBlogsReturnsCorrectNumberOfBlogs(string $context)
Definition: WorkspaceTest.php:148
‪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\$testExtensionsToLoad
‪$testExtensionsToLoad
Definition: WorkspaceTest.php:35
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setupSubjectInFrontend
‪setupSubjectInFrontend(int $workspaceId=1)
Definition: WorkspaceTest.php:247
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\WorkspaceTest\setUp
‪setUp()
Definition: WorkspaceTest.php:48