create(); $role = Role::firstOrCreate(['name' => 'ROLE_ADMIN'], ['color' => '#111111']); $admin->roles()->attach($role); return $admin; } it('lists ranks for authenticated users', function (): void { $user = User::factory()->create(); Rank::create(['name' => 'Bronze']); Sanctum::actingAs($user); $response = $this->getJson('/api/ranks'); $response->assertOk(); $response->assertJsonFragment(['name' => 'Bronze']); }); it('creates ranks as admin', function (): void { $admin = makeAdminForRanks(); Sanctum::actingAs($admin); $response = $this->postJson('/api/ranks', [ 'name' => 'Silver', 'badge_type' => 'text', 'badge_text' => 'S', 'color' => '#abcdef', ]); $response->assertStatus(201); $response->assertJsonFragment([ 'name' => 'Silver', 'badge_text' => 'S', ]); }); it('updates ranks and clears badge images when switching to text', function (): void { Storage::fake('public'); $admin = makeAdminForRanks(); $rank = Rank::create([ 'name' => 'Gold', 'badge_type' => 'image', 'badge_text' => null, 'badge_image_path' => 'rank-badges/old.png', 'color' => '#ffaa00', ]); Storage::disk('public')->put('rank-badges/old.png', 'old'); Sanctum::actingAs($admin); $response = $this->patchJson("/api/ranks/{$rank->id}", [ 'name' => 'Gold', 'badge_type' => 'text', 'badge_text' => 'G', 'color' => '#ffaa00', ]); $response->assertOk(); Storage::disk('public')->assertMissing('rank-badges/old.png'); }); it('uploads a rank badge image', function (): void { Storage::fake('public'); $admin = makeAdminForRanks(); $rank = Rank::create(['name' => 'Platinum']); Sanctum::actingAs($admin); $response = $this->postJson("/api/ranks/{$rank->id}/badge-image", [ 'file' => UploadedFile::fake()->image('badge.png', 50, 50), ]); $response->assertOk(); $response->assertJsonFragment(['badge_type' => 'image']); }); it('deletes ranks as admin', function (): void { Storage::fake('public'); $admin = makeAdminForRanks(); $rank = Rank::create([ 'name' => 'ToDelete', 'badge_type' => 'image', 'badge_image_path' => 'rank-badges/delete.png', ]); Storage::disk('public')->put('rank-badges/delete.png', 'old'); Sanctum::actingAs($admin); $response = $this->deleteJson("/api/ranks/{$rank->id}"); $response->assertStatus(204); Storage::disk('public')->assertMissing('rank-badges/delete.png'); $this->assertDatabaseMissing('ranks', ['id' => $rank->id]); });