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

335 lines
8.4 KiB
Markdown
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**:
```bash
# 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)**:
```sql
-- 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**:
```php
// 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**:
```html
<!-- 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**:
```css
/* 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**:
```javascript
// 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**:
```javascript
// 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**:
```php
// 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**:
```php
// 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**:
```bash
#!/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**:
```bash
#!/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**:
```javascript
// 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**
```bash
cd /var/www/netgescon
php artisan tinker --execute="echo 'Stabili: ' . \App\Models\Stabile::count();"
```
### 🧪 **TESTX: Interface**
```bash
curl -I http://192.168.0.200:8000/admin/stabili/1/show
```
### 🧪 **TESTX: Assets**
```bash
cd /var/www/netgescon && ls -la public/build/assets/
```
### 🧪 **TESTX: Performance**
```bash
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**