hermes-hub/tests/test_workspace_a48.js

29 lines
2.5 KiB
JavaScript

/* Pure client contract checks. Synthetic data stays in tests only. */
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
const path = require('node:path');
const client = path.join(__dirname,'../src/antigravity_provider/router/web/static');
const elements = new Map();
const document = {addEventListener(){},getElementById(id){if(!elements.has(id)) elements.set(id,{innerHTML:'',textContent:''});return elements.get(id);}};
const context = vm.createContext({document,Intl,Number,console,escapeHtml:value=>String(value ?? '').replaceAll('<','&lt;').replaceAll('"','&quot;')});
vm.runInContext(fs.readFileSync(path.join(client,'workspace.js'),'utf8'),context);
const snapshot = {providers:[{provider_id:'test',discovered_models:['measured-model'],last_refresh_at:'2026-08-31'}]};
const choices = context.modelOptions(snapshot,{provider:'test',preferred_models:['invented-model']},'old-model');
assert(choices.includes('measured-model'));
assert(!choices.includes('invented-model'));
assert(choices.includes('selected disabled>old-model'));
assert(context.modelOptions({providers:[]},{provider:'test'},'').includes('ещё не получен'));
assert(context.modelOptions({providers:[{provider_id:'test',discovered_models:[],last_refresh_at:'today'}]},{provider:'test'},'').includes('Доступных моделей нет'));
assert(!context.routeQuota({profile_id:'a',quota_snapshot:{buckets:[{label:'quota',remaining_percent:null}]}},{}).includes('width:0%'));
assert(context.routeQuota({profile_id:'a',quota_snapshot:{buckets:[{label:'quota',remaining_percent:0}]}},{}).includes('0%'));
context.renderHostResources(document.getElementById('host'),{cpu_percent:0,memory_percent:52,disk_percent:null});
assert(document.getElementById('host').innerHTML.includes('>0%</div>'));
assert(document.getElementById('host').innerHTML.includes('>52%</div>'));
assert(!document.getElementById('host').innerHTML.includes('null%'));
context.renderAnalyticsCharts({by_provider:{test:{total_tokens:321}},by_role:{coder:{total_calls:7}}});
assert(document.getElementById('analytics-token-chart').innerHTML.includes('321'));
assert(document.getElementById('analytics-role-chart').innerHTML.includes('7'));
context.renderLogDetail({message:'<script>alert(1)</script>',level:'info'});
assert(!document.getElementById('log-detail').innerHTML.includes('<script>'));
console.log('A48 client contract: model discovery, missing/zero quotas, host metrics, telemetry keys, escaping — passed');