Consume faster-whisper SSE instead of blocking on one JSON response, persist growing text and progress over Reverb, and drop the fake percent heartbeat.
164 lines
5.5 KiB
PHP
164 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Recordings;
|
|
|
|
use App\Livewire\Recordings\Show;
|
|
use App\Models\Recording;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Livewire\Livewire;
|
|
use Tests\TestCase;
|
|
|
|
class ShowTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
public function test_show_page_renders_as_livewire(): void
|
|
{
|
|
$user = User::factory()->create();
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'Show me',
|
|
'original_filename' => 'show.mp3',
|
|
'file_path' => 'recordings/show.mp3',
|
|
'file_size_bytes' => 100,
|
|
'transcription_status' => 'done',
|
|
'transcript' => 'Finished text',
|
|
]);
|
|
|
|
$this->actingAs($user)
|
|
->get(route('recordings.show', $recording))
|
|
->assertOk()
|
|
->assertSeeLivewire(Show::class)
|
|
->assertSee('Show me')
|
|
->assertSee('Play', false);
|
|
}
|
|
|
|
public function test_user_can_delete_own_recording(): void
|
|
{
|
|
Storage::fake('local');
|
|
Storage::disk('local')->put('recordings/delete-me.mp3', 'bytes');
|
|
|
|
$user = User::factory()->create();
|
|
$this->actingAs($user);
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'Delete me',
|
|
'original_filename' => 'delete-me.mp3',
|
|
'file_path' => 'recordings/delete-me.mp3',
|
|
'file_size_bytes' => 5,
|
|
'transcription_status' => 'done',
|
|
]);
|
|
|
|
Livewire::test(Show::class, ['recording' => $recording])
|
|
->call('delete')
|
|
->assertRedirect(route('recordings.index'));
|
|
|
|
$this->assertDatabaseMissing('recordings', ['id' => $recording->id]);
|
|
}
|
|
|
|
public function test_show_polls_while_transcription_is_active(): void
|
|
{
|
|
$user = User::factory()->create();
|
|
$this->actingAs($user);
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'In progress',
|
|
'original_filename' => 'active.mp3',
|
|
'file_path' => 'recordings/active.mp3',
|
|
'file_size_bytes' => 100,
|
|
'transcription_status' => 'processing',
|
|
'transcription_progress' => 'Queued — waiting to start…',
|
|
'transcription_percent' => null,
|
|
'transcription_driver' => 'local',
|
|
'transcription_started_at' => now(),
|
|
]);
|
|
|
|
Livewire::test(Show::class, ['recording' => $recording])
|
|
->assertSee('wire:poll', false)
|
|
->assertSee('Queued — waiting to start…');
|
|
}
|
|
|
|
public function test_show_page_includes_partial_transcript_while_processing(): void
|
|
{
|
|
$user = User::factory()->create();
|
|
$this->actingAs($user);
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'Live words',
|
|
'original_filename' => 'active.mp3',
|
|
'file_path' => 'recordings/active.mp3',
|
|
'file_size_bytes' => 100,
|
|
'transcription_status' => 'processing',
|
|
'transcription_progress' => 'Transcribing locally…',
|
|
'transcription_percent' => 62,
|
|
'transcription_driver' => 'local',
|
|
'transcription_started_at' => now(),
|
|
'transcript' => 'Live partial sentence from whisper',
|
|
]);
|
|
|
|
Livewire::test(Show::class, ['recording' => $recording])
|
|
->assertSee('Live partial sentence from whisper')
|
|
->assertSee('status.transcript', false);
|
|
}
|
|
|
|
public function test_show_does_not_poll_when_transcription_is_idle(): void
|
|
{
|
|
$user = User::factory()->create();
|
|
$this->actingAs($user);
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'Finished',
|
|
'original_filename' => 'done.mp3',
|
|
'file_path' => 'recordings/done.mp3',
|
|
'file_size_bytes' => 100,
|
|
'transcription_status' => 'done',
|
|
'transcript' => 'all done',
|
|
]);
|
|
|
|
Livewire::test(Show::class, ['recording' => $recording])
|
|
->assertDontSee('wire:poll', false);
|
|
}
|
|
|
|
public function test_show_refreshes_recording_on_transcription_broadcast(): void
|
|
{
|
|
$user = User::factory()->create();
|
|
$this->actingAs($user);
|
|
|
|
$recording = Recording::query()->create([
|
|
'user_id' => $user->id,
|
|
'title' => 'Live update',
|
|
'original_filename' => 'live.mp3',
|
|
'file_path' => 'recordings/live.mp3',
|
|
'file_size_bytes' => 100,
|
|
'transcription_status' => 'pending',
|
|
'transcription_progress' => 'Queued — waiting to start…',
|
|
'transcription_driver' => 'local',
|
|
'transcription_started_at' => now(),
|
|
]);
|
|
|
|
$component = Livewire::test(Show::class, ['recording' => $recording]);
|
|
|
|
$recording->update([
|
|
'transcription_status' => 'processing',
|
|
'transcription_progress' => 'Transcribing locally…',
|
|
'transcription_percent' => 40,
|
|
]);
|
|
|
|
$component
|
|
->call('onTranscriptionUpdated', [
|
|
'id' => $recording->id,
|
|
'status' => 'processing',
|
|
])
|
|
->assertSet('recording.transcription_status', 'processing')
|
|
->assertSet('recording.transcription_percent', 40)
|
|
->assertSee('Transcribing locally…');
|
|
}
|
|
}
|