mcp.test.ts81 lines · main
1import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
2
3import { getDevelopmentOperations } from './mcp'
4
5vi.mock('./settings', () => ({
6 getProjectSettings: vi.fn(),
7}))
8
9vi.mock('./generate-types', () => ({
10 generateTypescriptTypes: vi.fn(),
11}))
12
13describe('api/self-hosted/mcp', () => {
14 describe('getDevelopmentOperations.getPublishableKeys', () => {
15 let getProjectSettingsMock: ReturnType<typeof vi.fn>
16
17 beforeEach(async () => {
18 vi.clearAllMocks()
19 vi.unstubAllEnvs()
20 const settings = await import('./settings')
21 getProjectSettingsMock = vi.mocked(settings.getProjectSettings)
22 })
23
24 afterEach(() => {
25 vi.unstubAllEnvs()
26 })
27
28 it('returns a publishable-typed key from SUPABASE_PUBLISHABLE_KEY when set', async () => {
29 vi.stubEnv('SUPABASE_PUBLISHABLE_KEY', 'sb_publishable_abc')
30
31 const ops = getDevelopmentOperations({})
32 const keys = await ops.getPublishableKeys('default')
33
34 expect(keys).toEqual([
35 {
36 api_key: 'sb_publishable_abc',
37 name: 'publishable',
38 type: 'publishable',
39 },
40 ])
41 // When the env var is set we should short-circuit and never consult project settings.
42 expect(getProjectSettingsMock).not.toHaveBeenCalled()
43 })
44
45 it('falls back to the anon key from project settings with type "legacy" when env var is unset', async () => {
46 vi.stubEnv('SUPABASE_PUBLISHABLE_KEY', '')
47 getProjectSettingsMock.mockReturnValue({
48 service_api_keys: [
49 { api_key: 'service-key-value', name: 'service_role key', tags: 'service_role' },
50 { api_key: 'anon-key-value', name: 'anon key', tags: 'anon' },
51 ],
52 })
53
54 const ops = getDevelopmentOperations({})
55 const keys = await ops.getPublishableKeys('default')
56
57 expect(keys).toEqual([
58 {
59 api_key: 'anon-key-value',
60 name: 'anon key',
61 type: 'legacy',
62 },
63 ])
64 })
65
66 it('throws when env var is unset and the anon key is missing from project settings', async () => {
67 vi.stubEnv('SUPABASE_PUBLISHABLE_KEY', '')
68 getProjectSettingsMock.mockReturnValue({
69 service_api_keys: [
70 { api_key: 'service-key-value', name: 'service_role key', tags: 'service_role' },
71 ],
72 })
73
74 const ops = getDevelopmentOperations({})
75
76 await expect(ops.getPublishableKeys('default')).rejects.toThrow(
77 'Anon key not found in project settings'
78 )
79 })
80 })
81})