justReturn(new WP_Post(['ID' => 5, 'post_type' => 'page', 'post_title' => 'Alt', 'post_status' => 'publish'])); Functions\when('current_user_can')->justReturn(true); $schema = Mockery::mock(ContentSchema::class); $schema->allows('isManaged')->andReturn(true); return new PostTrashAbility($schema, $log); } public function testRequiresConfirmation(): void { Functions\expect('wp_trash_post')->never(); $result = $this->ability(Mockery::mock(ChangeLog::class))->execute(['post_id' => 5]); self::assertSame('lit_confirm_required', $result->get_error_code()); } public function testMovesToTrashNeverDeletes(): void { Functions\expect('wp_trash_post')->once()->with(5)->andReturn(new WP_Post(['ID' => 5])); Functions\expect('wp_delete_post')->never(); $log = Mockery::mock(ChangeLog::class); $log->expects('record')->with('lit/post-trash', 'page', '5', '"Alt" in den Papierkorb gelegt', null)->andReturn(2); $result = $this->ability($log)->execute(['post_id' => 5, 'confirm' => true]); self::assertSame('trashed', $result['changed'][0]['action']); self::assertStringContainsString('Papierkorb', $result['summary']); } public function testRefusesWhenTheTrashIsDisabledInsteadOfDeleting(): void { Functions\when('get_post')->justReturn(new WP_Post(['ID' => 5, 'post_type' => 'page', 'post_status' => 'publish'])); Functions\when('current_user_can')->justReturn(true); Functions\expect('wp_trash_post')->never(); $schema = Mockery::mock(ContentSchema::class); $schema->allows('isManaged')->andReturn(true); $ability = new PostTrashAbility($schema, Mockery::mock(ChangeLog::class), static fn (): bool => false); $result = $ability->execute(['post_id' => 5, 'confirm' => true]); self::assertSame('lit_unsupported', $result->get_error_code()); } public function testAnAlreadyTrashedPostIsANoOp(): void { $ability = $this->ability(Mockery::mock(ChangeLog::class)); Functions\when('get_post')->justReturn(new WP_Post(['ID' => 5, 'post_type' => 'page', 'post_title' => 'Alt', 'post_status' => 'trash'])); Functions\expect('wp_trash_post')->never(); $result = $ability->execute(['post_id' => 5, 'confirm' => true]); self::assertSame([], $result['changed']); self::assertStringContainsString('bereits im Papierkorb', $result['summary']); } public function testIsDestructiveAndIndirect(): void { $ability = $this->ability(Mockery::mock(ChangeLog::class)); self::assertTrue($ability->annotations()['destructive']); self::assertFalse($ability->isDirect()); } }