seed(CatalogoSeeder::class); $pvc = Sistema::where('codice', 'pvc')->firstOrFail(); $this->assertSame(28, $pvc->modelli()->count()); $finestra = $pvc->modelli()->where('codice', 'finestra_1_anta')->firstOrFail(); $this->assertSame('FINESTRA 1 ANTA, A/R', $finestra->descrizione); Storage::disk('public')->assertExists($finestra->icona); // Modelli presenti solo nell'Excel: senza asset 3D, quindi disattivi. $this->assertFalse($pvc->modelli()->where('codice', 'scorrevole_hst_4_ante')->value('attivo')); } public function test_il_seeder_non_sovrascrive_le_modifiche_admin(): void { $this->seed(CatalogoSeeder::class); Modello::where('codice', 'bilico')->update(['nome' => 'Bilico modificato']); $this->seed(CatalogoSeeder::class); $this->assertSame('Bilico modificato', Modello::where('codice', 'bilico')->value('nome')); $this->assertSame(28, Modello::count()); } public function test_api_sistemi_espone_solo_modelli_attivi_e_con_listino_in_ordine(): void { $this->seed(CatalogoSeeder::class); // Senza listino il bilico non compare nel configuratore. Modello::where('codice', '!=', 'bilico')->each(fn (Modello $m) => ListinoPrezzo::create(['modello_id' => $m->id, 'larghezza' => 1000, 'altezza' => 1000, 'prezzo' => 100])); Sistema::create(['codice' => 'legno', 'nome' => 'Legno', 'attivo' => false]); $this->conModelli3d(); // Senza modello 3D la finestra a 2 ante non compare nel configuratore. Modello::where('codice', 'finestra_2_ante')->update(['modello_3d_draco' => null]); $response = $this->getJson('/api/sistemi')->assertOk(); $response->assertJsonCount(1); $response->assertJsonPath('0.codice', 'pvc'); $modelli = collect($response->json('0.modelli')); $this->assertSame(24, $modelli->count()); $this->assertNotContains('bilico', $modelli->pluck('id')); $this->assertNotContains('finestra_2_ante', $modelli->pluck('id')); $this->assertSame('finestra_1_anta', $modelli->first()['id']); $this->assertNotContains('scorrevole_hst_4_ante', $modelli->pluck('id')); $this->assertStringEndsWith('/storage/modelli/icone/pvc/finestra_1_anta.jpg', $modelli->first()['icona']); $this->assertStringEndsWith('/api/media/modelli-3d/draco/test.glb', $modelli->first()['modello_url']); } public function test_configurazione_di_un_modello_senza_listino_restituisce_404(): void { $this->seed(CatalogoSeeder::class); $this->getJson('/api/sistemi/pvc/modelli/bilico/configurazione')->assertNotFound(); } public function test_api_sistema_inesistente_restituisce_404(): void { $this->getJson('/api/sistemi/inesistente')->assertNotFound(); } }