d3ro-voice/tests/e2e/system-verification.js
Yun Chan 708e20f747
Some checks failed
CI Pipeline / Code Quality & Typecheck (push) Waiting to run
CI Pipeline / Test Suite (macos-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (ubuntu-latest) (push) Blocked by required conditions
CI Pipeline / Test Suite (windows-latest) (push) Blocked by required conditions
CI Pipeline / Build Validation (admin) (push) Blocked by required conditions
CI Pipeline / Build Validation (desktop) (push) Blocked by required conditions
Deploy Landing Page / deploy (push) Blocked by required conditions
Deploy Landing Page / build (push) Waiting to run
Release & Packaging Pipeline / Build & Publish Admin Docker Image (push) Failing after 8s
Release & Code Signing CA Pipeline / build-and-sign-windows (push) Failing after 1m51s
Build macOS / Build & Package (macOS) (push) Failing after 4s
Build macOS / Build & Package (macOS)-1 (push) Failing after 5s
Release & Code Signing CA Pipeline / build-and-sign-macos (push) Failing after 3s
Release & Packaging Pipeline / Package macOS Desktop App (push) Failing after 4s
Release & Packaging Pipeline / Package Windows Desktop App (push) Failing after 2m28s
Release & Packaging Pipeline / Publish Official GitHub Release (push) Has been skipped
feat: complete release preparation, 10+ ad mediation, CI/CD, and docker deployment
2026-08-20 11:12:05 +09:00

106 lines
4.6 KiB
JavaScript

// tests/e2e/system-verification.js
// Automated E2E verification script for C# .NET API Backend & BackOffice
const API_BASE = 'http://localhost:5000';
async function runE2EVerification() {
console.log('==================================================');
console.log(' D3RO Voice — Closed Loop E2E Automated Test');
console.log('==================================================');
try {
// 1. Health & Server Stats
console.log('\n[1/5] Testing Server Stats & Health...');
const statsRes = await fetch(`${API_BASE}/api/admin/stats`);
if (!statsRes.ok) throw new Error(`Stats endpoint failed with status ${statsRes.status}`);
const stats = await statsRes.json();
console.log(' ✓ Server Stats:', JSON.stringify(stats));
// 2. User Registration & Login
console.log('\n[2/5] Testing User Registration & Mandatory Login Guard...');
const testEmail = `e2e_user_${Date.now()}@d3ro.ai`;
const testPassword = 'Password123!';
const regRes = await fetch(`${API_BASE}/api/auth/register`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: testEmail, password: testPassword })
});
if (!regRes.ok) throw new Error(`Registration failed: ${await regRes.text()}`);
const regData = await regRes.json();
console.log(` ✓ Registration successful for: ${regData.email} (Role: ${regData.role})`);
const loginRes = await fetch(`${API_BASE}/api/auth/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: testEmail, password: testPassword })
});
if (!loginRes.ok) throw new Error(`Login failed: ${await loginRes.text()}`);
const loginData = await loginRes.json();
const token = loginData.token;
console.log(' ✓ Login successful, JWT token issued.');
// Verify unauthenticated request fails
const unauthRes = await fetch(`${API_BASE}/api/llm/generate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt: 'Test' })
});
if (unauthRes.status !== 401) throw new Error(`Expected 401 Unauthenticated, got ${unauthRes.status}`);
console.log(' ✓ Mandatory Login Guard verified (Unauthenticated request rejected with 401).');
// 3. Dynamic Model Endpoint Creation (Admin)
console.log('\n[3/5] Testing Dynamic Service Model & Endpoint Addition...');
const newModelId = `e2e-model-${Date.now()}`;
const createEpRes = await fetch(`${API_BASE}/api/admin/endpoints`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
modelId: newModelId,
modelName: 'E2E Dynamic Custom Model',
provider: 'OpenAI',
endpointUrl: 'https://api.openai.com/v1/chat/completions',
apiKey: 'sk-e2e-dummy-key',
costPer1kPromptTokens: 0.00020,
costPer1kCompletionTokens: 0.00080
})
});
if (!createEpRes.ok) throw new Error(`Endpoint creation failed: ${await createEpRes.text()}`);
const epData = await createEpRes.json();
console.log(` ✓ Dynamic Model Endpoint added: ${epData.modelId}`);
// 4. AI Generation & Usage Cost Calculation
console.log('\n[4/5] Testing AI Generation & Token Cost Calculation...');
const genRes = await fetch(`${API_BASE}/api/llm/generate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
prompt: 'Self-verification prompt for D3RO Voice E2E test',
model: newModelId
})
});
if (!genRes.ok) throw new Error(`AI generation failed: ${await genRes.text()}`);
const genData = await genRes.json();
console.log(' ✓ AI Generation result:', JSON.stringify(genData));
if (typeof genData.cost !== 'number') throw new Error('Cost calculation missing in response');
// 5. BackOffice Usage & Cost Analytics Report
console.log('\n[5/5] Testing BackOffice Usage & Cost Analytics Report...');
const usageRes = await fetch(`${API_BASE}/api/admin/usage`);
if (!usageRes.ok) throw new Error(`Usage report failed: ${await usageRes.text()}`);
const usageData = await usageRes.json();
console.log(' ✓ Usage Report received:', JSON.stringify(usageData));
console.log('\n==================================================');
console.log(' SUCCESS: ALL E2E VERIFICATION CHECKS PASSED!');
console.log('==================================================');
} catch (err) {
console.error('\n❌ E2E VERIFICATION FAILED:', err);
process.exit(1);
}
}
runE2EVerification();