create(); Recording::query()->create([ 'user_id' => $user->id, 'title' => 'Pocket note', 'original_filename' => 'note.mp3', 'file_path' => 'recordings/note.mp3', 'file_size_bytes' => 1024, 'transcription_status' => 'done', 'transcript' => 'hello world', ]); $this->actingAs($user) ->get(route('recordings.index')) ->assertOk() ->assertSeeLivewire(Index::class) ->assertSee('Pocket note'); } public function test_search_filters_recordings(): void { $user = User::factory()->create(); $this->actingAs($user); Recording::query()->create([ 'user_id' => $user->id, 'title' => 'Office chat', 'original_filename' => 'office.mp3', 'file_path' => 'recordings/office.mp3', 'file_size_bytes' => 100, 'transcription_status' => 'done', 'transcript' => 'talking about the pocket recorder today', ]); Recording::query()->create([ 'user_id' => $user->id, 'title' => 'Unrelated', 'original_filename' => 'other.mp3', 'file_path' => 'recordings/other.mp3', 'file_size_bytes' => 100, 'transcription_status' => 'done', 'transcript' => 'nothing useful', ]); Livewire::test(Index::class) ->set('search', 'pocket recorder') ->assertSee('Office chat') ->assertDontSee('Unrelated'); } public function test_queue_pending_dispatches_jobs(): void { Bus::fake(); $user = User::factory()->create(); $this->actingAs($user); Recording::query()->create([ 'user_id' => $user->id, 'title' => 'Needs work', 'original_filename' => 'needs.mp3', 'file_path' => 'recordings/needs.mp3', 'file_size_bytes' => 100, 'transcription_status' => 'pending', ]); Livewire::test(Index::class) ->call('queuePending'); Bus::assertDispatched(TranscribeRecording::class, 1); } public function test_user_can_delete_recording_from_index(): 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 from list', 'original_filename' => 'delete-me.mp3', 'file_path' => 'recordings/delete-me.mp3', 'file_size_bytes' => 5, 'transcription_status' => 'done', ]); Livewire::test(Index::class) ->assertSee('Delete from list') ->call('delete', $recording->id) ->assertDontSee('Delete from list'); $this->assertDatabaseMissing('recordings', ['id' => $recording->id]); Storage::disk('local')->assertMissing('recordings/delete-me.mp3'); } public function test_user_cannot_delete_another_users_recording_from_index(): void { Storage::fake('local'); $owner = User::factory()->create(); $intruder = User::factory()->create(); $recording = Recording::query()->create([ 'user_id' => $owner->id, 'title' => 'Keep me', 'original_filename' => 'keep.mp3', 'file_path' => 'recordings/keep.mp3', 'file_size_bytes' => 10, 'transcription_status' => 'done', ]); $this->actingAs($intruder); try { Livewire::test(Index::class) ->call('delete', $recording->id); $this->fail('Expected deleting another user\'s recording to fail.'); } catch (ModelNotFoundException) { // Owned-query findOrFail hides other users' recordings. } $this->assertDatabaseHas('recordings', ['id' => $recording->id]); } }