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_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…'); } }