netgescon-day0/docs/90-UI-interfaccia-unica/TESTING-AUTOMATIZZATO.md

8.4 KiB
Executable File

🧪 NETGESCON TESTING AUTOMATIZZATO

Sistema verifica strutture e funzionalità

📅 Versione: 1.0 - 28 Luglio 2025

🎯 Comando: TESTX: per attivare controlli


🧪 TEST SUITE COMPLETA

🔑 CREDENZIALI SISTEMA:

# Database MySQL
DB_HOST=127.0.0.1
DB_DATABASE=netgescon  
DB_USERNAME=netgescon_user
DB_PASSWORD=NetGescon2024!

# URLs Testing
PROD_URL=http://192.168.0.200:8000
ADMIN_URL=http://192.168.0.200:8000/admin/admin
TEST_STABILE_URL=http://192.168.0.200:8000/admin/stabili/1/show

1. TEST DATABASE STRUTTURE

📊 Verifica Dati Base (Stabile ID: 1):

-- Test esistenza dati critici
SELECT COUNT(*) as tabelle_count FROM tabelle_millesimali WHERE stabile_id = 1;
-- Risultato atteso: >= 24

SELECT COUNT(*) as voci_count FROM voci_spesa WHERE stabile_id = 1;  
-- Risultato atteso: >= 30

SELECT COUNT(*) as unita_count FROM unita_immobiliari WHERE stabile_id = 1;
-- Risultato atteso: >= 50

-- Test integrità relazioni
SELECT s.denominazione, 
       COUNT(DISTINCT tm.id) as tabelle_mill,
       COUNT(DISTINCT vs.id) as voci_spesa,
       COUNT(DISTINCT ui.id) as unita
FROM stabili s
LEFT JOIN tabelle_millesimali tm ON s.id = tm.stabile_id
LEFT JOIN voci_spesa vs ON s.id = vs.stabile_id  
LEFT JOIN unita_immobiliari ui ON s.id = ui.stabile_id
WHERE s.id = 1
GROUP BY s.id;

🔗 Test Relazioni Modelli Laravel:

// Test in artisan tinker
$stabile = \App\Models\Stabile::find(1);

// Test eager loading
$stabile->load(['tabelleMillesimali', 'vociSpesa', 'unitaImmobiliari']);

// Verifica dati caricati
$stabile->tabelleMillesimali->count(); // >= 24
$stabile->vociSpesa->count(); // >= 30
$stabile->unitaImmobiliari->count(); // >= 50

// Test ordinamento
$stabile->tabelleMillesimali->first()->ordinamento; // Non null
$stabile->vociSpesa->first()->ordinamento; // Non null

2. TEST INTERFACCIA MENU STANDARD

🎯 Struttura Tabs Obbligatoria:

<!-- Verifica presenza elementi essenziali -->
<div class="tabs-container" id="verificare-presente">
    <nav class="tab-navigation">
        <a href="#" class="tab-link active">Tab Attivo</a>
    </nav>
    <div class="tab-content" id="content-area">
        <!-- Content deve essere caricato -->
    </div>
</div>

<!-- CSS Classes verificare presenti -->
.tab-link.active { background: attivo; }
.tab-content { display: block; }

📱 Test Responsive Layout:

/* Mobile 320px-768px */
@media (max-width: 768px) {
    .sidebar { transform: translateX(-100%); }
    .content-main { margin-left: 0; }
    .tab-navigation { flex-direction: column; }
}

/* Desktop 1024px+ */
@media (min-width: 1024px) {  
    .sidebar { position: fixed; width: 280px; }
    .content-main { margin-left: 280px; }
    .header { position: fixed; height: 70px; }
    .footer { position: fixed; height: 70px; }
}

3. TEST PERFORMANCE E CARICAMENTO

Metriche Performance Target:

// Test JavaScript caricamento
window.addEventListener('load', function() {
    const loadTime = performance.now();
    console.log('Page Load Time:', loadTime);
    // Target: < 500ms
    
    const tabsCount = document.querySelectorAll('.tab-link').length;
    console.log('Tabs Count:', tabsCount);
    // Target: >= 5 tabs per pagina stabile
    
    const dataRows = document.querySelectorAll('tbody tr').length;
    console.log('Data Rows:', dataRows);  
    // Target: > 0 (dati visibili)
});

🔄 Test AJAX Functionality:

// Verifica navigazione tabs AJAX
function testTabNavigation() {
    const tabs = document.querySelectorAll('.tab-link');
    tabs.forEach(tab => {
        tab.addEventListener('click', function(e) {
            e.preventDefault();
            const targetTab = this.getAttribute('href');
            console.log('Tab clicked:', targetTab);
            // Deve cambiare contenuto senza reload pagina
        });
    });
}

4. TEST SICUREZZA E PERMESSI

🔐 Verifica Autenticazione:

// Test middleware auth
Route::middleware(['auth', 'role:admin'])->group(function () {
    Route::get('/admin/stabili/{stabile}', [StabileController::class, 'show']);
});

