Compare commits
3 Commits
v3.2.7
...
1b2956b437
| Author | SHA1 | Date | |
|---|---|---|---|
|
1b2956b437
|
|||
|
64458ca755
|
|||
|
eeea1102af
|
9
jest.config.ts
Normal file
9
jest.config.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { Config } from 'jest'
|
||||
|
||||
const config: Config = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'node',
|
||||
verbose: true
|
||||
}
|
||||
|
||||
export default config
|
||||
3865
package-lock.json
generated
3865
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -32,6 +32,11 @@
|
||||
"homepage": "https://github.com/tsndr/cloudflare-worker-router#readme",
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "^4.20231025.0",
|
||||
"@jest/globals": "^29.7.0",
|
||||
"@types/jest": "^29.5.11",
|
||||
"jest": "^29.7.0",
|
||||
"ts-jest": "^29.1.1",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
366
src/index.spec.ts
Normal file
366
src/index.spec.ts
Normal file
@@ -0,0 +1,366 @@
|
||||
import { describe, expect, test } from '@jest/globals'
|
||||
import { Router } from '.'
|
||||
|
||||
describe('Router', () => {
|
||||
test('use', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/')
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.use(() => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
router.get('/', () => new Response('failed'))
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('delete', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'DELETE' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.delete('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('get', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'GET' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.get('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('head', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'HEAD' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.head('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('options', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'OPTIONS' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.options('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('patch', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'PATCH' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.patch('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('post', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.post('/test', () => testResponse)).toBeInstanceOf(Router)
|
||||
expect(router.post('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('put', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'PUT' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.put('/test', () => testResponse)).toBeInstanceOf(Router)
|
||||
expect(router.put('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('any', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.any('/test', () => testResponse)).toBeInstanceOf(Router)
|
||||
expect(router.any('/', () => testResponse)).toBeInstanceOf(Router)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('cors', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/', { method: 'GET' })
|
||||
const testOptionsRequest = new Request('https://example.com/', { method: 'OPTIONS' })
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
expect(router.cors()).toBeInstanceOf(Router)
|
||||
|
||||
router.get('/', () => testResponse)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toBe(200)
|
||||
|
||||
expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*')
|
||||
expect(response.headers.get('Access-Control-Allow-Methods')).toBe('*')
|
||||
expect(response.headers.get('Access-Control-Allow-Headers')).toBe('*')
|
||||
expect(response.headers.get('Access-Control-Allow-Credentials')).toBe(null)
|
||||
expect(response.headers.get('vary')).toBe(null)
|
||||
expect(response.headers.get('Access-Control-Max-Age')).toBe('86400')
|
||||
|
||||
const optionsRes = await router.handle(testOptionsRequest, {})
|
||||
|
||||
expect(optionsRes.status).toBe(204)
|
||||
expect(optionsRes.headers.get('Access-Control-Allow-Origin')).toBe('*')
|
||||
expect(optionsRes.headers.get('Access-Control-Allow-Methods')).toBe('*')
|
||||
expect(optionsRes.headers.get('Access-Control-Allow-Headers')).toBe('*')
|
||||
expect(optionsRes.headers.get('Access-Control-Allow-Credentials')).toBe(null)
|
||||
expect(optionsRes.headers.get('vary')).toBe(null)
|
||||
expect(optionsRes.headers.get('Access-Control-Max-Age')).toBe('86400')
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('params', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/bar/foo')
|
||||
|
||||
router.get('/:foo/:bar', ({ req }) => {
|
||||
return Response.json(req.params)
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(await response.json()).toMatchObject({ foo: 'bar', bar: 'foo' })
|
||||
})
|
||||
|
||||
test('query', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/?foo=bar&bar=foo')
|
||||
|
||||
router.get('/', ({ req }) => {
|
||||
return Response.json(req.query)
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(await response.json()).toMatchObject({ foo: 'bar', bar: 'foo' })
|
||||
})
|
||||
|
||||
test('404', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/')
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(404)
|
||||
})
|
||||
|
||||
test('debug mode', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/')
|
||||
|
||||
router.debug()
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(404)
|
||||
|
||||
expect(await response.text()).toBe('Route not found!')
|
||||
})
|
||||
|
||||
test('handler no response', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/')
|
||||
|
||||
router.debug()
|
||||
|
||||
router.get('/', () => {})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(404)
|
||||
|
||||
expect(await response.text()).toBe('Handler did not return a Response!')
|
||||
})
|
||||
|
||||
test('wildcard', async () => {
|
||||
const router = new Router()
|
||||
const testRequest = new Request('https://example.com/foo/bar')
|
||||
const testResponse = new Response('success', { status: 200 })
|
||||
|
||||
router.get('*', () => testResponse)
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('bearer', async () => {
|
||||
const router = new Router()
|
||||
const testToken = 'super-secret-token'
|
||||
const testRequest = new Request('https://example.com/', { headers: { 'Authorization': `Bearer ${testToken}` }})
|
||||
|
||||
router.get('/', ({ req }) => new Response(req.bearer()))
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(await response.text()).toBe(testToken)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Middleware', () => {
|
||||
const router = new Router()
|
||||
const testHandlerSuccess = () => new Response('success', { status: 200 })
|
||||
const testHandlerContinue = () => {}
|
||||
const testHandlerFailed = () => new Response('failed', { status: 403 })
|
||||
|
||||
router.get('/success', testHandlerContinue, testHandlerSuccess)
|
||||
router.get('/failed', testHandlerFailed, testHandlerSuccess)
|
||||
|
||||
test('continue', async () => {
|
||||
const testRequest = new Request('https://example.com/success')
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(await response.text()).toBe('success')
|
||||
})
|
||||
|
||||
test('block', async () => {
|
||||
const testRequest = new Request('https://example.com/failed')
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(response.status).toEqual(403)
|
||||
|
||||
expect(await response.text()).toBe('failed')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Body', () => {
|
||||
|
||||
test('text then text', async () => {
|
||||
const router = new Router()
|
||||
const testText = "lorem ipsum dolor sit amet"
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST', body: testText })
|
||||
|
||||
router.post('/', async ({ req }) => {
|
||||
return Response.json({
|
||||
text: await req.text(),
|
||||
text2: await req.text()
|
||||
})
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(await response.json()).toMatchObject({ text: testText, text2: testText })
|
||||
})
|
||||
|
||||
test('json then json', async () => {
|
||||
const router = new Router()
|
||||
const testObject = { text: 'cloudflare-worker-router', binary: true, amount: 17 }
|
||||
const testJson = JSON.stringify(testObject)
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST', body: testJson })
|
||||
|
||||
router.post('/', async ({ req }) => {
|
||||
return Response.json({
|
||||
json: await req.json(),
|
||||
json2: await req.json()
|
||||
})
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(await response.json()).toMatchObject({ json: testObject, json2: testObject })
|
||||
})
|
||||
|
||||
test('text then json', async () => {
|
||||
const router = new Router()
|
||||
const testObject = { text: 'cloudflare-worker-router', binary: true, amount: 17 }
|
||||
const testJson = JSON.stringify(testObject)
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST', body: testJson })
|
||||
|
||||
router.post('/', async ({ req }) => {
|
||||
return Response.json({
|
||||
text: await req.text(),
|
||||
json: await req.json()
|
||||
})
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(await response.json()).toMatchObject({ text: testJson, json: testObject })
|
||||
})
|
||||
|
||||
test('json then text', async () => {
|
||||
const router = new Router()
|
||||
const testObject = { text: 'cloudflare-worker-router', binary: true, amount: 17 }
|
||||
const testJson = JSON.stringify(testObject)
|
||||
const testRequest = new Request('https://example.com/', { method: 'POST', body: testJson })
|
||||
|
||||
router.post('/', async ({ req }) => {
|
||||
return Response.json({
|
||||
json: await req.json(),
|
||||
text: await req.text()
|
||||
})
|
||||
})
|
||||
|
||||
const response = await router.handle(testRequest, {})
|
||||
|
||||
expect(await response.json()).toMatchObject({ text: testJson, json: testObject })
|
||||
})
|
||||
})
|
||||
@@ -464,4 +464,4 @@ export class Router<Env = any, CtxExt = {}, ReqExt = {}> {
|
||||
|
||||
return response
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user