Skip to content

Commit

Permalink
IBX-3957: Made NOP URL aliases not reusable and original
Browse files Browse the repository at this point in the history
  • Loading branch information
barw4 committed Apr 30, 2024
1 parent c97c8e0 commit 61a900d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@ public function insertRow(array $values): int
$values['is_original'] = 1;
}
if ($values['action'] === self::NOP_ACTION) {
$values['is_original'] = 0;
$values['is_original'] = 1;
}

$query = $this->connection->createQueryBuilder();
Expand Down
6 changes: 2 additions & 4 deletions src/lib/Persistence/Legacy/Content/UrlAlias/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,9 @@ private function internalPublishUrlAliasForLocation(
}

// Row exists, check if it is reusable. There are 3 cases when this is possible:
// 1. NOP entry
// 2. existing location or custom alias entry
// 3. history entry
// 1. existing location or custom alias entry
// 2. history entry
if (
$row['action'] === Gateway::NOP_ACTION ||
$row['action'] === $action ||
(int)$row['is_original'] === 0
) {
Expand Down
45 changes: 45 additions & 0 deletions tests/integration/Core/Repository/URLAliasServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1483,6 +1483,51 @@ public function testOverrideHistoryUrlAliasAtTheSameLocation(): void
self::assertFalse($newAlias->isHistory);
}

public function testRenamingParentContentDoesntBreakChildAlias(): void
{
$repository = $this->getRepository();
$urlAliasService = $repository->getURLAliasService();
$contentService = $repository->getContentService();

$languageCode = 'eng-GB';

// 1. Create parent folder
$folder = $this->createFolder([$languageCode => 'a'], 2);
$folderLocationId = $folder->contentInfo->getMainLocationId();

// 2. Create child folder
$child = $this->createFolder([$languageCode => 'b'], $folderLocationId);
$childLocation = $child->getVersionInfo()->getContentInfo()->getMainLocation();
$childLocationId = $childLocation->id;

// 3. Create custom URL alias for child folder
$urlAliasService->createUrlAlias($childLocation, '/c/b', $languageCode);
$lookup = $urlAliasService->lookup('/c/b');

self::assertSame('/c/b', $lookup->path);
self::assertSame($childLocationId, $lookup->destination);

// 4. Rename "A" to "C"
$folderDraft = $contentService->createContentDraft($folder->contentInfo);
$folderUpdateStruct = $contentService->newContentUpdateStruct();
$folderUpdateStruct->setField('name', 'c');
$renamedFolder = $contentService->updateContent($folderDraft->getVersionInfo(), $folderUpdateStruct);
$contentService->publishVersion($renamedFolder->getVersionInfo());

// Loading aliases shouldn't throw a `BadStateException`
$childLocationAliases = $urlAliasService->listLocationAliases($childLocation);

self::assertCount(1, $childLocationAliases);
self::assertSame('/c/b', $childLocationAliases[0]->path);

// Renamed content should have '/c2' path alias
$lookupRenamed = $urlAliasService->lookup('c2');
$originalLookup = $urlAliasService->lookup('/c/b');

self::assertSame($childLocationId, $originalLookup->destination);
self::assertSame('/c2', $lookupRenamed->path);
}

/**
* Lookup given URL and check if it is archived and points to the given Location Id.
*
Expand Down

0 comments on commit 61a900d

Please sign in to comment.