errorLog = (string) tempnam(sys_get_temp_dir(), 'lit-mcp-log'); $this->previousLog = ini_set('error_log', $this->errorLog); } protected function tearDown(): void { ini_set('error_log', (string) $this->previousLog); unlink($this->errorLog); parent::tearDown(); } public function testRunsTheHookLogsAndBuildsTheResult(): void { $post = new WP_Post(['ID' => 5, 'post_title' => 'Team']); Actions\expectDone('lit_mcp_after_save')->once()->with(5, 'lit/content-update', ['post_id' => 5]); Functions\when('get_post')->justReturn($post); $log = new FakeChangeLog(9); $change = new PostChangeResult('lit/content-update', $log, 5, 'die Änderung', ['vorher']); $change->afterSave(['post_id' => 5]); $updated = $change->reread(); $change->log('page', 'geändert', 811); $result = $change->result('Fertig.', $updated)->toArray(); self::assertSame($post, $updated); self::assertSame('Fertig.', $result['summary']); self::assertSame(Rev::ofPost($post), $result['rev']); self::assertSame(9, $result['log_id']); self::assertSame(['vorher'], $result['warnings']); $log->assertRecorded([ 'ability' => 'lit/content-update', 'object_type' => 'page', 'object_id' => '5', 'summary' => 'geändert', 'revision_id' => 811, ]); } public function testFailuresAfterTheWriteBecomeWarnings(): void { Actions\expectDone('lit_mcp_after_save')->once()->whenHappen(static function (): void { throw new RuntimeException('listener kaputt'); }); Functions\when('get_post')->justReturn(null); $log = new FakeChangeLog(1, new RuntimeException('log kaputt')); $fallback = new WP_Post(['ID' => 5]); $change = new PostChangeResult('lit/post-publish', $log, 5); $change->afterSave([], 'Veröffentlichen'); $updated = $change->reread($fallback); $change->log('page', 'x'); $result = $change->result('ok', $updated)->toArray(); self::assertSame($fallback, $updated); self::assertNull($result['log_id']); self::assertSame([ 'Eine Erweiterung ist nach dem Veröffentlichen auf einen Fehler gestoßen; die Änderung ist gespeichert.', 'Änderungsprotokoll konnte nicht geschrieben werden; die Änderung ist gespeichert.', ], $result['warnings']); self::assertStringContainsString('listener kaputt', (string) file_get_contents($this->errorLog)); $log->assertRecorded([]); } public function testWithoutAReadablePostTheRevIsNull(): void { Functions\when('get_post')->justReturn(null); $change = new PostChangeResult('lit/content-create', FakeChangeLog::forbidden(), 5, 'der Entwurf'); self::assertNull($change->reread()); self::assertNull($change->result('ok', null)->toArray()['rev']); } }