// Test controller protezione
public function show(Stabile $stabile) {
    $this->authorize('view', $stabile); // Verifica permesso
    // ... rest of method
}

👤 Test Controllo Accessi:

// Verifica user logged
Auth::check(); // true
Auth::user()->hasRole('admin'); // true per admin
Auth::user()->can('view', $stabile); // true se permesso

// Test session attiva
Session::get('user_id'); // Not null
Session::get('role'); // admin/user/etc

🚨 CHECKLIST TEST COMPLETA

PRE-DEVELOPMENT:

  • Database connection attiva
  • Tabelle esistenti con dati
  • Relazioni modelli funzionanti
  • Layout base caricato

DEVELOPMENT:

  • Controller con eager loading
  • Blade con layout standard
  • CSS classes netgescon
  • JavaScript modulare incluso

POST-DEVELOPMENT:

  • URL accessibile
  • Dati visibili in tabs
  • Responsive mobile/desktop
  • Performance < 500ms
  • JavaScript senza errori
  • CSS rendering corretto

FINAL VALIDATION:

  • Test su browser diversi
  • Test utenti con ruoli diversi
  • Test con dati vuoti/pieni
  • Test mobile/tablet/desktop

🔧 SCRIPT TEST AUTOMATICI

📊 Test Database:

#!/bin/bash
# test-database.sh
cd /var/www/netgescon

echo "=== TEST DATABASE NETGESCON ==="
php artisan tinker --execute="
\$stabile = \App\Models\Stabile::with(['tabelleMillesimali', 'vociSpesa'])->find(1);
echo 'Stabile: ' . \$stabile->denominazione . PHP_EOL;
echo 'Tabelle Millesimali: ' . \$stabile->tabelleMillesimali->count() . PHP_EOL;
echo 'Voci Spesa: ' . \$stabile->vociSpesa->count() . PHP_EOL;
"

🎯 Test Interfaccia:

#!/bin/bash
# test-interface.sh
cd /var/www/netgescon

echo "=== TEST INTERFACCIA NETGESCON ==="
curl -s -o /dev/null -w "%{http_code}" http://192.168.0.200:8000/admin/stabili/1/show
echo "Status Code: HTTP Response"

# Test CSS build
if [ -f "public/build/assets/app.css" ]; then
    echo "✅ CSS Build: OK"
else
    echo "❌ CSS Build: MISSING"
fi

# Test JS build  
if [ -f "public/build/assets/app.js" ]; then
    echo "✅ JS Build: OK"
else
    echo "❌ JS Build: MISSING" 
fi

Test Performance:

// test-performance.js
(function() {
    'use strict';
    
    window.addEventListener('load', function() {
        setTimeout(function() {
            const perf = performance.getEntriesByType('navigation')[0];
            const loadTime = perf.loadEventEnd - perf.loadEventStart;
            
            console.log('=== NETGESCON PERFORMANCE TEST ===');
            console.log('Load Time:', loadTime + 'ms');
            console.log('DOM Ready:', perf.domContentLoadedEventEnd - perf.domContentLoadedEventStart + 'ms');
            
            // Test elementi presenti
            const tabs = document.querySelectorAll('.tab-link').length;
            const dataRows = document.querySelectorAll('tbody tr').length;
            
            console.log('Tabs Count:', tabs);
            console.log('Data Rows:', dataRows);
            
            // Risultato
            if (loadTime < 500 && tabs > 0 && dataRows > 0) {
                console.log('✅ PERFORMANCE TEST: PASSED');
            } else {
                console.log('❌ PERFORMANCE TEST: FAILED');
            }
        }, 100);
    });
})();

🎯 COMANDI RAPIDI TEST

🧪 TESTX: Database

cd /var/www/netgescon
php artisan tinker --execute="echo 'Stabili: ' . \App\Models\Stabile::count();"

🧪 TESTX: Interface

curl -I http://192.168.0.200:8000/admin/stabili/1/show

🧪 TESTX: Assets

cd /var/www/netgescon && ls -la public/build/assets/

🧪 TESTX: Performance

cd /var/www/netgescon && php artisan route:list | grep stabile

📊 REPORTING RISULTATI

TEMPLATE REPORT:

=== NETGESCON TEST REPORT ===
Data: 28/07/2025
Comando: TESTX: [tipo test]

DATABASE:
- Connessione: ✅/❌
- Dati Stabile ID 1: ✅/❌  
- Relazioni: ✅/❌

INTERFACCIA:
- URL Accessibile: ✅/❌
- Layout Corretto: ✅/❌
- Tabs Funzionanti: ✅/❌

PERFORMANCE:
- Load Time: XXXms (Target: <500ms)
- Assets Build: ✅/❌
- JavaScript: ✅/❌

RISULTATO FINALE: PASS/FAIL

🧪 SISTEMA TEST ATTIVO
Usa comando TESTX: per attivare verifiche automatiche