presta
Version:
Hyper minimal framework for the modern web.
115 lines (96 loc) • 2.18 kB
text/typescript
import tap from 'tap'
import { wrapHandler } from '../lib/wrapHandler'
import { AWS } from '../lib/types'
const context = {} as AWS['HandlerContext']
function stubEvent(props: Partial<AWS['HandlerEvent']>): AWS['HandlerEvent'] {
return {
rawUrl: '',
rawQuery: '',
path: '',
httpMethod: 'GET',
headers: {},
multiValueHeaders: {},
queryStringParameters: null,
multiValueQueryStringParameters: {},
body: null,
isBase64Encoded: false,
...props,
}
}
tap.test('wrapHandler', async (t) => {
t.plan(2)
const handler = wrapHandler({
route: '/:slug',
async handler(event, context) {
t.equal(event.routeParameters.slug, 'foo')
return {
body: 'foo',
}
},
})
const response = await handler(
stubEvent({
path: '/foo',
}),
context
)
t.equal(response.body, 'foo')
})
tap.test('wrapHandler - html fallback', async (t) => {
const handler = wrapHandler({
route: '/:slug',
async handler(event, context) {
throw Error()
},
})
const response = await handler(
stubEvent({
path: '/foo',
}),
context
)
t.ok(response?.body?.includes('HTTP 500'))
})
tap.test('wrapHandler - json fallback', async (t) => {
const handler = wrapHandler({
route: '/:slug',
async handler(event, context) {
throw Error()
},
})
const response = await handler(
stubEvent({
path: '/foo',
headers: {
Accept: 'application/json',
},
}),
context
)
const body = JSON.parse(response.body || '')
t.equal(body.errors.length, 1)
})
tap.test('wrapHandler - json fallback with details', async (t) => {
const handler = wrapHandler({
route: '/:slug',
async handler(event, context) {
const e = Error('message')
// @ts-ignore
e.title = 'test'
throw e
},
})
const response = await handler(
stubEvent({
path: '/foo',
headers: {
Accept: 'application/json',
},
}),
context
)
const body = JSON.parse(response.body || '')
const error = body.errors[0]
t.equal(error.details, 'message')
t.equal(error.title, 'test')
})