diff --git a/typo3/sysext/core/Tests/Functional/Utility/Fixtures/RootlineUtilityImport.csv b/typo3/sysext/core/Tests/Functional/Utility/Fixtures/RootlineUtilityImport.csv index 40c388c886f9fd6009d5f4a4a10c99f67e741bb6..0cc2aef66dbedaceadfb823d24619eb17ae3d561 100644 --- a/typo3/sysext/core/Tests/Functional/Utility/Fixtures/RootlineUtilityImport.csv +++ b/typo3/sysext/core/Tests/Functional/Utility/Fixtures/RootlineUtilityImport.csv @@ -1,26 +1,86 @@ "sys_workspace" ,"uid","pid","deleted","title" -,1,0,0,"My Personal Workspace" -,2,0,0,"Another Workspace" +,1,0,0,"ws1" +,2,0,0,"ws2" +"sys_file" +,"uid","pid","type","storage","identifier","extension","mime_type","name","sha1","size","creation_date","modification_date","missing","metadata","identifier_hash","folder_hash","last_indexed" +,1,0,2,1,"/user_upload/image1.jpg","jpg","image/jpeg","image1.jpg","ae6951147687ed1f94f60973fca7ef46e2ba2372",166843,1375080761,1374139442,0,0,"16ba2a587da8ef10dfccbe8b9841bde85afbd2d4","19669f1e02c2f16705ec7587044c66443be70725",0 +,2,0,2,1,"/user_upload/image2.jpg","jpg","image/jpeg","image2.jpg","ae6951147687ed1f94f60973fca7ef46e2ba2372",166843,1375080761,1374139442,0,0,"16ba2a587da8ef10dfccbe8b9841bde85afbd2d4","19669f1e02c2f16705ec7587044c66443be70725",0 +,3,0,2,1,"/user_upload/image3.jpg","png","image/jpeg","image3.jpg","ae6951147687ed1f94f60973fca7ef46e2ba2372",166843,1375080761,1374139442,0,0,"16ba2a587da8ef10dfccbe8b9841bde85afbd2d4","19669f1e02c2f16705ec7587044c66443be70725",0 +,4,0,2,1,"/user_upload/image4.jpg","png","image/jpeg","image4.jpg","ae6951147687ed1f94f60973fca7ef46e2ba2372",166843,1375080761,1374139442,0,0,"16ba2a587da8ef10dfccbe8b9841bde85afbd2d4","19669f1e02c2f16705ec7587044c66443be70725",0 +,5,0,2,1,"/user_upload/image5.jpg","png","image/jpeg","image5.jpg","ae6951147687ed1f94f60973fca7ef46e2ba2372",166843,1375080761,1374139442,0,0,"16ba2a587da8ef10dfccbe8b9841bde85afbd2d4","19669f1e02c2f16705ec7587044c66443be70725",0 "pages" ,"uid","pid","deleted","sys_language_uid","l10n_parent","t3ver_wsid","t3ver_oid","t3ver_state","media","mount_pid","mount_pid_ol","fe_group","slug","title" -,1000,0,0,0,0,0,0,0,0,0,0,0,"/","ACME Global" -,1100,1000,0,0,0,0,0,0,0,0,0,0,"/welcome","EN: Welcome" -,1101,1000,0,1,1100,0,0,0,0,0,0,0,"/bienvenue","FR: Welcome" -,1102,1000,0,2,1100,0,0,0,0,0,0,0,"/bienvenue-ca","FR-CA: Welcome" -,1200,1000,0,0,0,0,0,0,0,0,0,0,"/features","EN: Features" -,1300,1000,0,0,0,0,0,0,0,0,0,0,"/products","EN: Products" -,1310,1300,0,0,0,0,0,0,0,0,0,0,"/products/toys","EN: Toys" -,1320,1300,0,0,0,0,0,0,0,0,0,0,"/products/card-games","EN: Card Games" -,1330,1300,0,0,0,0,0,0,0,0,0,0,"/products/board-games","EN: Board Games" -,1331,1330,0,0,0,0,0,0,0,0,0,0,"/products/monopoly","EN: Monopoly" -,1332,1330,0,0,0,0,0,0,0,0,0,0,"/products/board-games/catan","EN: Catan" -,1333,1330,0,0,0,0,0,0,0,0,0,0,"/risk","EN: Risk" -,1400,1000,0,0,0,1,0,1,0,0,0,0,"/a-new-page","EN: A new page in workspace" -,10000,0,0,0,0,1,1000,0,0,0,0,,"/","ACME Global modified in Workspace 1" -,10001,1320,0,0,0,1,1333,4,0,0,0,,"/risk","EN: Risk" -,10002,1000,0,0,0,2,1300,2,0,0,0,,"/products","EN: Products" +,1,0,0,0,0,0,0,0,0,0,0,0,"/","EN Root" +,1000,1,0,0,0,0,0,0,0,0,0,0,"/parent1","EN Parent 1" +,1001,1000,0,0,0,0,0,0,0,0,0,0,"/parent1/sub1","EN Parent 1 Sub 1" +,1002,1000,0,1,1001,0,0,0,0,0,0,0,"/parent1/fr-sub1","FR Parent 1 Sub 1" +,1003,1000,0,0,0,0,0,0,0,0,0,0,"/parent1/sub2","EN Parent 1 Sub 2" +,1004,1,0,0,0,1,1000,2,0,0,0,0,"/parent1","EN WS1-deleted Parent 1" +,1010,1,0,0,0,0,0,0,0,0,0,0,"/parent2","EN Parent 2" +,1011,1010,0,0,0,2,0,1,0,0,0,0,"/parent2/sub1","EN WS2-new Parent 2 Sub 1" +,1020,1,0,0,0,0,0,0,0,0,0,0,"/move-in-ws","EN To Move in WS" +,1021,1,0,0,0,0,0,0,0,0,0,0,"/move-target","EN Move target" +,1022,1021,0,0,0,2,1020,4,0,0,0,0,"/move-in-ws","EN WS2-moved Move in WS" +,1030,1,0,0,0,0,0,0,0,0,0,0,"/parent3","EN Parent 3" +,1031,1030,0,0,0,0,0,0,0,0,0,0,"/parent3/sub1","EN Parent 3 Sub 1" +,1032,1030,0,1,1031,0,0,0,0,0,0,0,"/parent3/fr-sub1","FR Parent 3 Sub 1" +,1040,1,0,0,0,0,0,0,0,0,0,0,"/parent4","EN Parent 4" +,1041,1040,0,0,0,2,0,1,0,0,0,0,"/parent2/sub1-with-media","EN WS2-new Parent 4 Sub 1 with media" +,1050,1,0,0,0,0,0,0,0,0,0,0,"/parent5","EN Parent 5" +,1051,1050,0,0,0,0,0,0,0,0,0,0,"/parent5/sub1","EN Parent 5 Sub 1 with media" +,1052,1050,0,0,0,2,1051,0,0,0,0,0,"/parent5/sub1","EN WS2-changed Parent 5 Sub 1 with media deleted" +"sys_file_reference" +,"uid","pid","deleted","hidden","sys_language_uid","l10n_parent","t3ver_wsid","t3ver_oid","t3ver_state","t3ver_stage","uid_local","uid_foreign","tablenames","fieldname","sorting_foreign","title" +,1000,1031,0,0,0,0,0,0,0,0,1,1031,"pages","media",2,"image1" +,1001,1031,0,0,0,0,0,0,0,0,5,1031,"pages","media",1,"image5" +,1002,1031,0,1,0,0,0,0,0,0,3,1031,"pages","media",3,"image3 hidden ref" +,1003,1031,1,0,0,0,0,0,0,0,4,1031,"pages","media",4,"image4 deleted ref" +,1010,1031,0,0,1,1,0,0,0,0,1,1032,"pages","media",1,"image1" +,1011,1031,0,0,1,2,0,0,0,0,2,1032,"pages","media",2,"image2" +,1012,1031,0,1,0,0,0,0,0,0,3,1032,"pages","media",3,"image3 hidden ref" +,1013,1031,1,0,0,0,0,0,0,0,4,1032,"pages","media",4,"image4 deleted ref" +,1100,1041,0,0,0,0,2,0,1,0,1,1041,"pages","media",2,"image1" +,1101,1041,0,0,0,0,2,0,1,0,5,1041,"pages","media",1,"image5" +,1102,1041,0,1,0,0,2,0,1,0,3,1041,"pages","media",3,"image3 hidden ref" +,1200,1051,0,0,0,0,0,0,0,0,1,1051,"pages","media",2,"image1" +,1201,1051,0,0,0,0,0,0,0,0,5,1051,"pages","media",1,"image5" +,1202,1051,0,0,0,0,2,1200,0,0,1,1051,"pages","media",2,"image1" +,1203,1051,0,0,0,0,2,1201,2,0,5,1051,"pages","media",1,"image5" "sys_refindex" ,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string" -,"d82e8687cecaf87aef30a619370d74c9","pages",1101,"l10n_parent",,,,0,0,"pages",1100, -,"83405f026c17228bef16c5eb0e4349c6","pages",1102,"l10n_parent",,,,0,0,"pages",1100, +,"9e8c5119deb1a180566b9782f267ddc1","pages",1002,"l10n_parent",,,,0,0,"pages",1001, +,"ce974e1f306f053ec683e473d26ef862","pages",1031,"media",,,,0,0,"sys_file_reference",1001, +,"94fb4a218422535e75ee4b70c6782608","pages",1031,"media",,,,1,0,"sys_file_reference",1000, +,"ad4f345678532221cff034ffaaa90848","pages",1031,"media",,,,2,0,"sys_file_reference",1002, +,"a4af7b5b6209bce7b57a1d20e79b3b3f","pages",1032,"l10n_parent",,,,0,0,"pages",1031, +,"382f7da8a24d09e96f011baaa2fe298d","pages",1032,"media",,,,0,0,"sys_file_reference",1010, +,"c2f7b0da34020c9cfa18645950b623ca","pages",1032,"media",,,,1,0,"sys_file_reference",1011, +,"2b367281adfc037649d70399ce414c15","pages",1032,"media",,,,2,0,"sys_file_reference",1012, +,"f41641a1a6e0dda41f47526445ebc8ac","pages",1041,"media",,,,0,2,"sys_file_reference",1101, +,"a59b297ece542623f2d1c4fbc5f56c74","pages",1041,"media",,,,1,2,"sys_file_reference",1100, +,"2ed09fceb6a99bd94fe8994728f6d3c5","pages",1041,"media",,,,2,2,"sys_file_reference",1102, +,"6fba83e33f30d9ef14d5dfcd5d63fe5c","pages",1051,"media",,,,0,0,"sys_file_reference",1201, +,"024f952c4311299a9518985e029af103","pages",1051,"media",,,,1,0,"sys_file_reference",1200, +,"6f102ac56c0d4ad453e4fbb3690d5f51","pages",1052,"media",,,,0,2,"sys_file_reference",1203, +,"19237b69723f541cb8f2a608db2c8ef2","pages",1052,"media",,,,1,2,"sys_file_reference",1202, +,"39433ea4a82060704109046e4828d3c8","sys_file",1,"storage",,,,0,0,"sys_file_storage",1, +,"1c9b8784c1518ef7b22704c4fc698ca9","sys_file",2,"storage",,,,0,0,"sys_file_storage",1, +,"24d47b29aa969cf4db8635e76dd1c386","sys_file",3,"storage",,,,0,0,"sys_file_storage",1, +,"bab37143de5339e474516691bf0c5857","sys_file",4,"storage",,,,0,0,"sys_file_storage",1, +,"791d3f9d43dcbfa78cd49dd8258caa09","sys_file",5,"storage",,,,0,0,"sys_file_storage",1, +,"1f6eb0fb60ffe14d40c03689e8a3ab47","sys_file_reference",1000,"uid_local",,,,0,0,"sys_file",1, +,"9dc843f4b01cae5cda6126d29cc7ffcd","sys_file_reference",1001,"uid_local",,,,0,0,"sys_file",5, +,"5c8ae9a01624f040b7b34d9471f80241","sys_file_reference",1002,"uid_local",,,,0,0,"sys_file",3, +,"77a5eae3fe69e11b798d83ff7c6cc8df","sys_file_reference",1010,"l10n_parent",,,,0,0,"sys_file_reference",1, +,"7b5f6ff3d4e47af0090b4fbbcfb6c9bc","sys_file_reference",1010,"uid_local",,,,0,0,"sys_file",1, +,"fa91e6f5f2b59fe9b13ead4e6788d8b6","sys_file_reference",1011,"l10n_parent",,,,0,0,"sys_file_reference",2, +,"6750ca3b9bad9259565f647b52363a77","sys_file_reference",1011,"uid_local",,,,0,0,"sys_file",2, +,"1becc5a13fc300b03914e0a35f9e8fe6","sys_file_reference",1012,"uid_local",,,,0,0,"sys_file",3, +,"f9f588287d59a44d76ad8bc288bcf01d","sys_file_reference",1100,"uid_local",,,,0,2,"sys_file",1, +,"e6f056f44b25b8ec631b63e255f06789","sys_file_reference",1101,"uid_local",,,,0,2,"sys_file",5, +,"987072f60e05a015ccc82debecc81965","sys_file_reference",1102,"uid_local",,,,0,2,"sys_file",3, +,"8dabcc8318d35d142ea5210aef819fdf","sys_file_reference",1200,"uid_local",,,,0,0,"sys_file",1, +,"ba730f55f3323ab577c91d650c1efbba","sys_file_reference",1201,"uid_local",,,,0,0,"sys_file",5, +,"3eafeecf7f6fbf478ae9f537c5db7126","sys_file_reference",1202,"uid_local",,,,0,2,"sys_file",1, +,"662cc7d7e85523cb3d6e0053ce6c1e50","sys_file_reference",1203,"uid_local",,,,0,2,"sys_file",5, diff --git a/typo3/sysext/core/Tests/Functional/Utility/RootlineUtilityTest.php b/typo3/sysext/core/Tests/Functional/Utility/RootlineUtilityTest.php index 14d8932b562b906662b0b9036c27f45f335637cb..c10c4bf98011ab50cd637ac915eea9b39cf57902 100644 --- a/typo3/sysext/core/Tests/Functional/Utility/RootlineUtilityTest.php +++ b/typo3/sysext/core/Tests/Functional/Utility/RootlineUtilityTest.php @@ -17,6 +17,7 @@ declare(strict_types=1); namespace TYPO3\CMS\Core\Tests\Functional\Utility; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Test; use TYPO3\CMS\Core\Cache\Frontend\NullFrontend; use TYPO3\CMS\Core\Context\Context; @@ -38,8 +39,6 @@ final class RootlineUtilityTest extends FunctionalTestCase protected const LANGUAGE_PRESETS = [ 'EN' => ['id' => 0, 'title' => 'English', 'locale' => 'en_US.UTF8'], 'FR' => ['id' => 1, 'title' => 'French', 'locale' => 'fr_FR.UTF8'], - 'FR-CA' => ['id' => 2, 'title' => 'Franco-Canadian', 'locale' => 'fr_CA.UTF8'], - 'ES' => ['id' => 3, 'title' => 'Spanish', 'locale' => 'es_ES.UTF8'], ]; protected array $coreExtensionsToLoad = ['workspaces']; @@ -49,11 +48,10 @@ final class RootlineUtilityTest extends FunctionalTestCase parent::setUp(); $this->writeSiteConfiguration( 'main', - $this->buildSiteConfiguration(1000, 'https://acme.com/'), + $this->buildSiteConfiguration(1, 'https://acme.com/'), [ $this->buildDefaultLanguageConfiguration('EN', '/'), $this->buildLanguageConfiguration('FR', '/fr/', ['EN']), - $this->buildLanguageConfiguration('FR-CA', '/fr-ca/', ['FR', 'EN']), ] ); self::importCSVDataSet(__DIR__ . '/Fixtures/RootlineUtilityImport.csv'); @@ -77,10 +75,10 @@ final class RootlineUtilityTest extends FunctionalTestCase #[Test] public function verifyCleanReferenceIndex() { - $referenceIndexFixResult = GeneralUtility::makeInstance(ReferenceIndex::class)->updateIndex(true); - if (count($referenceIndexFixResult['errors']) > 0) { - self::fail('Reference index not clean. ' . LF . implode(LF, $referenceIndexFixResult['errors'])); - } + // Fix refindex, then compare with import csv again to verify nothing changed. + // This is to make sure the import csv is 'clean' - important for the other tests. + GeneralUtility::makeInstance(ReferenceIndex::class)->updateIndex(false); + $this->assertCSVDataSet(__DIR__ . '/Fixtures/RootlineUtilityImport.csv'); } #[Test] @@ -344,175 +342,349 @@ final class RootlineUtilityTest extends FunctionalTestCase #[Test] public function getForRootPageOnlyReturnsRootPageInformation(): void { - $rootPageUid = 1000; + $rootPageUid = 1; $result = (new RootlineUtility($rootPageUid))->get(); self::assertCount(1, $result); self::assertSame($rootPageUid, (int)$result[0]['uid']); } #[Test] - public function resolveLivePagesAndSkipWorkspacedVersions(): void + public function rootlineFailsForDeletedParentPageInWorkspace(): void { + $this->expectException(PageNotFoundException::class); + $this->expectExceptionCode(1343464101); $context = new Context(); - $context->setAspect('workspace', new WorkspaceAspect(0)); - $result = (new RootlineUtility(1330, '', $context))->get(); - $expected = [ - 2 => [ - 'pid' => 1300, - 'uid' => 1330, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Board Games', - ], - 1 => [ - 'pid' => 1000, - 'uid' => 1300, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Products', - ], - 0 => [ - 'pid' => 0, - 'uid' => 1000, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'ACME Global', - ], - ]; - self::assertSame($expected, $this->filterExpectedValues($result, ['pid', 'uid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title'])); + $context->setAspect('workspace', new WorkspaceAspect(1)); + (new RootlineUtility(1002, '', $context))->get(); } - #[Test] - public function resolveWorkspaceOverlaysOfNewPageInWorkspace(): void + public static function getResolvesCorrectlyDataProvider(): \Generator { - $context = new Context(); - $context->setAspect('workspace', new WorkspaceAspect(1)); - $result = (new RootlineUtility(1400, '', $context))->get(); - $expected = [ - 1 => [ - 'pid' => 1000, - 'uid' => 1400, - 't3ver_oid' => 0, - 't3ver_wsid' => 1, - 't3ver_state' => 1, - 'title' => 'EN: A new page in workspace', + yield 'standard nested page lang default' => [ + 'uid' => 1001, + 'language' => 0, + 'workspace' => 0, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title'], + 'expected' => [ + 2 => [ + 'uid' => 1001, + 'pid' => 1000, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Parent 1 Sub 1', + ], + 1 => [ + 'uid' => 1000, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Parent 1', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], - 0 => [ - 'pid' => 0, - 'uid' => 1000, - 't3ver_oid' => 1000, - 't3ver_wsid' => 1, - 't3ver_state' => 0, - 'title' => 'ACME Global modified in Workspace 1', - '_ORIG_uid' => 10000, + ]; + yield 'standard nested page lang FR, requesting with default lang id' => [ + 'uid' => 1001, + 'language' => 1, + 'workspace' => 0, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title'], + 'expected' => [ + 2 => [ + 'uid' => 1001, + 'pid' => 1000, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'FR Parent 1 Sub 1', + ], + 1 => [ + 'uid' => 1000, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Parent 1', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], ]; - self::assertSame($expected, $this->filterExpectedValues($result, ['pid', 'uid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'])); - } - - #[Test] - public function resolveLiveRootLineForMovedPage(): void - { - $context = new Context(); - $context->setAspect('workspace', new WorkspaceAspect(0)); - $result = (new RootlineUtility(1333, '', $context))->get(); - $expected = [ - 3 => [ - 'pid' => 1330, - 'uid' => 1333, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Risk', + // @todo: Inconsistent. Compare with above set: When requesting a localized uid directly, 'uid' is the localized one. + yield 'standard nested page lang FR, requesting with FR lang id' => [ + 'uid' => 1002, + 'language' => 1, + 'workspace' => 0, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_LOCALIZED_UID', '_REQUESTED_OVERLAY_LANGUAGE'], + 'expected' => [ + 2 => [ + 'uid' => 1002, + 'pid' => 1000, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'FR Parent 1 Sub 1', + ], + 1 => [ + 'uid' => 1000, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Parent 1', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], + ], + ]; + yield 'new page in workspaces' => [ + 'uid' => 1011, + 'language' => 0, + 'workspace' => 2, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title'], + 'expected' => [ + 2 => [ + 'uid' => 1011, + 'pid' => 1010, + 't3ver_oid' => 0, + 't3ver_wsid' => 2, + 't3ver_state' => 1, + 'title' => 'EN WS2-new Parent 2 Sub 1', + ], + 1 => [ + 'uid' => 1010, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Parent 2', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], - 2 => [ - 'pid' => 1300, - 'uid' => 1330, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Board Games', + ]; + yield 'moved in workspaces, requesting with live id in live' => [ + 'uid' => 1020, + 'language' => 0, + 'workspace' => 0, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title'], + 'expected' => [ + 1 => [ + 'uid' => 1020, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN To Move in WS', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], - 1 => [ - 'pid' => 1000, - 'uid' => 1300, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Products', + ]; + yield 'moved in workspaces, requesting with live id in workspace' => [ + 'uid' => 1020, + 'language' => 0, + 'workspace' => 2, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'], + 'expected' => [ + 2 => [ + 'uid' => 1020, + 'pid' => 1021, + 't3ver_oid' => 1020, + 't3ver_wsid' => 2, + 't3ver_state' => 4, + 'title' => 'EN WS2-moved Move in WS', + '_ORIG_uid' => 1022, + '_ORIG_pid' => 1, + ], + 1 => [ + 'uid' => 1021, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Move target', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], - 0 => [ - 'pid' => 0, - 'uid' => 1000, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'ACME Global', + ]; + yield 'moved in workspaces, requesting with workspace id in workspace' => [ + 'uid' => 1022, + 'language' => 0, + 'workspace' => 2, + 'testFields' => ['uid', 'pid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'], + 'expected' => [ + 2 => [ + 'uid' => 1020, + 'pid' => 1021, + 't3ver_oid' => 1020, + 't3ver_wsid' => 2, + 't3ver_state' => 4, + 'title' => 'EN WS2-moved Move in WS', + '_ORIG_uid' => 1022, + '_ORIG_pid' => 1, + ], + 1 => [ + 'uid' => 1021, + 'pid' => 1, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Move target', + ], + 0 => [ + 'uid' => 1, + 'pid' => 0, + 't3ver_oid' => 0, + 't3ver_wsid' => 0, + 't3ver_state' => 0, + 'title' => 'EN Root', + ], ], ]; - self::assertSame($expected, $this->filterExpectedValues($result, ['pid', 'uid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'])); - } - - #[Test] - public function resolveWorkspaceOverlaysOfMovedPage(): void - { - $context = new Context(); - $context->setAspect('workspace', new WorkspaceAspect(1)); - $result = (new RootlineUtility(1333, '', $context))->get(); - $expected = [ - 3 => [ - 'pid' => 1320, - 'uid' => 1333, - 't3ver_oid' => 1333, - 't3ver_wsid' => 1, - 't3ver_state' => 4, - 'title' => 'EN: Risk', - '_ORIG_uid' => 10001, - '_ORIG_pid' => 1330, // Pointing to the LIVE pid! WHY? All others point to the same PID! @todo + yield 'media lang default' => [ + 'uid' => 1031, + 'language' => 0, + 'workspace' => 0, + 'testFields' => ['uid', 'title', 'media'], + 'expected' => [ + 2 => [ + 'uid' => 1031, + 'title' => 'EN Parent 3 Sub 1', + 'media' => '1001,1000', + ], + 1 => [ + 'uid' => 1030, + 'title' => 'EN Parent 3', + 'media' => '', + ], + 0 => [ + 'uid' => 1, + 'title' => 'EN Root', + 'media' => '', + ], ], - 2 => [ - 'pid' => 1300, - 'uid' => 1320, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Card Games', + ]; + yield 'media lang FR' => [ + 'uid' => 1031, + 'language' => 1, + 'workspace' => 0, + 'testFields' => ['uid', 'title', 'media'], + 'expected' => [ + 2 => [ + 'uid' => 1031, + 'title' => 'FR Parent 3 Sub 1', + 'media' => '1010,1011', + ], + 1 => [ + 'uid' => 1030, + 'title' => 'EN Parent 3', + 'media' => '', + ], + 0 => [ + 'uid' => 1, + 'title' => 'EN Root', + 'media' => '', + ], ], - 1 => [ - 'pid' => 1000, - 'uid' => 1300, - 't3ver_oid' => 0, - 't3ver_wsid' => 0, - 't3ver_state' => 0, - 'title' => 'EN: Products', + ]; + yield 'media lang default, workspace new' => [ + 'uid' => 1041, + 'language' => 0, + 'workspace' => 2, + 'testFields' => ['uid', 'title', 'media'], + 'expected' => [ + 2 => [ + 'uid' => 1041, + 'title' => 'EN WS2-new Parent 4 Sub 1 with media', + 'media' => '1101,1100', + ], + 1 => [ + 'uid' => 1040, + 'title' => 'EN Parent 4', + 'media' => '', + ], + 0 => [ + 'uid' => 1, + 'title' => 'EN Root', + 'media' => '', + ], ], - 0 => [ - 'pid' => 0, - 'uid' => 1000, - 't3ver_oid' => 1000, - 't3ver_wsid' => 1, - 't3ver_state' => 0, - 'title' => 'ACME Global modified in Workspace 1', - '_ORIG_uid' => 10000, + ]; + yield 'media lang default, workspace one media deleted' => [ + 'uid' => 1051, + 'language' => 0, + 'workspace' => 2, + 'testFields' => ['uid', 'title', 'media'], + 'expected' => [ + 2 => [ + 'uid' => 1051, + 'title' => 'EN WS2-changed Parent 5 Sub 1 with media deleted', + // @todo: bug. 1201 is included, but should not, since it has a delete placeholder. + // this is because $relationHandler->processDeletePlaceholder() is not called. + 'media' => '1201,1200', + ], + 1 => [ + 'uid' => 1050, + 'title' => 'EN Parent 5', + 'media' => '', + ], + 0 => [ + 'uid' => 1, + 'title' => 'EN Root', + 'media' => '', + ], ], ]; - self::assertSame($expected, $this->filterExpectedValues($result, ['pid', 'uid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'])); - - // Now explicitly requesting the versioned ID, which holds the same result - $result = (new RootlineUtility(10001, '', $context))->get(); - self::assertSame($expected, $this->filterExpectedValues($result, ['pid', 'uid', 't3ver_oid', 't3ver_wsid', 't3ver_state', 'title', '_ORIG_uid', '_ORIG_pid'])); } + #[DataProvider('getResolvesCorrectlyDataProvider')] #[Test] - public function rootlineFailsForDeletedParentPageInWorkspace(): void + public function getResolvesCorrectly(int $uid, int $language, int $workspace, array $testFields, array $expected): void { - $this->expectException(PageNotFoundException::class); - $this->expectExceptionCode(1343464101); $context = new Context(); - $context->setAspect('workspace', new WorkspaceAspect(2)); - (new RootlineUtility(1310, '', $context))->get(); + $context->setAspect('workspace', new WorkspaceAspect($workspace)); + $context->setAspect('language', new LanguageAspect($language)); + $result = (new RootlineUtility($uid, '', $context))->get(); + self::assertSame($expected, $this->filterExpectedValues($result, $testFields)); } }