61 lines
2.4 KiB
JavaScript
61 lines
2.4 KiB
JavaScript
import { describe, expect, it } from 'bun:test';
|
|||
|
|
import express from 'express';
|
||
|
|
import request from 'supertest';
|
||
|
|
import { createStaticRoutesRuntime } from './static-routes-runtime.js';
|
||
|
|
|
||
|
|
const createRuntime = () => createStaticRoutesRuntime({
|
||
|
|
fs: { existsSync: () => false },
|
||
|
|
path: { join: (...parts) => parts.join('/'), resolve: (value) => value, sep: '/' },
|
||
|
|
process: { env: {} },
|
||
|
|
__dirname: '/server',
|
||
|
|
express,
|
||
|
|
resolveProjectDirectory: () => '',
|
||
|
|
buildOpenCodeUrl: () => '',
|
||
|
|
getOpenCodeAuthHeaders: () => ({}),
|
||
|
|
readSettingsFromDiskMigrated: async () => ({}),
|
||
|
|
normalizePwaAppName: (value) => value,
|
||
|
|
normalizePwaOrientation: (value) => value,
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('static routes runtime', () => {
|
||
|
|
it('returns API-only HTML fallback for browser UI routes', async () => {
|
||
|
|
const app = express();
|
||
|
|
createRuntime().registerApiOnlyFallbackRoutes(app);
|
||
|
|
|
||
|
|
const response = await request(app).get('/sessions/abc').set('Accept', 'text/html');
|
||
|
|
|
||
|
|
expect(response.status).toBe(200);
|
||
|
|
expect(response.text).toContain('OpenChamber is running in headless mode');
|
||
|
|
expect(response.text).toContain('Open it from the OpenChamber desktop or mobile app');
|
||
|
|
expect(response.text).toContain('openchamber connect-url --help');
|
||
|
|
expect(response.text).toContain('Copy command');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns API-only info JSON for JSON clients', async () => {
|
||
|
|
const app = express();
|
||
|
|
createRuntime().registerApiOnlyFallbackRoutes(app);
|
||
|
|
|
||
|
|
const response = await request(app).get('/sessions/abc').set('Accept', 'application/json');
|
||
|
|
|
||
|
|
expect(response.status).toBe(200);
|
||
|
|
expect(response.body).toEqual({
|
||
|
|
ok: true,
|
||
|
|
mode: 'api-only',
|
||
|
|
message: 'OpenChamber is running in API-only mode',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('does not intercept API, auth, or health routes in API-only mode', async () => {
|
||
|
|
const app = express();
|
||
|
|
createRuntime().registerApiOnlyFallbackRoutes(app);
|
||
|
|
|
||
|
|
const api = await request(app).get('/api/version');
|
||
|
|
const auth = await request(app).get('/auth/session');
|
||
|
|
const health = await request(app).get('/health');
|
||
|
|
|
||
|
|
expect(api.body).not.toEqual({ ok: true, mode: 'api-only', message: 'OpenChamber is running in API-only mode' });
|
||
|
|
expect(auth.body).not.toEqual({ ok: true, mode: 'api-only', message: 'OpenChamber is running in API-only mode' });
|
||
|
|
expect(health.body).not.toEqual({ ok: true, mode: 'api-only', message: 'OpenChamber is running in API-only mode' });
|
||
|
|
});
|
||
|
|
});
|