refactor: WriteFailed named constructors, Rollback runner, Errors read-back helpers (H6)
- WriteFailed::rolledBack()/partial() replace the 11-parameter constructor (now private); the hint/state of either error are plain $hint/$state. - Rollback::attempt(...steps) runs every undo step and collects failure messages; used by ContentCreate::discard, ContentUpdate::rollBack, MediaUpdate::rollBack and DiviSaver::restore. - Errors::clientMessage/codeOf/fieldsOf replace DiviReplaceTextAbility::reason, the JSON digging in MediaUpdateAbility::failure and ContentCreateAbility::fields. - Errors docblock documents the exception/WP_Error split. - ContentCreateAbility::discard takes the client reason as a parameter (both callers still pass REASON_EXTRAS; changing the Divi text needs a ruling). Error payloads unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -561,7 +561,7 @@ final class DiviReplaceTextAbilityTest extends TestCase
|
||||
public function testWriteFailedKeepsItsOwnMessage(): void
|
||||
{
|
||||
$ability = $this->ability();
|
||||
$this->failures = [new WriteFailed('Die Datenbank hat das Speichern abgelehnt.', true, 7)];
|
||||
$this->failures = [WriteFailed::rolledBack('Die Datenbank hat das Speichern abgelehnt.', postId: 7)];
|
||||
$log = (string) tempnam(sys_get_temp_dir(), 'lit-log');
|
||||
$previous = ini_set('error_log', $log);
|
||||
try {
|
||||
|
||||
@@ -171,7 +171,7 @@ final class DiviWriterTest extends TestCase
|
||||
$content = DiviPageLoaderTest::fixture('synthetic-basic.html');
|
||||
DiviPageLoaderTest::givenPost($content);
|
||||
$saver = Mockery::mock(DiviSaver::class);
|
||||
$saver->allows('save')->andThrow(new WriteFailed(DiviSaver::REASON, false, 7, 811));
|
||||
$saver->allows('save')->andThrow(WriteFailed::partial(DiviSaver::REASON, postId: 7, revisionId: 811));
|
||||
$log = Mockery::mock(ChangeLog::class);
|
||||
$log->expects('recordPartial')->with('lit/divi-delete', 'page', '7', 'Divi "Start": Änderung nur teilweise zurückgenommen', 811);
|
||||
$writer = $this->writer($saver, $log);
|
||||
@@ -187,7 +187,7 @@ final class DiviWriterTest extends TestCase
|
||||
$content = DiviPageLoaderTest::fixture('synthetic-basic.html');
|
||||
DiviPageLoaderTest::givenPost($content);
|
||||
$saver = Mockery::mock(DiviSaver::class);
|
||||
$saver->allows('save')->andThrow(new WriteFailed(DiviSaver::REASON, true, 7, 811));
|
||||
$saver->allows('save')->andThrow(WriteFailed::rolledBack(DiviSaver::REASON, postId: 7, revisionId: 811));
|
||||
$log = Mockery::mock(ChangeLog::class);
|
||||
$log->expects('recordPartial')->never();
|
||||
$log->expects('record')->never();
|
||||
|
||||
@@ -108,7 +108,7 @@ final class MediaUploadAbilitiesTest extends TestCase
|
||||
|
||||
public function testAPartialUploadIsLoggedAsPartialAndRethrown(): void
|
||||
{
|
||||
$failure = new WriteFailed('Alt-Text fehlt.', false, 55);
|
||||
$failure = WriteFailed::partial('Alt-Text fehlt.', postId: 55);
|
||||
$importer = Mockery::mock(MediaImporter::class);
|
||||
$importer->allows('fromUrl')->andThrow($failure);
|
||||
$log = Mockery::mock(ChangeLog::class);
|
||||
|
||||
@@ -242,7 +242,7 @@ final class MenuSetItemsAbilityTest extends TestCase
|
||||
{
|
||||
$writer = Mockery::mock(MenuWriter::class);
|
||||
$writer->allows('plan')->andReturn(['errors' => [], 'removals' => [], 'warnings' => []]);
|
||||
$writer->expects('apply')->andThrow(new WriteFailed('Menü nicht gespeichert.', true));
|
||||
$writer->expects('apply')->andThrow(WriteFailed::rolledBack('Menü nicht gespeichert.'));
|
||||
$log = Mockery::mock(ChangeLog::class);
|
||||
$log->shouldNotReceive('recordPartial');
|
||||
$ability = new MenuSetItemsAbility($writer, new MenuOperations(), $log);
|
||||
@@ -255,7 +255,7 @@ final class MenuSetItemsAbilityTest extends TestCase
|
||||
{
|
||||
$writer = Mockery::mock(MenuWriter::class);
|
||||
$writer->allows('plan')->andReturn(['errors' => [], 'removals' => [], 'warnings' => []]);
|
||||
$writer->expects('apply')->andThrow(new WriteFailed('Menü nicht gespeichert.', false));
|
||||
$writer->expects('apply')->andThrow(WriteFailed::partial('Menü nicht gespeichert.'));
|
||||
$log = Mockery::mock(ChangeLog::class);
|
||||
$log->expects('recordPartial')->with('lit/menu-set-items', 'nav_menu', '3', Mockery::type('string'));
|
||||
$ability = new MenuSetItemsAbility($writer, new MenuOperations(), $log);
|
||||
|
||||
@@ -282,7 +282,7 @@ final class PostReplaceWithCopyAbilityTest extends TestCase
|
||||
{
|
||||
$cloner = Mockery::mock(PostCloner::class);
|
||||
$cloner->allows('snapshot')->andReturn(self::SNAPSHOT);
|
||||
$cloner->expects('backup')->andThrow(new WriteFailed('Die Sicherung konnte nicht angelegt werden.', true));
|
||||
$cloner->expects('backup')->andThrow(WriteFailed::rolledBack('Die Sicherung konnte nicht angelegt werden.'));
|
||||
$cloner->expects('replace')->never();
|
||||
$cloner->expects('restore')->never();
|
||||
Functions\expect('wp_save_post_revision')->never();
|
||||
|
||||
Reference in New Issue
Block a user