0
0
mirror of https://github.com/honojs/hono.git synced 2024-11-22 11:17:33 +01:00
hono/runtime_tests/bun/index.test.tsx
watany 76a2c7f523
chore(ci): bun v1 (#1599)
* chore(ci): bun v1

* bun use jsx

* bun version
2023-10-20 18:18:05 +09:00

201 lines
6.3 KiB
TypeScript

import { describe, expect, it } from 'bun:test'
import { serveStatic } from '../../src/adapter/bun'
import { Context } from '../../src/context'
import { env, getRuntimeKey } from '../../src/helper/adapter'
import { Hono } from '../../src/index'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { jsx } from '../../src/jsx'
import { basicAuth } from '../../src/middleware/basic-auth'
import { jwt } from '../../src/middleware/jwt'
import { HonoRequest } from '../../src/request'
// Test just only minimal patterns.
// Because others are tested well in Cloudflare Workers environment already.
describe('Basic', () => {
const app = new Hono()
app.get('/a/:foo', (c) => {
c.header('x-param', c.req.param('foo'))
c.header('x-query', c.req.query('q'))
return c.text('Hello Bun!')
})
it('Should return 200 Response', async () => {
const req = new Request('http://localhost/a/foo?q=bar')
const res = await app.request(req)
expect(res.status).toBe(200)
expect(await res.text()).toBe('Hello Bun!')
expect(res.headers.get('x-param')).toBe('foo')
expect(res.headers.get('x-query')).toBe('bar')
})
it('returns current runtime (bun)', async () => {
expect(getRuntimeKey()).toBe('bun')
})
})
describe('Environment Variables', () => {
it('Should return the environment variable', async () => {
const c = new Context(new HonoRequest(new Request('http://localhost/')))
const { NAME } = env<{ NAME: string }>(c)
expect(NAME).toBe('Bun')
})
})
describe('Basic Auth Middleware', () => {
const app = new Hono()
const username = 'hono-user-a'
const password = 'hono-password-a'
app.use(
'/auth/*',
basicAuth({
username,
password,
})
)
app.get('/auth/*', () => new Response('auth'))
it('Should not authorize, return 401 Response', async () => {
const req = new Request('http://localhost/auth/a')
const res = await app.request(req)
expect(res.status).toBe(401)
expect(await res.text()).toBe('Unauthorized')
})
it('Should authorize, return 200 Response', async () => {
const credential = 'aG9uby11c2VyLWE6aG9uby1wYXNzd29yZC1h'
const req = new Request('http://localhost/auth/a')
req.headers.set('Authorization', `Basic ${credential}`)
const res = await app.request(req)
expect(res.status).toBe(200)
expect(await res.text()).toBe('auth')
})
})
describe('Serve Static Middleware', () => {
const app = new Hono()
app.all('/favicon.ico', serveStatic({ path: './runtime_tests/bun/favicon.ico' }))
app.all(
'/favicon-notfound.ico',
serveStatic({ path: './runtime_tests/bun/favicon-notfound.ico' })
)
app.use('/favicon-notfound.ico', async (c, next) => {
await next()
c.header('X-Custom', 'Bun')
})
app.get(
'/static/*',
serveStatic({
root: './runtime_tests/bun/',
})
)
app.get(
'/dot-static/*',
serveStatic({
root: './runtime_tests/bun/',
rewriteRequestPath: (path) => path.replace(/^\/dot-static/, './.static'),
})
)
it('Should return static file correctly', async () => {
const res = await app.request(new Request('http://localhost/favicon.ico'))
await res.arrayBuffer()
expect(res.status).toBe(200)
expect(res.headers.get('Content-Type')).toBe('image/x-icon')
})
it('Should return 404 response', async () => {
const res = await app.request(new Request('http://localhost/favicon-notfound.ico'))
expect(res.status).toBe(404)
expect(res.headers.get('X-Custom')).toBe('Bun')
})
it('Should return 200 response - /static/plain.txt', async () => {
const res = await app.request(new Request('http://localhost/static/plain.txt'))
expect(res.status).toBe(200)
expect(await res.text()).toBe('Bun!')
})
it('Should return 200 response - /dot-static/plain.txt', async () => {
const res = await app.request(new Request('http://localhost/dot-static/plain.txt'))
expect(res.status).toBe(200)
expect(await res.text()).toBe('Bun!!')
})
})
// Bun support WebCrypto since v0.2.2
// So, JWT middleware works well.
describe('JWT Auth Middleware', () => {
const app = new Hono()
app.use('/jwt/*', jwt({ secret: 'a-secret' }))
app.get('/jwt/a', (c) => c.text('auth'))
it('Should not authorize, return 401 Response', async () => {
const req = new Request('http://localhost/jwt/a')
const res = await app.request(req)
expect(res.status).toBe(401)
expect(await res.text()).toBe('Unauthorized')
})
it('Should authorize, return 200 Response', async () => {
const credential =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXNzYWdlIjoiaGVsbG8gd29ybGQifQ.B54pAqIiLbu170tGQ1rY06Twv__0qSHTA0ioQPIOvFE'
const req = new Request('http://localhost/jwt/a')
req.headers.set('Authorization', `Bearer ${credential}`)
const res = await app.request(req)
expect(res.status).toBe(200)
expect(await res.text()).toBe('auth')
})
})
// To enable JSX middleware,
// set "jsxImportSource": "hono/jsx" in the tsconfig.json
describe('JSX Middleware', () => {
const app = new Hono()
const Layout = (props: { children?: string }) => {
return <html>{props.children}</html>
}
app.get('/', (c) => {
return c.html(<h1>Hello</h1>)
})
app.get('/nest', (c) => {
return c.html(
<h1>
<a href='/top'>Hello</a>
</h1>
)
})
app.get('/layout', (c) => {
return c.html(
<Layout>
<p>hello</p>
</Layout>
)
})
it('Should return rendered HTML', async () => {
const res = await app.request(new Request('http://localhost/'))
expect(res.status).toBe(200)
expect(res.headers.get('Content-Type')).toBe('text/html; charset=UTF-8')
expect(await res.text()).toBe('<h1>Hello</h1>')
})
it('Should return rendered HTML with nest', async () => {
const res = await app.request(new Request('http://localhost/nest'))
expect(res.status).toBe(200)
expect(res.headers.get('Content-Type')).toBe('text/html; charset=UTF-8')
expect(await res.text()).toBe('<h1><a href="/top">Hello</a></h1>')
})
it('Should return rendered HTML with Layout', async () => {
const res = await app.request(new Request('http://localhost/layout'))
expect(res.status).toBe(200)
expect(res.headers.get('Content-Type')).toBe('text/html; charset=UTF-8')
expect(await res.text()).toBe('<html><p>hello</p></html>')
})
})