expects('deleteCreatedTerms')->andThrow(new RuntimeException('term 15 bleibt')); Functions\when('wp_delete_post')->alias(static function (): never { throw new RuntimeException('delete_post hook kaputt'); }); $log = FakeChangeLog::partialsOnly(); $draft = new NewDraft($writer, $log, 'lit/content-create', 'page'); try { $draft->discard(42, new RuntimeException('layout kaputt'), 'Grund für den Client.'); self::fail('WriteFailed expected'); } catch (WriteFailed $e) { self::assertFalse($e->rolledBack); self::assertSame(42, $e->postId); self::assertSame('Grund für den Client.', $e->reason); self::assertSame( 'Writing new post 42 failed after the insert: layout kaputt; rollback: term 15 bleibt; ' . 'draft 42 could not be deleted: delete_post hook kaputt [rollback incomplete]', $e->getMessage() ); } $log->assertPartials([ 'ability' => 'lit/content-create', 'object_type' => 'page', 'object_id' => '42', 'summary' => 'Entwurf 42: Anlegen nur teilweise zurückgenommen', ]); } public function testACleanDiscardIsRolledBackWithTheGivenReason(): void { $writer = Mockery::mock(PostWriter::class); $writer->expects('deleteCreatedTerms'); Functions\expect('wp_delete_post')->once()->with(42, true)->andReturn(true); $log = FakeChangeLog::forbidden(); $draft = new NewDraft($writer, $log, 'lit/content-create', 'page'); try { $draft->discard(42, new RuntimeException('meta kaputt'), NewDraft::REASON_EXTRAS); self::fail('WriteFailed expected'); } catch (WriteFailed $e) { self::assertTrue($e->rolledBack); self::assertSame(NewDraft::REASON_EXTRAS, $e->reason); } } }