create(); $dynamic = Dynamic::factory()->create(); $dynamic->participants()->attach($user->id, ['role' => 'owner']); $ledger = Ledger::factory()->create(['dynamic_id' => $dynamic->id]); $this->actingAs($user); // 1. Test attaching media to a mutation $file1 = UploadedFile::fake()->create('proof1.jpg', 100); $file2 = UploadedFile::fake()->create('proof2.png', 100); $response = $this->post(route('dynamics.ledgers.mutations.store', [$dynamic, $ledger]), [ 'amount' => 50, 'description' => 'Completed deep clean', 'media' => [$file1, $file2], ]); $response->assertSessionHasNoErrors(); $response->assertRedirect(); $mutation = Mutation::firstWhere('description', 'Completed deep clean'); expect($mutation)->not->toBeNull(); expect($mutation->media)->toHaveCount(2); expect($mutation->media->first()->file_name)->toBe('proof1.jpg'); expect($mutation->media->last()->file_name)->toBe('proof2.png'); Storage::disk('public')->assertExists($mutation->media->first()->file_path); Storage::disk('public')->assertExists($mutation->media->last()->file_path); // 2. Test attaching media to a ledger $file3 = UploadedFile::fake()->create('rules.jpg', 100); $response = $this->post(route('dynamics.ledgers.store', $dynamic), [ 'name' => 'Worship Ledger', 'rules' => 'Specific rules', 'alignment' => 'neutral', 'media' => [$file3], ]); $response->assertSessionHasNoErrors(); $response->assertRedirect(); $newLedger = Ledger::firstWhere('name', 'Worship Ledger'); expect($newLedger)->not->toBeNull(); expect($newLedger->media)->toHaveCount(1); expect($newLedger->media->first()->file_name)->toBe('rules.jpg'); // 3. Test attaching media to a chat message $chat = $dynamic->chat; $file4 = UploadedFile::fake()->create('chat_img.jpg', 100); $response = $this->post(route('chats.messages.store', $chat), [ 'content' => 'Check this out!', 'media' => [$file4], ]); $response->assertRedirect(); $message = Message::firstWhere('content', 'Check this out!'); expect($message)->not->toBeNull(); expect($message->media)->toHaveCount(1); expect($message->media->first()->file_name)->toBe('chat_img.jpg'); });