Files
weval-consulting/nonreg-old-v2.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,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')}
// 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>