From 79f2fdbda63bab5890f7fe50abf1cad55a0ef1fc Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Sun, 27 Sep 2026 23:03:05 +0200 Subject: [PATCH] test: fix the P9/P14 backup wording of every VisibleEdits caller (ruling Q17 M3) VisibleEditsTest asserts the exact refusal messages (no unfiltered_html, trash disabled) and the keepingBackup() hints for rolled-back and partial failures with each caller's label and entry. The callers' own tests drive GlobalEdits, ThemeBuilderEdits (through DiviWriter) and make-global with revisions off and assert the same sentences. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7 --- .../Divi/Library/GlobalEditsTest.php | 22 ++++- .../Library/LibraryMakeGlobalAbilityTest.php | 44 ++++++++- .../Divi/Pages/DiviWriterThemeBuilderTest.php | 6 +- .../Divi/Pages/VisibleEditsTest.php | 94 +++++++++++++++++++ .../ThemeBuilder/ThemeBuilderEditsTest.php | 9 +- 5 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 tests/Unit/Integrations/Divi/Pages/VisibleEditsTest.php diff --git a/tests/Unit/Integrations/Divi/Library/GlobalEditsTest.php b/tests/Unit/Integrations/Divi/Library/GlobalEditsTest.php index ade02b3..29424d8 100644 --- a/tests/Unit/Integrations/Divi/Library/GlobalEditsTest.php +++ b/tests/Unit/Integrations/Divi/Library/GlobalEditsTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Tests\Unit\Integrations\Divi\Library; use Brain\Monkey\Functions; +use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\WriteFailed; use LIT\MCP\Integrations\Divi\Library\GlobalEdits; @@ -20,6 +21,7 @@ use LIT\MCP\Tests\Support\DiviFixtures; use LIT\MCP\Tests\Support\DiviWriterFixture; use LIT\MCP\Tests\Support\FakeChangeLog; use LIT\MCP\Tests\Support\LibraryFixtures; +use LIT\MCP\Tests\Unit\Integrations\Divi\Pages\VisibleEditsTest; use LIT\MCP\Tests\Unit\TestCase; use Mockery; use WP_Post; @@ -27,6 +29,9 @@ use WP_Post; /** The Divi write tools on library entries (E2, answer F2). */ final class GlobalEditsTest extends TestCase { + private const BACKUP_HINT = 'Revisionen für die Divi-Bibliothek aktivieren (WP_POST_REVISIONS) oder den Eintrag im ' + . 'Divi-Builder bearbeiten.'; + /** @var list Content and scope handed to the saver. */ private array $saved = []; @@ -227,7 +232,11 @@ final class GlobalEditsTest extends TestCase $result = (new DiviUpdateAbility($this->writer()))->execute(self::relabel(1059, true)); self::assertToolError($result, 'unsupported'); - self::assertStringContainsString('Revisionen', $result->get_error_message()); + self::assertSame( + sprintf(VisibleEditsTest::UNFAITHFUL, 'Bibliothekseintrag 1059'), + Errors::clientMessage($result) + ); + self::assertSame(self::BACKUP_HINT, $result->get_error_data()['hint']); self::assertSame(0, $this->backups); self::assertSame([], $this->saved); } @@ -242,7 +251,8 @@ final class GlobalEditsTest extends TestCase $result = (new DiviUpdateAbility($this->writer()))->execute(self::relabel(1059, true)); self::assertToolError($result, 'unsupported'); - self::assertStringContainsString('Papierkorb', $result->get_error_message()); + self::assertSame(sprintf(VisibleEditsTest::NO_TRASH, 'Bibliothekseintrag 1059'), Errors::clientMessage($result)); + self::assertSame(self::BACKUP_HINT, $result->get_error_data()['hint']); self::assertSame(0, $this->backups); self::assertSame([], $this->saved); } @@ -396,7 +406,11 @@ final class GlobalEditsTest extends TestCase self::assertTrue($e->rolledBack); self::assertSame(1071, $error->get_error_data()['backup_id']); - self::assertStringContainsString('Sicherung 1071 liegt im Papierkorb', $error->get_error_data()['hint']); + self::assertSame( + VisibleEditsTest::keptRolledBack(1071, 'des Bibliothekseintrags'), + $error->get_error_data()['hint'] + ); + self::assertStringContainsString(Errors::notSavedKeeping('Sicherung 1071 im Papierkorb'), Errors::clientMessage($error)); self::assertStringNotContainsString('Nichts wurde gespeichert', $error->get_error_message()); self::assertSame(1, $this->backups); } @@ -418,7 +432,7 @@ final class GlobalEditsTest extends TestCase self::assertToolError($error, 'partial_write'); self::assertSame(1071, $error->get_error_data()['backup_id']); self::assertSame(1059, $error->get_error_data()['post_id']); - self::assertStringContainsString('Sicherung 1071 liegt im Papierkorb', $error->get_error_data()['hint']); + self::assertSame(VisibleEditsTest::keptPartial(1071, 'des Bibliothekseintrags'), $error->get_error_data()['hint']); self::assertCount(1, $this->log->partials); } diff --git a/tests/Unit/Integrations/Divi/Library/LibraryMakeGlobalAbilityTest.php b/tests/Unit/Integrations/Divi/Library/LibraryMakeGlobalAbilityTest.php index bd23085..1199706 100644 --- a/tests/Unit/Integrations/Divi/Library/LibraryMakeGlobalAbilityTest.php +++ b/tests/Unit/Integrations/Divi/Library/LibraryMakeGlobalAbilityTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace LIT\MCP\Tests\Unit\Integrations\Divi\Library; use Brain\Monkey\Functions; +use LIT\MCP\Abilities\Errors; use LIT\MCP\Abilities\Rev; use LIT\MCP\Abilities\WriteFailed; use LIT\MCP\Integrations\Divi\BlockTree\LibraryContent; @@ -23,6 +24,7 @@ use LIT\MCP\Tests\Support\DiviWriterFixture; use LIT\MCP\Tests\Support\FakeChangeLog; use LIT\MCP\Tests\Support\LibraryFixtures; use LIT\MCP\Tests\Support\ThemeBuilderFixtures; +use LIT\MCP\Tests\Unit\Integrations\Divi\Pages\VisibleEditsTest; use LIT\MCP\Tests\Unit\TestCase; use Mockery; use Throwable; @@ -30,6 +32,8 @@ use WP_Post; final class LibraryMakeGlobalAbilityTest extends TestCase { + private const BACKUP_HINT = 'Revisionen aktivieren (WP_POST_REVISIONS) oder die Seite im Divi-Builder bearbeiten.'; + private WP_Post $page; /** @var list */ @@ -453,11 +457,49 @@ final class LibraryMakeGlobalAbilityTest extends TestCase $this->saved = []; $this->givenCopiesOf1058(); Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap !== 'unfiltered_html'); - self::assertToolError($this->ability()->execute(self::targets(['s0'], ['s1'], true)), 'unsupported'); + $refused = $this->ability()->execute(self::targets(['s0'], ['s1'], true)); + self::assertToolError($refused, 'unsupported'); + self::assertSame(sprintf(VisibleEditsTest::UNFAITHFUL, 'Seite 8'), Errors::clientMessage($refused)); + self::assertSame(self::BACKUP_HINT, $refused->get_error_data()['hint']); self::assertSame([], $this->backups); self::assertSame([], $this->saved); } + /** Review I-3 (ruling Q17 M3): the trash refusal and a failure after the backup name the page. */ + public function testTheBackupWordingNamesThePage(): void + { + $this->givenCopiesOf1058(); + Functions\when('wp_revisions_enabled')->justReturn(false); + $noFailures = []; + $ability = new LibraryMakeGlobalAbility( + LibraryFixtures::access(), + DiviWriterFixture::writer($this->saved, $noFailures, false, LibraryFixtures::loader()), + new NewLibraryEntry(LibraryFixtures::access(), Mockery::mock(DiviSaver::class), DiviWriterFixture::modules()), + $this->log, + null, + new VisibleEdits(static fn (WP_Post $post): int => 1071, static fn (): bool => false) + ); + $noTrash = $ability->execute(self::targets(['s0'], ['s1'], true)); + self::assertToolError($noTrash, 'unsupported'); + self::assertSame(sprintf(VisibleEditsTest::NO_TRASH, 'Seite 8'), Errors::clientMessage($noTrash)); + self::assertSame(self::BACKUP_HINT, $noTrash->get_error_data()['hint']); + self::assertSame([], $this->saved); + + $this->givenCopiesOf1058(); + try { + $this->ability([], true, false, [WriteFailed::rolledBack('Grund.')]) + ->execute(self::targets(['s0'], ['s1'], true)); + self::fail('no WriteFailed'); + } catch (WriteFailed $e) { + self::assertSame(1071, $e->details['backup_id']); + self::assertSame(VisibleEditsTest::keptRolledBack(1071, 'der Seite'), $e->toError()->get_error_data()['hint']); + self::assertStringContainsString( + Errors::notSavedKeeping('Sicherung 1071 im Papierkorb'), + Errors::clientMessage($e->toError()) + ); + } + } + /** A failure on page N: the pages before stay replaced (each with revision), the rest untouched – all named. */ public function testAFailureMidwayReportsEveryPage(): void { diff --git a/tests/Unit/Integrations/Divi/Pages/DiviWriterThemeBuilderTest.php b/tests/Unit/Integrations/Divi/Pages/DiviWriterThemeBuilderTest.php index 5f36879..ec2ba37 100644 --- a/tests/Unit/Integrations/Divi/Pages/DiviWriterThemeBuilderTest.php +++ b/tests/Unit/Integrations/Divi/Pages/DiviWriterThemeBuilderTest.php @@ -146,8 +146,10 @@ final class DiviWriterThemeBuilderTest extends TestCase self::assertSame(1, $backups); self::assertSame(1071, $error->get_error_data()['backup_id']); - self::assertStringContainsString('Sicherung 1071 liegt im Papierkorb', $error->get_error_data()['hint']); - self::assertStringContainsString('Theme-Builder-Layouts', $error->get_error_data()['hint']); + self::assertSame( + VisibleEditsTest::keptRolledBack(1071, 'des Theme-Builder-Layouts'), + $error->get_error_data()['hint'] + ); self::assertSame([], $this->saved); } diff --git a/tests/Unit/Integrations/Divi/Pages/VisibleEditsTest.php b/tests/Unit/Integrations/Divi/Pages/VisibleEditsTest.php new file mode 100644 index 0000000..3152a85 --- /dev/null +++ b/tests/Unit/Integrations/Divi/Pages/VisibleEditsTest.php @@ -0,0 +1,94 @@ + Label and entry of each caller. */ + public static function callers(): array + { + return [ + 'library entry (GlobalEdits)' => ['Bibliothekseintrag 1059', 'des Bibliothekseintrags'], + 'Theme Builder layout (ThemeBuilderEdits)' => ['Theme-Builder-Layout 1062', 'des Theme-Builder-Layouts'], + 'page (lit/library-make-global)' => ['Seite 8', 'der Seite'], + ]; + } + + /** @dataProvider callers */ + public function testTheBackupRefusalsNameTheEntryAndTheCallersHint(string $label, string $entry): void + { + $post = new WP_Post(['ID' => 1]); + Functions\when('wp_revisions_enabled')->justReturn(false); + Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap !== 'unfiltered_html'); + $visible = new VisibleEdits(static fn (WP_Post $post): int => 1071, static fn (): bool => false); + + $unfaithful = $visible->backupRefusal($post, $label, 'Was stattdessen.'); + self::assertToolError($unfaithful, 'unsupported'); + self::assertSame(sprintf(self::UNFAITHFUL, $label), Errors::clientMessage($unfaithful)); + self::assertSame('Was stattdessen.', $unfaithful->get_error_data()['hint']); + + Functions\when('current_user_can')->justReturn(true); + $noTrash = $visible->backupRefusal($post, $label, 'Was stattdessen.'); + self::assertSame(sprintf(self::NO_TRASH, $label), Errors::clientMessage($noTrash)); + self::assertSame('Was stattdessen.', $noTrash->get_error_data()['hint']); + + Functions\when('wp_revisions_enabled')->justReturn(true); + self::assertNull($visible->backupRefusal($post, $label, 'Was stattdessen.')); + } + + /** @dataProvider callers */ + public function testAFailureAfterTheBackupNamesItAndTheEntry(string $label, string $entry): void + { + $rolledBack = VisibleEdits::keepingBackup(WriteFailed::rolledBack('Grund.'), 1071, $entry)->toError(); + self::assertToolError($rolledBack, 'write_failed'); + self::assertSame( + 'Speichern fehlgeschlagen: Grund. ' . Errors::notSavedKeeping('Sicherung 1071 im Papierkorb'), + Errors::clientMessage($rolledBack) + ); + self::assertSame(self::keptRolledBack(1071, $entry), $rolledBack->get_error_data()['hint']); + self::assertSame(1071, $rolledBack->get_error_data()['backup_id']); + + $partial = VisibleEdits::keepingBackup(WriteFailed::partial('Grund.', postId: 5), 1071, $entry)->toError(); + self::assertToolError($partial, 'partial_write'); + self::assertSame(self::keptPartial(1071, $entry), $partial->get_error_data()['hint']); + self::assertSame(1071, $partial->get_error_data()['backup_id']); + + $withoutBackup = WriteFailed::rolledBack('Grund.'); + self::assertSame($withoutBackup, VisibleEdits::keepingBackup($withoutBackup, null, $entry)); + } +} diff --git a/tests/Unit/Integrations/Divi/ThemeBuilder/ThemeBuilderEditsTest.php b/tests/Unit/Integrations/Divi/ThemeBuilder/ThemeBuilderEditsTest.php index e8b57de..9d79ea9 100644 --- a/tests/Unit/Integrations/Divi/ThemeBuilder/ThemeBuilderEditsTest.php +++ b/tests/Unit/Integrations/Divi/ThemeBuilder/ThemeBuilderEditsTest.php @@ -18,6 +18,7 @@ use LIT\MCP\Integrations\Divi\ThemeBuilder\Template; use LIT\MCP\Integrations\Divi\ThemeBuilder\ThemeBuilderEdits; use LIT\MCP\Abilities\Errors; use LIT\MCP\Tests\Support\ThemeBuilderFixtures; +use LIT\MCP\Tests\Unit\Integrations\Divi\Pages\VisibleEditsTest; use LIT\MCP\Tests\Unit\TestCase; use Mockery; use WP_Post; @@ -226,16 +227,18 @@ final class ThemeBuilderEditsTest extends TestCase $live = [ThemeBuilderFixtures::template(1066, ['enabled' => true])]; Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap !== 'unfiltered_html'); + $hint = 'Revisionen aktivieren (WP_POST_REVISIONS) oder das Layout im Divi Theme Builder bearbeiten.'; $filtered = $this->recording($live)->prepare($page, ['confirm' => true]); self::assertToolError($filtered, 'unsupported'); - self::assertStringContainsString('Theme-Builder-Layout 1062', $filtered->get_error_message()); - self::assertStringContainsString('Theme Builder', (string) self::clientError($filtered)['hint']); + self::assertSame(sprintf(VisibleEditsTest::UNFAITHFUL, 'Theme-Builder-Layout 1062'), Errors::clientMessage($filtered)); + self::assertSame($hint, self::clientError($filtered)['hint']); Functions\when('current_user_can')->justReturn(true); $this->trash = false; $trash = $this->recording($live)->prepare($page, ['confirm' => true]); self::assertToolError($trash, 'unsupported'); - self::assertStringContainsString('Papierkorb', $trash->get_error_message()); + self::assertSame(sprintf(VisibleEditsTest::NO_TRASH, 'Theme-Builder-Layout 1062'), Errors::clientMessage($trash)); + self::assertSame($hint, self::clientError($trash)['hint']); self::assertSame(0, $this->backups); }