Files
html/nonreg.html
opus d5edaa769c
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-sync via WEVIA git_sync_all intent 2026-04-21T14:56:43+02:00
2026-04-21 14:56:43 +02:00

264 lines
14 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:1400px;margin:0 auto;padding:1rem 2%}
.hero{text-align:center;padding:1.2rem 0 1rem}
.badge{display:inline-block;background:rgba(99,102,241,.1);color:var(--accent);padding:5px 14px;border-radius:20px;font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;margin-bottom:.5rem}
h1{font-size:1.5rem;font-weight:800;color:var(--white);margin-bottom:.2rem}
h1 em{color:var(--teal);font-style:normal}
.sub{color:var(--text);font-size:.8rem}
.tabs{display:flex;gap:0;margin:1rem 0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r);overflow-x:auto;-webkit-overflow-scrolling:touch}
.tab{flex:none;padding:.55rem .8rem;text-align:center;cursor:pointer;font-weight:600;font-size:.75rem;color:var(--text);transition:all .2s;border:none;background:transparent;white-space:nowrap}
.tab:hover{color:var(--white);background:rgba(99,102,241,.08)}
.tab.active{background:var(--accent);color:#fff}
.tab .ct{font-family:"Space Mono";font-size:.65rem;margin-left:.2rem;opacity:.7}
.panel{display:none}.panel.active{display:block}
.stats{display:flex;gap:.6rem;justify-content:center;flex-wrap:wrap;margin-bottom:1rem}
.st{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:.4rem 1rem;text-align:center}
.st-n{font-family:"Space Mono";font-size:1.3rem;font-weight:700;color:var(--white)}
.st-l{font-size:.6rem;text-transform:uppercase;letter-spacing:.04em}
.st.pass .st-n{color:var(--teal)}.st.fail .st-n{color:var(--red)}
.output{font-family:"Space Mono",monospace;font-size:11px;line-height:1.6;white-space:pre-wrap;word-break:break-word;padding:.8rem;background:rgba(0,0,0,.3);border:1px solid var(--border);border-radius:var(--r);max-height:500px;overflow-y:auto}
.output .p{color:var(--teal)}.output .f{color:var(--red)}.output .w{color:var(--gold)}.output .s{color:var(--accent);font-weight:700}
.ifr{border:1px solid var(--border);border-radius:var(--r);overflow:hidden;background:#0a0e1a}
.ifr iframe{width:100%;height:82vh;border:none}
.btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--accent);color:#fff;border:none;padding:.5rem 1.2rem;border-radius:8px;font-weight:600;font-size:.78rem;cursor:pointer;margin:.3rem;transition:all .2s}
.btn:hover{background:#4f46e5;transform:translateY(-1px)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn.teal{background:var(--teal)}.btn.gold{background:#d97706}.btn.red{background:var(--red)}
.btn .sp{display:none;width:12px;height:12px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}
.btn.ld .sp{display:inline-block}
@keyframes spin{to{transform:rotate(360deg)}}
.ts{font-size:.65rem;color:var(--text);text-align:center;margin-top:.4rem;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">8 suites — NonReg + Visual + Auth + Inventory + 6s + WEVIA Deep + Code Review + GoLive</div>
</div>
<div class="tabs" id="tabbar">
<div class="tab active" data-t="nonreg">🧪 NonReg <span class="ct" id="c-nr">--</span></div>
<div class="tab" data-t="visual">📸 Visual <span class="ct" id="c-vs">--</span></div>
<div class="tab" data-t="auth">🔐 Auth <span class="ct" id="c-au">--</span></div>
<div class="tab" data-t="inv">📊 Inventory</div>
<div class="tab" data-t="sigma">🎯 6s Master <span class="ct" id="c-sg">--</span></div>
<div class="tab" data-t="wevia">🧠 WEVIA Deep <span class="ct" id="c-wv">--</span></div>
<div class="tab" data-t="code">🔍 Code Review</div>
<div class="tab" data-t="s95">🔧 WEVADS S95</div>
<div class="tab" data-t="arsenal">2694 Arsenal</div>
<div class="tab" data-t="golive">🚀 GoLive</div>
</div>
<!-- TAB 1: NONREG -->
<div class="panel active" id="p-nonreg">
<div style="text-align:center">
<button class="btn" id="btn-nr" onclick="runNR()"><span class="sp"></span>▶ Lancer NonReg API</button>
<button class="btn teal" onclick="runVis()"><span class="sp"></span>📸 Lancer Visual</button>
<button class="btn gold" onclick="runMega()"><span class="sp"></span>🧠 Lancer WEVIA Deep</button>
</div>
<div class="stats" id="nr-st"></div>
<div class="output" id="nr-out">Cliquez "Lancer NonReg" pour les tests API/BDD/Infra...</div>
<div class="ts" id="nr-ts"></div>
</div>
<!-- TAB 2: VISUAL -->
<div class="panel" id="p-visual">
<div style="text-align:center;margin-bottom:.5rem">
<button class="btn teal" onclick="runVis()"><span class="sp"></span>📸 Re-lancer Visual</button>
</div>
<div class="ifr"><iframe id="if-vs" src="/test-report/visual-report.html" loading="lazy"></iframe></div>
<div class="ts">Screenshots Playwright — pages desktop + mobile</div>
</div>
<!-- TAB 3: AUTH -->
<div class="panel" id="p-auth">
<div class="ifr"><iframe id="if-au" src="/test-report/auth-report.html" loading="lazy"></iframe></div>
<div class="ts">Login/Logout + Overlap detection</div>
</div>
<!-- TAB 4: INVENTORY -->
<div class="panel" id="p-inv">
<div class="ifr"><iframe src="/weval-master-inventory.html" loading="lazy"></iframe></div>
<div class="ts">70+ ecrans — S204 + S95 + S151 — URLs + Credentials + Docker</div>
</div>
<!-- TAB 5: 6s MASTER -->
<div class="panel" id="p-sigma">
<div class="ifr"><iframe id="if-sg" src="/master-test.html" loading="lazy"></iframe></div>
<div class="ts">Lean Six Sigma DMAIC — E2E + API + Security + Branding + Business</div>
</div>
<!-- TAB 6: WEVIA DEEP -->
<div class="panel" id="p-wevia">
<div style="text-align:center;margin-bottom:.5rem">
<button class="btn gold" onclick="runMega()"><span class="sp"></span>🧠 Lancer Mega Test</button>
</div>
<div class="ifr"><iframe id="if-wv" src="/wevia-ia/mega-test.html" loading="lazy"></iframe></div>
<div class="ts">WEVIA + WEDROID + WEVCODE — Chatbot, PDF, Mermaid, Logos, Images, Multi-turn, Injection</div>
</div>
<!-- TAB 7: CODE REVIEW -->
<div class="panel" id="p-code">
<div class="ifr"><iframe src="/wevia-ia/code-review-22mars.html" loading="lazy"></iframe></div>
<div class="ts">Audit 3 serveurs — Issues + Plan d'action</div>
</div>
<!-- TAB 9: S95 WEVADS -->
<div class="panel" id="p-s95">
<div class="ifr"><iframe src="/wevads-nonreg/" loading="lazy"></iframe></div>
<div class="ts">WEVADS S95 — PostgreSQL + Arsenal + PMTA + Crons + Brain Engine</div>
</div>
<!-- TAB: ARSENAL -->
<div class="panel" id="p-arsenal">
<div class="ifr"><iframe src="/test-report/arsenal-report.html" loading="lazy"></iframe></div>
<div class="ts">Arsenal + ADX — 40 ecrans + 11 ADX + Admin</div>
</div>
<!-- TAB 8: GOLIVE -->
<div class="panel" id="p-golive">
<div class="ifr"><iframe src="/golive.html" loading="lazy"></iframe></div>
<div class="ts">4 variantes — WEVIA Grand ecran + Widget + WEVCODE + WEDROID</div>
</div>
</div>
<script>
document.querySelectorAll('.tab').forEach(function(t){
t.addEventListener('click',function(){
var id=this.dataset.t;
document.querySelectorAll('.tab').forEach(function(x){x.classList.remove('active')});
document.querySelectorAll('.panel').forEach(function(x){x.classList.remove('active')});
this.classList.add('active');
document.getElementById('p-'+id).classList.add('active');
});
});
function esc(s){return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')}
async function runNR(){
var b=document.getElementById('btn-nr');b.classList.add('ld');b.disabled=true;
document.getElementById('nr-out').textContent='Running NonReg API tests...\n';
try{
var r=await fetch('/api/nonreg-master.php',{credentials:'include'});
var t=await r.text();var o=document.getElementById('nr-out');
var lines=t.split('\n'),p=0,f=0,w=0,h='';
lines.forEach(function(l){
if(l.match(/PASS/i)){h+='<span class="p">'+esc(l)+'</span>\n';p++;}
else if(l.match(/FAIL/i)){h+='<span class="f">'+esc(l)+'</span>\n';f++;}
else if(l.match(/WARN/i)){h+='<span class="w">'+esc(l)+'</span>\n';w++;}
else if(l.match(/^===|^---/)){h+='<span class="s">'+esc(l)+'</span>\n';}
else{h+=esc(l)+'\n';}
});
o.innerHTML=h;
document.getElementById('nr-st').innerHTML=
'<div class="st pass"><div class="st-n">'+p+'</div><div class="st-l">Pass</div></div>'+
'<div class="st fail"><div class="st-n">'+f+'</div><div class="st-l">Fail</div></div>'+
'<div class="st"><div class="st-n">'+(p+f+w)+'</div><div class="st-l">Total</div></div>';
document.getElementById('c-nr').textContent=p+'/'+(p+f+w);
document.getElementById('nr-ts').textContent='Run: '+new Date().toLocaleString('fr-FR');
}catch(e){document.getElementById('nr-out').textContent='Error: '+e.message;}
b.classList.remove('ld');b.disabled=false;
}
function runVis(){
alert('Visual test lance en background (~2min).');
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-vs').src='/test-report/visual-report.html?t='+Date.now()},150000);
}
function runMega(){
document.querySelectorAll('.tab').forEach(function(x){x.classList.remove('active')});
document.querySelectorAll('.panel').forEach(function(x){x.classList.remove('active')});
document.querySelector('[data-t=wevia]').classList.add('active');
document.getElementById('p-wevia').classList.add('active');
document.getElementById('if-wv').src='/wevia-ia/mega-test.php?t='+Date.now();
}
setTimeout(function(){
try{
var vf=document.getElementById('if-vs');
vf.onload=function(){try{var d=vf.contentDocument;var p=(d.body.innerHTML.match(/>PASS</g)||[]).length;var f=(d.body.innerHTML.match(/>FAIL</g)||[]).length;document.getElementById('c-vs').textContent=p+'/'+(p+f);}catch(e){}};
var af=document.getElementById('if-au');
af.onload=function(){try{var d=af.contentDocument;var p=(d.body.innerHTML.match(/>PASS</g)||[]).length;var f=(d.body.innerHTML.match(/>FAIL</g)||[]).length;document.getElementById('c-au').textContent=p+'/'+(p+f);}catch(e){}};
}catch(e){}
},3000);
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
<script>
(function(){
if (window.__opusUniversalDrill) return; window.__opusUniversalDrill = true;
var d = document;
var m = d.createElement('div');
m.id = 'opus-udrill';
m.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.82);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;z-index:99995;padding:20px;cursor:pointer';
var inner = d.createElement('div');
inner.id = 'opus-udrill-in';
inner.style.cssText = 'max-width:900px;width:100%;max-height:90vh;overflow:auto;background:#0b0d15;border:1px solid rgba(99,102,241,0.35);border-radius:14px;padding:28px;cursor:default;box-shadow:0 20px 60px rgba(0,0,0,0.6);color:#e2e8f0;font:14px/1.55 Inter,system-ui,sans-serif';
inner.addEventListener('click', function(e){ e.stopPropagation(); });
m.appendChild(inner);
m.addEventListener('click', function(){ m.style.display='none'; });
d.addEventListener('keydown', function(e){ if(e.key==='Escape') m.style.display='none'; });
(d.body || d.documentElement).appendChild(m);
function openCard(card) {
// Clone card content + show close btn + increase font-size
var html = '<div style="display:flex;justify-content:flex-end;margin-bottom:14px"><button id="opus-udrill-close" style="padding:6px 14px;background:#171b2a;border:1px solid rgba(99,102,241,0.25);color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:12px">✕ Fermer (Esc)</button></div>';
html += '<div style="transform-origin:top left;font-size:1.05em">' + card.outerHTML + '</div>';
inner.innerHTML = html;
d.getElementById('opus-udrill-close').onclick = function(){ m.style.display='none'; };
m.style.display = 'flex';
}
function wire(root) {
var sels = '.card,[class*="card"],.kpi,[class*="kpi"],.stat,[class*="stat"],.tile,[class*="tile"],.metric,[class*="metric"],.widget,[class*="widget"]';
var cards = root.querySelectorAll(sels);
for (var i = 0; i < cards.length; i++) {
var c = cards[i];
if (c.__opusWired) continue;
if (c.closest('button, a, input, select, textarea, #opus-udrill')) continue;
var r = c.getBoundingClientRect();
if (r.width < 60 || r.height < 40) continue;
c.__opusWired = true;
c.style.cursor = 'pointer';
c.setAttribute('role','button');
c.setAttribute('tabindex','0');
c.addEventListener('click', function(ev){
// If a more-specific drill is already active (e.g. pp-card custom), let it handle
if (ev.target.closest('[data-pp-id]') && window.__opusDrillInit) return;
if (ev.target.closest('a,button,input,select')) return;
ev.preventDefault(); ev.stopPropagation();
openCard(this);
});
c.addEventListener('keydown', function(ev){ if(ev.key==='Enter'||ev.key===' '){ev.preventDefault();openCard(this);} });
}
}
// Initial + mutation observer
var initRun = function(){ wire(d.body || d.documentElement); };
if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', initRun);
else initRun();
var mo = new MutationObserver(function(muts){
var newCard = false;
for (var i=0;i<muts.length;i++) if (muts[i].addedNodes.length) { newCard = true; break; }
if (newCard) initRun();
});
mo.observe(d.body || d.documentElement, {childList:true, subtree:true});
})();
</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN END === -->
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t31b3) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></script>
</body>
</html>