justReturn(new WP_Post(['ID' => 5, 'post_type' => 'page', 'post_title' => 'Team', 'post_status' => $status])); Functions\when('current_user_can')->justReturn(true); Functions\when('get_preview_post_link')->justReturn('https://kunde.de/?p=5&preview=true'); Functions\when('get_edit_post_link')->justReturn('https://kunde.de/wp-admin/post.php?post=5&action=edit'); $schema = SchemaFixture::managed(); return new PostUnpublishAbility($schema, $log); } public function testPublishedPostBecomesDraft(): void { Functions\expect('wp_update_post')->once()->with(['ID' => 5, 'post_status' => 'draft'], true)->andReturn(5); $log = new FakeChangeLog(3); $result = $this->ability($log, 'publish')->execute(['post_id' => 5]); self::assertSame('unpublished', $result['changed'][0]['action']); $log->assertRecorded([]); } public function testAHookThrowingDuringTheWriteIsAPartialWrite(): void { Functions\when('wp_update_post')->alias(static function (): void { throw new RuntimeException('save_post-Hook kaputt'); }); $log = FakeChangeLog::partialsOnly(); try { $this->ability($log, 'publish')->execute(['post_id' => 5]); self::fail('WriteFailed expected'); } catch (WriteFailed $e) { self::assertFalse($e->rolledBack); self::assertSame(5, $e->postId); self::assertStringContainsString('save_post-Hook kaputt', $e->getMessage()); self::assertSame('lit_partial_write', $e->toError()->get_error_code()); } $log->assertPartials(['ability' => 'lit/post-unpublish', 'object_type' => 'page', 'object_id' => '5']); } public function testATrashedPostIsRefusedInsteadOfBecomingADraft(): void { Functions\expect('wp_update_post')->never(); $result = $this->ability(FakeChangeLog::forbidden(), 'trash')->execute(['post_id' => 5]); self::assertSame('lit_validation_failed', $result->get_error_code()); } public function testDraftIsANoOp(): void { Functions\expect('wp_update_post')->never(); $result = $this->ability(FakeChangeLog::forbidden(), 'draft')->execute(['post_id' => 5]); self::assertSame([], $result['changed']); } }