mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 18:05:11 +03:00
Add a top-level field to search docs globally. Right now this only
returns Markdown guides (not references, GitHub discussions, or partner
pages.
The full GraphQL schema at this point:
```
schema {
query: RootQueryType
}
type RootQueryType {
"""Get the GraphQL schema for this endpoint"""
schema: String!
"""Search the Supabase docs for content matching a query string"""
searchDocs(query: String!, limit: Int): SearchResultCollection
}
"""A collection of search results containing content from Supabase docs"""
type SearchResultCollection {
"""A list of edges containing nodes in this collection"""
edges: [SearchResultEdge!]!
"""The nodes in this collection, directly accessible"""
nodes: [SearchResult!]!
"""The total count of items available in this collection"""
totalCount: Int!
}
"""An edge in a collection of SearchResults"""
type SearchResultEdge {
"""The SearchResult at the end of the edge"""
node: SearchResult!
}
"""Document that matches a search query"""
interface SearchResult {
"""The title of the matching result"""
title: String
"""The URL of the matching result"""
href: String
"""The full content of the matching result"""
content: String
}
```
Towards DOCS-214
97 lines
2.7 KiB
TypeScript
97 lines
2.7 KiB
TypeScript
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { POST } from './route'
|
|
|
|
describe('/api/graphql basic error statuses', () => {
|
|
beforeAll(() => {
|
|
vi.mock('server-only', () => {
|
|
return {}
|
|
})
|
|
vi.spyOn(console, 'error').mockImplementation(() => {})
|
|
})
|
|
|
|
afterAll(() => {
|
|
vi.restoreAllMocks()
|
|
vi.doUnmock('server-only')
|
|
})
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
vi.spyOn(console, 'error').mockImplementation(() => {})
|
|
})
|
|
|
|
it('should return error if request body is not valid JSON', async () => {
|
|
const request = new Request('http://localhost/api/graphql', {
|
|
method: 'POST',
|
|
body: 'not json',
|
|
})
|
|
|
|
const response = await POST(request)
|
|
const json = await response.json()
|
|
expect(json.errors[0].message).toBe('Invalid request: Request body must be valid JSON')
|
|
})
|
|
|
|
it('should return error if request body is missing required fields', async () => {
|
|
const request = new Request('http://localhost/api/graphql', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ variables: {} }),
|
|
})
|
|
|
|
const response = await POST(request)
|
|
const json = await response.json()
|
|
expect(json.errors[0].message).toContain(
|
|
'Invalid request: Request body must be valid GraphQL request object'
|
|
)
|
|
})
|
|
|
|
it('should return error if query is not a string', async () => {
|
|
const request = new Request('http://localhost/api/graphql', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ query: 123 }),
|
|
})
|
|
|
|
const response = await POST(request)
|
|
const json = await response.json()
|
|
expect(json.errors[0].message).toContain(
|
|
'Invalid request: Request body must be valid GraphQL request object'
|
|
)
|
|
})
|
|
|
|
it('should return error for internal server errors', async () => {
|
|
const request = new Request('http://localhost/api/graphql', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ query: 'query { hello }' }),
|
|
})
|
|
|
|
vi.spyOn(request, 'json').mockImplementation(() => {
|
|
throw new Error('Unexpected error')
|
|
})
|
|
|
|
const response = await POST(request)
|
|
const json = await response.json()
|
|
expect(json.errors[0].message).toBe('Internal Server Error')
|
|
})
|
|
})
|
|
|
|
describe('/api/graphql schema snapshot', () => {
|
|
it('should match snapshot', async () => {
|
|
const schemaQuery = `
|
|
query {
|
|
schema
|
|
}
|
|
`
|
|
const request = new Request('http://localhost/api/graphql', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ query: schemaQuery }),
|
|
})
|
|
|
|
const response = await POST(request)
|
|
const json = await response.json()
|
|
expect(json.errors).toBeUndefined()
|
|
|
|
const {
|
|
data: { schema },
|
|
} = json
|
|
expect(schema).toMatchSnapshot()
|
|
})
|
|
})
|