justReturn(new WP_Post(['ID' => 5, 'post_type' => 'post', 'post_title' => 'News', 'post_status' => 'draft'])); Functions\when('current_user_can')->justReturn(true); Functions\when('wp_timezone')->justReturn(new DateTimeZone('Europe/Berlin')); 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'); } private function ability(ChangeLog $log): PostScheduleAbility { $schema = Mockery::mock(ContentSchema::class); $schema->allows('isManaged')->andReturn(true); return new PostScheduleAbility($schema, $log); } public function testSchedulesWithLocalAndGmtDates(): void { Functions\expect('wp_update_post')->once()->with([ 'ID' => 5, 'post_status' => 'future', 'post_date' => '2099-06-01 09:30:00', 'post_date_gmt' => '2099-06-01 07:30:00', 'edit_date' => true, ], true)->andReturn(5); Functions\when('get_post_status')->justReturn('future'); $log = Mockery::mock(ChangeLog::class); $log->expects('record')->andReturn(4); $result = $this->ability($log)->execute(['post_id' => 5, 'date' => '2099-06-01 09:30']); self::assertSame('scheduled', $result['changed'][0]['action']); self::assertStringContainsString('2099-06-01 09:30', $result['summary']); } public function testAHookThrowingDuringTheWriteIsAPartialWrite(): void { Functions\when('wp_update_post')->alias(static function (): void { throw new RuntimeException('save_post-Hook kaputt'); }); $log = Mockery::mock(ChangeLog::class); $log->expects('recordPartial')->with('lit/post-schedule', 'post', '5', Mockery::type('string')); try { $this->ability($log)->execute(['post_id' => 5, 'date' => '2099-06-01 09:30']); 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()); } } public function testATrashedPostIsRefused(): void { Functions\when('get_post')->justReturn(new WP_Post(['ID' => 5, 'post_type' => 'post', 'post_status' => 'trash'])); Functions\expect('wp_update_post')->never(); $result = $this->ability(Mockery::mock(ChangeLog::class))->execute(['post_id' => 5, 'date' => '2099-06-01 09:30']); self::assertSame('lit_validation_failed', $result->get_error_code()); } public function testPastAndImpossibleDatesAreRejected(): void { Functions\expect('wp_update_post')->never(); $ability = $this->ability(Mockery::mock(ChangeLog::class)); $past = $ability->execute(['post_id' => 5, 'date' => '2020-01-01 10:00']); $impossible = $ability->execute(['post_id' => 5, 'date' => '2099-13-45 10:00']); self::assertSame('lit_validation_failed', $past->get_error_code()); self::assertStringContainsString('Zukunft', $past->get_error_message()); self::assertSame('lit_validation_failed', $impossible->get_error_code()); } }