up-fetch
Version:
Advanced fetch client builder for typescript.
127 lines (109 loc) • 3.41 kB
text/typescript
import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
import { afterAll, afterEach, beforeAll, describe, expect, test } from 'vitest'
import { up } from '..'
const server = setupServer()
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
const baseUrl = 'https://example.com'
describe('parseResponse', () => {
test('should parse JSON responses by default', async () => {
server.use(
http.get(baseUrl, () => {
return HttpResponse.json({ hello: 'world' }, { status: 200 })
}),
)
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
}))
const data = await upfetch('')
expect(data).toEqual({ hello: 'world' })
})
test('should parse TEXT responses by default', async () => {
server.use(
http.get(baseUrl, () => {
return HttpResponse.text('some text', { status: 200 })
}),
)
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
}))
const data = await upfetch('')
expect(data).toEqual('some text')
})
test('should provide response and request to parseResponse function', async () => {
server.use(
http.get(baseUrl, () => {
return HttpResponse.text('some text', { status: 200 })
}),
)
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
parseResponse(res, request) {
expect(res instanceof Response).toEqual(true)
expect(request.url).toEqual('https://example.com/')
return res.text()
},
}))
await upfetch('')
})
test('should execute parseResponse before onSuccess callback', async () => {
server.use(
http.get(baseUrl, () => {
return HttpResponse.text('some text', { status: 200 })
}),
)
let count = 1
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
parseResponse(res) {
expect(count).toEqual(1)
count++
return res.text()
},
onSuccess() {
expect(count).toEqual(2)
count++
},
}))
await upfetch('')
expect(count).toEqual(3)
})
test('should also receive responses with empty body', async () => {
server.use(
http.get(baseUrl, () => {
return new Response(null, { status: 200 })
}),
)
let count = 1
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
parseResponse(res) {
expect(res.body).toEqual(null)
expect(count).toEqual(1)
count++
return res.text()
},
}))
await upfetch('')
expect(count).toEqual(2)
})
test('should allow upfetch.parseResponse to override up.parseResponse', async () => {
server.use(
http.post(baseUrl, () => {
return HttpResponse.json({ hello: 'world' }, { status: 200 })
}),
)
const upfetch = up(fetch, () => ({
baseUrl: baseUrl,
parseResponse: () => Promise.resolve('from=up'),
}))
const data = await upfetch('', {
body: { a: 1 },
method: 'POST',
parseResponse: () => Promise.resolve('from=upfetch'),
})
expect(data).toEqual('from=upfetch')
})
})