Files
gongxue-base/scripts/remote-auth-jwt-smoke-test.js
2026-06-30 02:10:34 +08:00

120 lines
3.6 KiB
JavaScript

import assert from 'node:assert/strict';
import http from 'node:http';
import { runRemoteAuthSmoke } from './remote-auth-jwt-smoke.js';
const tenantId = '00000000-0000-0000-0000-000000000001';
const wrongTenantId = '00000000-0000-0000-0000-000000000901';
function json(res, status, payload) {
res.writeHead(status, { 'content-type': 'application/json' });
res.end(JSON.stringify(payload));
}
function bearer(req) {
const header = req.headers.authorization || '';
return header.replace(/^Bearer\s+/i, '').trim();
}
function isWrongTenant(req) {
return req.headers['x-tenant-id'] === wrongTenantId;
}
const server = http.createServer((req, res) => {
const token = bearer(req);
const url = new URL(req.url || '/', 'http://127.0.0.1');
if (token === 'invalid.jwt.token') {
json(res, 401, { code: 'AUTH_SESSION_INVALID' });
return;
}
if (isWrongTenant(req) && url.pathname === '/api/profile/me') {
json(res, 401, { code: 'AUTH_SESSION_INVALID' });
return;
}
if (token === 'student-token') {
if (url.pathname === '/api/auth/me') {
json(res, 200, { user: { id: 'student-user' }, session: { source: 'supabase_jwt' } });
return;
}
if (url.pathname === '/api/profile/me') {
json(res, 200, { item: { userId: 'student-user' } });
return;
}
if (url.pathname === '/api/tenant-admin/overview') {
json(res, 403, { code: 'TENANT_ADMIN_REQUIRED' });
return;
}
if (url.pathname === '/api/platform-admin/overview') {
json(res, 403, { code: 'PLATFORM_ADMIN_REQUIRED' });
return;
}
}
if (token === 'tenant-token') {
if (url.pathname === '/api/auth/me') {
json(res, 200, { user: { id: 'tenant-user' }, session: { source: 'supabase_jwt' } });
return;
}
if (url.pathname === '/api/tenant-admin/overview') {
json(res, 200, { item: { id: tenantId } });
return;
}
if (url.pathname === '/api/platform-admin/overview') {
json(res, 403, { code: 'PLATFORM_ADMIN_REQUIRED' });
return;
}
}
if (token === 'platform-token') {
if (url.pathname === '/api/platform-admin/overview') {
json(res, 200, { item: { tenants: { total: 2 } } });
return;
}
if (url.pathname === '/api/auth/me') {
json(res, 200, { user: { id: 'platform-user' }, session: { source: 'supabase_jwt' } });
return;
}
}
json(res, 404, { code: 'NOT_FOUND', path: url.pathname });
});
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
try {
const address = server.address();
const results = await runRemoteAuthSmoke(
{
apiBaseUrl: `http://127.0.0.1:${address.port}`,
tenantId,
wrongTenantId,
timeoutMs: 5000,
requireAdminTokens: true,
student: {
token: 'student-token',
expectedUserId: 'student-user',
},
tenantAdmin: {
token: 'tenant-token',
expectedUserId: 'tenant-user',
},
platformAdmin: {
token: 'platform-token',
expectedUserId: 'platform-user',
tenantId,
},
},
{ quiet: true },
);
assert.equal(results.some(item => item.name === 'student.auth_me.session_source' && item.status === 'pass'), true);
assert.equal(results.some(item => item.name === 'student.tenant_admin_denied' && item.status === 'pass'), true);
assert.equal(results.some(item => item.name === 'platform_admin.overview' && item.status === 'pass'), true);
assert.equal(results.filter(item => item.status === 'fail').length, 0);
console.log('[PASS] remote Auth/JWKS smoke script');
} finally {
await new Promise(resolve => server.close(resolve));
}