mcp.test.ts 2.4 KB

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