create(); $user->refresh(); // Ensure no Avatar row exists so the internal firstOrFail() throws. Avatar::whereProfileId($user->profile_id)->delete(); Storage::fake('local'); Passport::actingAs($user, ['write']); $this->postJson('/api/v1/avatar/update', [ 'upload' => UploadedFile::fake()->image('avatar.jpg', 200, 200), ]) ->assertStatus(500) ->assertJsonFragment(['code' => 500]) ->assertJsonMissing(['msg' => 'Avatar successfully updated']); }); it('updates the avatar with a valid upload', function () { $user = User::factory()->create(); $user->refresh(); Avatar::updateOrCreate( ['profile_id' => $user->profile_id], ['media_path' => 'public/avatars/default.jpg', 'change_count' => 0] ); Storage::fake('local'); Passport::actingAs($user, ['write']); $this->postJson('/api/v1/avatar/update', [ 'upload' => UploadedFile::fake()->image('avatar.jpg', 200, 200), ]) ->assertOk() ->assertJsonFragment(['msg' => 'Avatar successfully updated']); }); it('rejects a non-image upload with a validation error', function () { $user = User::factory()->create(); $user->refresh(); Storage::fake('local'); Passport::actingAs($user, ['write']); $this->postJson('/api/v1/avatar/update', [ 'upload' => UploadedFile::fake()->create('malware.pdf', 100, 'application/pdf'), ]) ->assertStatus(422); }); });