create(); $workspace = Workspace::factory()->create(); $workspace->users()->attach($user, ['role' => 'owner']); $client = Client::factory()->create(['workspace_id' => $workspace->id]); $declaration = Declaration::factory()->create([ 'workspace_id' => $workspace->id, 'client_id' => $client->id, ]); Storage::fake('public'); $file = UploadedFile::fake()->create('document.pdf', 100, 'application/pdf'); $media = $declaration->addMedia($file)->toMediaCollection('documents'); return [$user, $workspace, $declaration, $media]; } test('downloading creates a media download record', function () { [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia(); session(['current_workspace_id' => $workspace->id]); $this->actingAs($user)->get(route('declarations.media.download', [ 'declaration' => $declaration, 'mediaId' => $media->id, ])); $download = MediaDownload::query() ->where('media_id', $media->id) ->where('user_id', $user->id) ->first(); expect($download)->not->toBeNull(); expect($download->downloaded_at)->not->toBeNull(); }); test('re-downloading updates timestamp without creating duplicates', function () { [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia(); session(['current_workspace_id' => $workspace->id]); $this->actingAs($user)->get(route('declarations.media.download', [ 'declaration' => $declaration, 'mediaId' => $media->id, ])); $firstDownload = MediaDownload::query() ->where('media_id', $media->id) ->where('user_id', $user->id) ->first(); $firstTimestamp = $firstDownload->downloaded_at; $this->travel(5)->minutes(); $this->actingAs($user)->get(route('declarations.media.download', [ 'declaration' => $declaration, 'mediaId' => $media->id, ])); $count = MediaDownload::query() ->where('media_id', $media->id) ->where('user_id', $user->id) ->count(); expect($count)->toBe(1); $firstDownload->refresh(); expect($firstDownload->downloaded_at->gt($firstTimestamp))->toBeTrue(); }); test('download status is per-user in show endpoint', function () { [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia(); $otherUser = User::factory()->create(); $workspace->users()->attach($otherUser, ['role' => 'manager']); session(['current_workspace_id' => $workspace->id]); MediaDownload::query()->create([ 'media_id' => $media->id, 'user_id' => $user->id, 'downloaded_at' => now(), ]); $response = $this->actingAs($user)->get(route('declarations.show', $declaration)); $response->assertOk(); $documents = $response->original->getData()['page']['props']['documents']; $doc = collect($documents)->firstWhere('id', $media->id); expect($doc['is_downloaded'])->toBeTrue(); $response2 = $this->actingAs($otherUser)->get(route('declarations.show', $declaration)); $response2->assertOk(); $documents2 = $response2->original->getData()['page']['props']['documents']; $doc2 = collect($documents2)->firstWhere('id', $media->id); expect($doc2['is_downloaded'])->toBeFalse(); });