seed(RolesAndPermissionsSeeder::class); $admin = User::factory()->create(['is_active' => true]); $admin->assignRole('admin'); $this->actingAs($admin); }); test('admin editor exposes the KI check button and modal', function () { /** @var TestCase $this */ $pressRelease = PressRelease::factory()->create(['status' => PressReleaseStatus::Review->value]); LivewireVolt::test('admin.press-releases.edit', ['id' => $pressRelease->id]) ->assertSee('Prüfung') ->assertSee('Prüfung im Hintergrund starten'); }); test('runKiCheck dispatches a non-routing classification job with provider override', function () { /** @var TestCase $this */ Queue::fake(); $pressRelease = PressRelease::factory()->create(['status' => PressReleaseStatus::Review->value]); LivewireVolt::test('admin.press-releases.edit', ['id' => $pressRelease->id]) ->set('kiProvider', 'deterministic') ->call('runKiCheck') ->assertHasNoErrors(); Queue::assertPushedOn('classification', ClassifyPressRelease::class, function (ClassifyPressRelease $job) use ($pressRelease) { return $job->pressReleaseId === $pressRelease->id && $job->route === false && $job->providerOverride === 'deterministic'; }); }); test('runKiCheck dispatches a scoring job when content score is selected', function () { /** @var TestCase $this */ Queue::fake(); $pressRelease = PressRelease::factory()->create(['status' => PressReleaseStatus::Review->value]); LivewireVolt::test('admin.press-releases.edit', ['id' => $pressRelease->id]) ->set('kiRunClassification', false) ->set('kiRunContentScore', true) ->call('runKiCheck') ->assertHasNoErrors(); Queue::assertPushed(ScorePressRelease::class, fn (ScorePressRelease $job) => $job->pressReleaseId === $pressRelease->id); Queue::assertNotPushed(ClassifyPressRelease::class); }); test('runKiCheck does nothing when no check is selected', function () { /** @var TestCase $this */ Queue::fake(); $pressRelease = PressRelease::factory()->create(['status' => PressReleaseStatus::Review->value]); LivewireVolt::test('admin.press-releases.edit', ['id' => $pressRelease->id]) ->set('kiRunClassification', false) ->call('runKiCheck') ->assertHasNoErrors(); Queue::assertNothingPushed(); }); test('a non-routing classification job updates the verdict but leaves the status unchanged', function () { /** @var TestCase $this */ config()->set('scoring.classification.provider', 'deterministic'); config()->set('blacklist.words', ['penis']); // Rote Einstufung, aber als Re-Check ohne Routing: Status bleibt published. $pressRelease = PressRelease::factory()->published()->create([ 'title' => 'Titel penis', 'text' => 'Inhalt', ]); (new ClassifyPressRelease($pressRelease->id, route: false))->handle( app(ClassificationManager::class), app(PressReleaseService::class), ); $fresh = $pressRelease->fresh(); expect($fresh->classification)->toBe(PressReleaseClassification::Red); expect($fresh->status)->toBe(PressReleaseStatus::Published); });