mirror of
https://github.com/supabase/supabase.git
synced 2026-05-18 11:01:18 +08:00
103 lines
3.3 KiB
TypeScript
103 lines
3.3 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
import { DEFAULT_EXPOSED_SCHEMAS } from '@/lib/api/self-hosted/constants'
|
|
import { getDebuggingOperations } from '@/lib/api/self-hosted/mcp'
|
|
|
|
const mockGetLints = vi.fn()
|
|
|
|
// Mock getLints to capture what arguments the MCP operations pass
|
|
vi.mock('@/lib/api/self-hosted/lints', () => ({
|
|
getLints: (...args: unknown[]) => mockGetLints(...args),
|
|
}))
|
|
|
|
// Mock getProjectSettings to avoid assertSelfHosted() check
|
|
vi.mock('@/lib/api/self-hosted/settings', () => ({
|
|
getProjectSettings: () => ({
|
|
app_config: {
|
|
db_schema: 'public',
|
|
endpoint: 'localhost',
|
|
protocol: 'http',
|
|
},
|
|
service_api_keys: [{ api_key: 'test', name: 'anon key', tags: 'anon' }],
|
|
}),
|
|
}))
|
|
|
|
describe('MCP advisor operations pass exposedSchemas to getLints', () => {
|
|
const headers = { Authorization: 'Bearer test' }
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
mockGetLints.mockResolvedValue({
|
|
data: [
|
|
{
|
|
name: 'rls_disabled_in_public',
|
|
title: 'RLS Disabled in Public',
|
|
level: 'ERROR',
|
|
categories: ['SECURITY'],
|
|
description: 'test',
|
|
detail: 'test',
|
|
remediation: 'test',
|
|
metadata: {},
|
|
cache_key: 'test',
|
|
},
|
|
{
|
|
name: 'unindexed_foreign_keys',
|
|
title: 'Unindexed foreign keys',
|
|
level: 'INFO',
|
|
categories: ['PERFORMANCE'],
|
|
description: 'test',
|
|
detail: 'test',
|
|
remediation: 'test',
|
|
metadata: {},
|
|
cache_key: 'test',
|
|
},
|
|
],
|
|
error: undefined,
|
|
})
|
|
})
|
|
|
|
it('getSecurityAdvisors should pass exposedSchemas to getLints', async () => {
|
|
const ops = getDebuggingOperations({ headers })
|
|
await ops.getSecurityAdvisors('test-project')
|
|
|
|
expect(mockGetLints).toHaveBeenCalledOnce()
|
|
const callArgs = mockGetLints.mock.calls[0][0]
|
|
expect(callArgs).toHaveProperty('exposedSchemas')
|
|
expect(callArgs.exposedSchemas).toBeTruthy()
|
|
})
|
|
|
|
it('getPerformanceAdvisors should pass exposedSchemas to getLints', async () => {
|
|
const ops = getDebuggingOperations({ headers })
|
|
await ops.getPerformanceAdvisors('test-project')
|
|
|
|
expect(mockGetLints).toHaveBeenCalledOnce()
|
|
const callArgs = mockGetLints.mock.calls[0][0]
|
|
expect(callArgs).toHaveProperty('exposedSchemas')
|
|
expect(callArgs.exposedSchemas).toBeTruthy()
|
|
})
|
|
|
|
it('should use DEFAULT_EXPOSED_SCHEMAS constant', async () => {
|
|
const ops = getDebuggingOperations({ headers })
|
|
await ops.getSecurityAdvisors('test-project')
|
|
|
|
const callArgs = mockGetLints.mock.calls[0][0]
|
|
expect(callArgs.exposedSchemas).toBe(DEFAULT_EXPOSED_SCHEMAS)
|
|
})
|
|
|
|
it('getSecurityAdvisors should filter to SECURITY category', async () => {
|
|
const ops = getDebuggingOperations({ headers })
|
|
const result = await ops.getSecurityAdvisors('test-project')
|
|
|
|
expect(result).toHaveLength(1)
|
|
expect((result as Array<{ name: string }>)[0].name).toBe('rls_disabled_in_public')
|
|
})
|
|
|
|
it('getPerformanceAdvisors should filter to PERFORMANCE category', async () => {
|
|
const ops = getDebuggingOperations({ headers })
|
|
const result = await ops.getPerformanceAdvisors('test-project')
|
|
|
|
expect(result).toHaveLength(1)
|
|
expect((result as Array<{ name: string }>)[0].name).toBe('unindexed_foreign_keys')
|
|
})
|
|
})
|