1
0

8 Commits

Author SHA1 Message Date
71fcd6c3c0 3.2.1 2024-01-20 02:25:07 +01:00
e55392d890 remove connect and trace method 2024-01-20 02:24:38 +01:00
3aaecd8877 3.2.0 2024-01-20 02:22:15 +01:00
d8d13c4339 add npm test command 2024-01-20 02:19:22 +01:00
09d5586cc6 add more tests 2024-01-20 02:15:55 +01:00
110bfdd95c even more tests 2024-01-20 02:15:55 +01:00
c68a979614 working on testing 2024-01-20 02:15:55 +01:00
a4fd646d6b remove connect and trace methods 2024-01-20 02:15:34 +01:00
6 changed files with 4252 additions and 30 deletions

View File

@@ -240,7 +240,6 @@ Key | Type | Default Value
### Supported Methods ### Supported Methods
- `router.any(url, [...handlers])` - `router.any(url, [...handlers])`
- `router.connect(url, [...handlers])`
- `router.delete(url, [...handlers])` - `router.delete(url, [...handlers])`
- `router.get(url, [...handlers])` - `router.get(url, [...handlers])`
- `router.head(url, [...handlers])` - `router.head(url, [...handlers])`
@@ -248,7 +247,6 @@ Key | Type | Default Value
- `router.patch(url, [...handlers])` - `router.patch(url, [...handlers])`
- `router.post(url, [...handlers])` - `router.post(url, [...handlers])`
- `router.put(url, [...handlers])` - `router.put(url, [...handlers])`
- `router.trace(url, [...handlers])`
#### `url` (string) #### `url` (string)
@@ -410,4 +408,4 @@ export default {
return router.handle(request, env, ctx) return router.handle(request, env, ctx)
} }
} }
``` ```

9
jest.config.ts Normal file
View File

@@ -0,0 +1,9 @@
import type { Config } from 'jest'
const config: Config = {
preset: 'ts-jest',
testEnvironment: 'node',
verbose: true
}
export default config

3869
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,12 @@
{ {
"name": "@tsndr/cloudflare-worker-router", "name": "@tsndr/cloudflare-worker-router",
"version": "3.1.3", "version": "3.2.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",
"scripts": { "scripts": {
"build": "tsc" "build": "tsc",
"test": "jest"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -32,6 +33,11 @@
"homepage": "https://github.com/tsndr/cloudflare-worker-router#readme", "homepage": "https://github.com/tsndr/cloudflare-worker-router#readme",
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "^4.20231025.0", "@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" "typescript": "^5.2.2"
} }
} }

366
src/index.spec.ts Normal file
View 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 })
})
})

View File

@@ -175,17 +175,6 @@ export class Router<Env = any, CtxExt = {}, ReqExt = {}> {
return this return this
} }
/**
* Register CONNECT route
*
* @param {string} url
* @param {RouterHandler[]} handlers
* @returns {Router}
*/
public connect(url: string, ...handlers: RouterHandler<Env, CtxExt, ReqExt>[]): Router<Env, CtxExt, ReqExt> {
return this.register('CONNECT', url, handlers)
}
/** /**
* Register DELETE route * Register DELETE route
* *
@@ -263,17 +252,6 @@ export class Router<Env = any, CtxExt = {}, ReqExt = {}> {
return this.register('PUT', url, handlers) return this.register('PUT', url, handlers)
} }
/**
* Register TRACE route
*
* @param {string} url
* @param {RouterHandler[]} handlers
* @returns {Router}
*/
public trace(url: string, ...handlers: RouterHandler<Env, CtxExt, ReqExt>[]): Router<Env, CtxExt, ReqExt> {
return this.register('TRACE', url, handlers)
}
/** /**
* Register route, ignoring method * Register route, ignoring method
* *
@@ -464,4 +442,4 @@ export class Router<Env = any, CtxExt = {}, ReqExt = {}> {
return response return response
} }
} }