mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-11 03:13:12 +00:00
fix(cursor): align auto-detect status and CI coverage
This commit is contained in:
1 parent
cf5df0630a
commit
2719d7a6f7
2 files changed
+35
-6
No files matched your search
@@ -31,6 +31,21 @@ interface DaemonStartPreconditionError {
|
|||||||
error: string;
|
error: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getAutoDetectFailureStatus(
|
||||||
|
reason?: ReturnType<typeof autoDetectTokens>['reason']
|
||||||
|
): number {
|
||||||
|
switch (reason) {
|
||||||
|
case 'sqlite_unavailable':
|
||||||
|
return 503;
|
||||||
|
case 'db_query_failed':
|
||||||
|
return 500;
|
||||||
|
case 'invalid_token_format':
|
||||||
|
return 400;
|
||||||
|
default:
|
||||||
|
return 404;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getPublicAutoDetectError(result: ReturnType<typeof autoDetectTokens>): string {
|
function getPublicAutoDetectError(result: ReturnType<typeof autoDetectTokens>): string {
|
||||||
switch (result.reason) {
|
switch (result.reason) {
|
||||||
case 'db_not_found':
|
case 'db_not_found':
|
||||||
@@ -138,12 +153,7 @@ router.post('/auth/auto-detect', async (_req: Request, res: Response): Promise<v
|
|||||||
const result = autoDetectTokens();
|
const result = autoDetectTokens();
|
||||||
|
|
||||||
if (!result.found || !result.accessToken || !result.machineId) {
|
if (!result.found || !result.accessToken || !result.machineId) {
|
||||||
const status =
|
const status = getAutoDetectFailureStatus(result.reason);
|
||||||
result.reason === 'sqlite_unavailable'
|
|
||||||
? 503
|
|
||||||
: result.reason === 'db_query_failed'
|
|
||||||
? 500
|
|
||||||
: 404;
|
|
||||||
res.status(status).json({
|
res.status(status).json({
|
||||||
error: getPublicAutoDetectError(result),
|
error: getPublicAutoDetectError(result),
|
||||||
reason: result.reason ?? null,
|
reason: result.reason ?? null,
|
||||||
|
|||||||
@@ -55,6 +55,15 @@ let getTokenStoragePath: () => string;
|
|||||||
let getDaemonStartPreconditionError: (
|
let getDaemonStartPreconditionError: (
|
||||||
input: { enabled: boolean; authenticated: boolean; tokenExpired?: boolean }
|
input: { enabled: boolean; authenticated: boolean; tokenExpired?: boolean }
|
||||||
) => { status: number; error: string } | null;
|
) => { status: number; error: string } | null;
|
||||||
|
let getAutoDetectFailureStatus: (
|
||||||
|
reason?:
|
||||||
|
| 'db_not_found'
|
||||||
|
| 'sqlite_unavailable'
|
||||||
|
| 'db_query_failed'
|
||||||
|
| 'access_token_not_found'
|
||||||
|
| 'machine_id_not_found'
|
||||||
|
| 'invalid_token_format'
|
||||||
|
) => number;
|
||||||
|
|
||||||
function seedCursorConfig(overrides: {
|
function seedCursorConfig(overrides: {
|
||||||
enabled?: boolean;
|
enabled?: boolean;
|
||||||
@@ -107,6 +116,7 @@ beforeAll(async () => {
|
|||||||
|
|
||||||
const cursorRoutesModule = await import('../../../src/web-server/routes/cursor-routes');
|
const cursorRoutesModule = await import('../../../src/web-server/routes/cursor-routes');
|
||||||
getDaemonStartPreconditionError = cursorRoutesModule.getDaemonStartPreconditionError;
|
getDaemonStartPreconditionError = cursorRoutesModule.getDaemonStartPreconditionError;
|
||||||
|
getAutoDetectFailureStatus = cursorRoutesModule.getAutoDetectFailureStatus;
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
@@ -207,6 +217,10 @@ describe('Cursor Routes Logic', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('HTTP contracts', () => {
|
describe('HTTP contracts', () => {
|
||||||
|
it('maps invalid_token_format auto-detect failures to HTTP 400', () => {
|
||||||
|
expect(getAutoDetectFailureStatus('invalid_token_format')).toBe(400);
|
||||||
|
});
|
||||||
|
|
||||||
it('GET /api/cursor/status returns current state', async () => {
|
it('GET /api/cursor/status returns current state', async () => {
|
||||||
const res = await fetch(`${baseUrl}/api/cursor/status`);
|
const res = await fetch(`${baseUrl}/api/cursor/status`);
|
||||||
expect(res.status).toBe(200);
|
expect(res.status).toBe(200);
|
||||||
@@ -396,6 +410,11 @@ describe('Cursor Routes Logic', () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sqliteCheck = spawnSync('sqlite3', ['--version'], { stdio: 'ignore' });
|
||||||
|
if (sqliteCheck.status !== 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const originalHome = process.env.HOME;
|
const originalHome = process.env.HOME;
|
||||||
const fakeHome = path.join(tempDir, 'query-failed-home');
|
const fakeHome = path.join(tempDir, 'query-failed-home');
|
||||||
process.env.HOME = fakeHome;
|
process.env.HOME = fakeHome;
|
||||||
|
|||||||
Reference in new issue
Block a user