170 lines
8.8 KiB
HTML
170 lines
8.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
<title>WEVAL — Master Test Report</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root{--bg:#080b12;--surface:rgba(255,255,255,.03);--border:rgba(255,255,255,.06);--text:#94a3b8;--white:#f1f5f9;--accent:#6366f1;--teal:#00c896;--red:#ef4444;--gold:#f0c674;--r:12px}
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{font-family:"Outfit",system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:15px;min-height:100vh}
|
|
.wrap{max-width:1200px;margin:0 auto;padding:1.5rem 4%}
|
|
.hero{text-align:center;padding:2rem 0 1.5rem}
|
|
.badge{display:inline-block;background:rgba(99,102,241,.1);color:var(--accent);padding:6px 18px;border-radius:20px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:.8rem}
|
|
h1{font-size:1.8rem;font-weight:800;color:var(--white);margin-bottom:.3rem}
|
|
h1 em{color:var(--teal);font-style:normal}
|
|
.sub{color:var(--text);font-size:.85rem;margin-bottom:1.5rem}
|
|
.tabs{display:flex;gap:0;justify-content:center;margin-bottom:1.5rem;background:var(--surface);border:1px solid var(--border);border-radius:var(--r);overflow:hidden;max-width:600px;margin-left:auto;margin-right:auto}
|
|
.tab{flex:1;padding:.7rem 1rem;text-align:center;cursor:pointer;font-weight:600;font-size:.85rem;color:var(--text);transition:all .2s;border:none;background:transparent}
|
|
.tab:hover{color:var(--white);background:rgba(99,102,241,.1)}
|
|
.tab.active{background:var(--accent);color:#fff}
|
|
.tab .count{font-family:"Space Mono";font-size:.7rem;margin-left:.3rem;opacity:.7}
|
|
.panel{display:none}
|
|
.panel.active{display:block}
|
|
.stats{display:flex;gap:.8rem;justify-content:center;flex-wrap:wrap;margin-bottom:1.5rem}
|
|
.stat{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);padding:.6rem 1.2rem;text-align:center}
|
|
.stat-num{font-family:"Space Mono";font-size:1.5rem;font-weight:700;color:var(--white)}
|
|
.stat-label{font-size:.65rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text)}
|
|
.stat.pass .stat-num{color:var(--teal)}
|
|
.stat.fail .stat-num{color:var(--red)}
|
|
.stat.warn .stat-num{color:var(--gold)}
|
|
/* NonReg output */
|
|
.output{font-family:"Space Mono",monospace;font-size:12px;line-height:1.7;white-space:pre-wrap;word-break:break-word;padding:1rem;background:rgba(0,0,0,.3);border:1px solid var(--border);border-radius:var(--r);max-height:600px;overflow-y:auto}
|
|
.output .pass{color:var(--teal)}.output .fail{color:var(--red)}.output .warn{color:var(--gold)}.output .section{color:var(--accent);font-weight:700}
|
|
/* Iframe panel */
|
|
.iframe-wrap{border:1px solid var(--border);border-radius:var(--r);overflow:hidden;background:#f8fafc}
|
|
.iframe-wrap iframe{width:100%;height:80vh;border:none}
|
|
/* Run button */
|
|
.run-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--accent);color:#fff;border:none;padding:.6rem 1.5rem;border-radius:8px;font-weight:600;font-size:.85rem;cursor:pointer;margin-bottom:1rem;transition:all .2s}
|
|
.run-btn:hover{background:#4f46e5;transform:translateY(-1px)}
|
|
.run-btn:disabled{opacity:.5;cursor:not-allowed}
|
|
.run-btn .spinner{display:none;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}
|
|
.run-btn.loading .spinner{display:inline-block}
|
|
@keyframes spin{to{transform:rotate(360deg)}}
|
|
/* Timestamp */
|
|
.ts{font-size:.7rem;color:var(--text);text-align:center;margin-top:.5rem;font-family:"Space Mono"}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="wrap">
|
|
<div class="hero">
|
|
<div class="badge">Quality Assurance</div>
|
|
<h1>WEVAL <em>Master Test Report</em></h1>
|
|
<div class="sub">NonReg + Visual + Auth + Overlap — weval-consulting.com</div>
|
|
</div>
|
|
|
|
<div class="tabs">
|
|
<div class="tab active" onclick="showTab('nonreg')">🧪 NonReg <span class="count" id="nr-count">—</span></div>
|
|
<div class="tab" onclick="showTab('visual')">📸 Visual <span class="count" id="vs-count">—</span></div>
|
|
<div class="tab" onclick="showTab('auth')">🔐 Auth <span class="count" id="au-count">—</span></div>
|
|
</div>
|
|
|
|
<!-- NONREG PANEL -->
|
|
<div class="panel active" id="p-nonreg">
|
|
<div style="text-align:center">
|
|
<button class="run-btn" id="btn-nonreg" onclick="runNonreg()"><span class="spinner"></span>▶ Lancer NonReg</button>
|
|
<button class="run-btn" onclick="runVisualTest()" style="background:#0ea5e9">📸 Lancer Visual Test</button>
|
|
</div>
|
|
<div class="stats" id="nr-stats"></div>
|
|
<div class="output" id="nr-output">Cliquez "Lancer NonReg" pour exécuter les tests...</div>
|
|
<div class="ts" id="nr-ts"></div>
|
|
</div>
|
|
|
|
<!-- VISUAL PANEL -->
|
|
<div class="panel" id="p-visual">
|
|
<div style="text-align:center;margin-bottom:1rem">
|
|
<button class="run-btn" onclick="runVisualTest()" style="background:#0ea5e9"><span class="spinner"></span>📸 Re-lancer Visual Test</button>
|
|
</div>
|
|
<div class="iframe-wrap">
|
|
<iframe id="if-visual" src="/test-report/visual-report.html" loading="lazy"></iframe>
|
|
</div>
|
|
<div class="ts" id="vs-ts">Dernier rapport chargé</div>
|
|
</div>
|
|
|
|
<!-- AUTH PANEL -->
|
|
<div class="panel" id="p-auth">
|
|
<div class="iframe-wrap">
|
|
<iframe id="if-auth" src="/test-report/auth-report.html" loading="lazy"></iframe>
|
|
</div>
|
|
<div class="ts" id="au-ts">Dernier rapport chargé</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function showTab(id){
|
|
document.querySelectorAll('.tab').forEach((t,i)=>t.classList.toggle('active',['nonreg','visual','auth'][i]===id));
|
|
document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));
|
|
document.getElementById('p-'+id).classList.add('active');
|
|
}
|
|
|
|
async function runNonreg(){
|
|
var btn=document.getElementById('btn-nonreg');
|
|
btn.classList.add('loading');btn.disabled=true;
|
|
document.getElementById('nr-output').textContent='⏳ Tests en cours...\n';
|
|
try{
|
|
var r=await fetch('/api/nonreg-master.php',{credentials:'include'});
|
|
var text=await r.text();
|
|
var out=document.getElementById('nr-output');
|
|
// Parse and colorize
|
|
var lines=text.split('\n');
|
|
var pass=0,fail=0,warn=0;
|
|
var html='';
|
|
lines.forEach(function(l){
|
|
if(l.includes('✅')||l.includes('PASS')){html+='<span class="pass">'+esc(l)+'</span>\n';pass++;}
|
|
else if(l.includes('❌')||l.includes('FAIL')){html+='<span class="fail">'+esc(l)+'</span>\n';fail++;}
|
|
else if(l.includes('⚠')||l.includes('WARN')){html+='<span class="warn">'+esc(l)+'</span>\n';warn++;}
|
|
else if(l.startsWith('===')||l.startsWith('---')){html+='<span class="section">'+esc(l)+'</span>\n';}
|
|
else{html+=esc(l)+'\n';}
|
|
});
|
|
out.innerHTML=html;
|
|
document.getElementById('nr-stats').innerHTML=
|
|
'<div class="stat pass"><div class="stat-num">'+pass+'</div><div class="stat-label">Pass</div></div>'+
|
|
'<div class="stat fail"><div class="stat-num">'+fail+'</div><div class="stat-label">Fail</div></div>'+
|
|
'<div class="stat warn"><div class="stat-num">'+warn+'</div><div class="stat-label">Warn</div></div>'+
|
|
'<div class="stat"><div class="stat-num">'+(pass+fail+warn)+'</div><div class="stat-label">Total</div></div>';
|
|
document.getElementById('nr-count').textContent=pass+'/'+(pass+fail+warn);
|
|
document.getElementById('nr-ts').textContent='Exécuté: '+new Date().toLocaleString('fr-FR');
|
|
}catch(e){
|
|
document.getElementById('nr-output').textContent='❌ Erreur: '+e.message;
|
|
}
|
|
btn.classList.remove('loading');btn.disabled=false;
|
|
}
|
|
|
|
async function runVisualTest(){
|
|
alert('Visual test lancé en background sur S204.\nDurée estimée: ~2 minutes.\nLe rapport se mettra à jour automatiquement.');
|
|
try{
|
|
await fetch('/api/cx',{method:'POST',body:'k=WEVADS2026&c='+btoa('cd /opt && python3 weval-visual-test.py && cp /tmp/weval-visual-report.html /var/www/html/test-report/visual-report.html'),headers:{'Content-Type':'application/x-www-form-urlencoded'}});
|
|
setTimeout(function(){document.getElementById('if-visual').src='/test-report/visual-report.html?t='+Date.now()},150000);
|
|
}catch(e){}
|
|
}
|
|
|
|
function esc(s){return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')}
|
|
|
|
// Auto-count visual/auth reports
|
|
setTimeout(function(){
|
|
try{
|
|
var vf=document.getElementById('if-visual');
|
|
vf.onload=function(){
|
|
try{
|
|
var d=vf.contentDocument;
|
|
var p=d.querySelectorAll('.bp,[class*=pass]').length;
|
|
var f=d.querySelectorAll('.bf,[class*=fail]').length;
|
|
document.getElementById('vs-count').textContent=p+'/'+(p+f);
|
|
}catch(e){}
|
|
};
|
|
var af=document.getElementById('if-auth');
|
|
af.onload=function(){
|
|
try{
|
|
var d=af.contentDocument;
|
|
var p=d.querySelectorAll('.bp,[class*=pass]').length;
|
|
var f=d.querySelectorAll('.bf,[class*=fail]').length;
|
|
document.getElementById('au-count').textContent=p+'/'+(p+f);
|
|
}catch(e){}
|
|
};
|
|
}catch(e){}
|
|
},2000);
|
|
</script>
|
|
</body>
|
|
</html>
|