diff --git a/services/app-builder/src/api-schemas.test.ts b/services/app-builder/src/api-schemas.test.ts new file mode 100644 index 0000000000..5a30e41476 --- /dev/null +++ b/services/app-builder/src/api-schemas.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; +import { MigrateToGithubRequestSchema } from './api-schemas'; + +describe('MigrateToGithubRequestSchema', () => { + const request = { + githubRepo: 'kilocode/example', + userId: 'user_2abc123', + }; + + it('accepts non-empty text user IDs', () => { + expect(MigrateToGithubRequestSchema.parse(request)).toEqual(request); + }); + + it('rejects empty user IDs', () => { + expect(() => MigrateToGithubRequestSchema.parse({ ...request, userId: '' })).toThrow(); + }); + + it('keeps organization IDs UUID-only', () => { + expect(() => + MigrateToGithubRequestSchema.parse({ ...request, orgId: 'org_2abc123' }) + ).toThrow(); + expect( + MigrateToGithubRequestSchema.parse({ + ...request, + orgId: '123e4567-e89b-42d3-a456-426614174000', + }) + ).toEqual({ + ...request, + orgId: '123e4567-e89b-42d3-a456-426614174000', + }); + }); +}); diff --git a/services/app-builder/src/api-schemas.ts b/services/app-builder/src/api-schemas.ts index 9c1b452abe..399718296e 100644 --- a/services/app-builder/src/api-schemas.ts +++ b/services/app-builder/src/api-schemas.ts @@ -141,7 +141,7 @@ export type DeleteErrorResponse = z.infer; export const MigrateToGithubRequestSchema = z.object({ githubRepo: z.string().regex(/^[^/]+\/[^/]+$/, 'Must be in "owner/repo" format'), - userId: z.string().uuid(), + userId: z.string().min(1), orgId: z.string().uuid().optional(), });