Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert from ava tests to jest #314

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Convert from ava tests to jest
jamonholmgren committed Jul 4, 2023
commit cc83a8660daf1bbdf079a2b444f1c47d4c4a10e3
4 changes: 2 additions & 2 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"presets": ["es2015"],
"ignore": "test/*",
"presets": ["@babel/env"],
"ignore": [],
"env": {
"development": {
"sourceMaps": "inline"
19 changes: 6 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
@@ -5,24 +5,18 @@
"email": "[email protected]",
"url": "https://github.com/infinitered/ignite"
},
"ava": {
"require": [
"babel-core/register"
]
},
"dependencies": {
"axios": "^1.4.0"
},
"description": "Axios + standardized errors + request/response transforms.",
"devDependencies": {
"@babel/preset-env": "^7.22.6",
"@semantic-release/git": "^7.0.5",
"@types/node": "14.0.4",
"ava": "0.25.0",
"@types/node": "20.3.3",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.3",
"babel-preset-es2015": "^6.24.1",
"babel-eslint": "^10.1.0",
"husky": "^1.3.1",
"jest": "^29.6.0",
"lint-staged": "^8.1.0",
"np": "3.0.4",
"npm-run-all": "^4.1.5",
@@ -38,7 +32,7 @@
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.17.0",
"tslint-config-standard": "^9.0.0",
"typescript": "5.1.3"
"typescript": "5.1.6"
},
"files": [
"dist/apisauce.js",
@@ -62,12 +56,11 @@
"build": "BABEL_ENV=production rollup -c",
"clean": "rm -rf dist",
"compile": "tsc -p tsconfig.json",
"coverage": "nyc ava",
"prepare": "npm-run-all compile build",
"dist": "npm-run-all clean compile build test",
"lint": "tslint -p .",
"test": "npm-run-all compile test:unit",
"test:unit": "ava -s",
"test:unit": "jest",
"ci:publish": "yarn semantic-release",
"semantic-release": "semantic-release",
"format": "prettier --write \"{**/*.ts,.circleci/**/*.js}\" --loglevel error && tslint -p . --fix",
134 changes: 62 additions & 72 deletions test/async-request-transform.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
@@ -18,46 +17,45 @@ const delay = time =>
setTimeout(resolve, time)
})

test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('attaches an async request transform', t => {
test('attaches an async request transform', () => {
const api = create({ baseURL: `http://localhost:${port}` })
t.truthy(api.addAsyncRequestTransform)
t.truthy(api.asyncRequestTransforms)
t.is(api.asyncRequestTransforms.length, 0)
expect(api.addAsyncRequestTransform).toBeTruthy()
expect(api.asyncRequestTransforms).toBeTruthy()
expect(api.asyncRequestTransforms.length).toBe(0)
api.addAsyncRequestTransform(request => request)
t.is(api.asyncRequestTransforms.length, 1)
expect(api.asyncRequestTransforms.length).toBe(1)
})

test('alters the request data', t => {
test('alters the request data', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.is(count, 0)
expect(count).toBe(0)
count = 1
t.is(req.data.b, 1)
expect(req.data.b).toBe(1)
req.data.b = 2
resolve(req)
})
})
})
return x.post('/post', MOCK).then(response => {
t.is(response.status, 200)
t.is(count, 1)
t.is(response.data.got.b, 2)
})
const response = await x.post('/post', MOCK)
expect(response.status).toBe(200)
expect(count).toBe(1)
expect(response.data.got.b).toBe(2)
})

test('serial async', async t => {
test('serial async', async () => {
const api = create({ baseURL: `http://localhost:${port}` })
let fired = false
api.addAsyncRequestTransform(request => async () => {
@@ -66,20 +64,20 @@ test('serial async', async t => {
fired = true
})
const response = await api.get('/number/200')
t.true(response.ok)
t.is(response.status, 201)
t.true(fired)
expect(response.ok).toBeTruthy()
expect(response.status).toBe(201)
expect(fired).toBeTruthy()
})

test('transformers should run serially', t => {
test('transformers should run serially', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let first = false
let second = false
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.is(second, false)
t.is(first, false)
expect(second).toBeFalsy()
expect(first).toBeFalsy()
first = true
resolve()
})
@@ -88,21 +86,20 @@ test('transformers should run serially', t => {
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.is(first, true)
t.is(second, false)
expect(first).toBeTruthy()
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved
expect(second).toBeFalsy()
second = true
resolve()
})
})
})
return x.post('/post', MOCK).then(response => {
t.is(response.status, 200)
t.is(first, true)
t.is(second, true)
})
const response = await x.post('/post', MOCK)
expect(response.status).toBe(200)
expect(first).toBeTruthy()
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved
expect(second).toBeTruthy()
})

test('survives empty PUTs', t => {
test('survives empty PUTs', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addAsyncRequestTransform(req => {
@@ -113,14 +110,13 @@ test('survives empty PUTs', t => {
})
})
})
t.is(count, 0)
return x.put('/post', {}).then(response => {
t.is(response.status, 200)
t.is(count, 1)
})
expect(count).toBe(0)
const response = await x.put('/post', {})
expect(response.status).toBe(200)
expect(count).toBe(1)
})

test('fires for gets', t => {
test('fires for gets', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addAsyncRequestTransform(req => {
@@ -131,15 +127,14 @@ test('fires for gets', t => {
})
})
})
t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(count, 1)
t.deepEqual(response.data, MOCK)
})
expect(count).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(count).toBe(1)
expect(response.data).toEqual(MOCK)
})

test('url can be changed', t => {
test('url can be changed', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
@@ -149,12 +144,11 @@ test('url can be changed', t => {
})
})
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 200)
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(200)
})

test('params can be added, edited, and deleted', t => {
test('params can be added, edited, and deleted', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
@@ -166,67 +160,63 @@ test('params can be added, edited, and deleted', t => {
})
})
})
return x.get('/number/200', { x: 1, z: 4 }).then(response => {
t.is(response.status, 200)
t.is(response.config.params.x, 2)
t.is(response.config.params.y, 1)
t.falsy(response.config.params.z)
})
const response = await x.get('/number/200', { x: 1, z: 4 })
expect(response.status).toBe(200)
expect(response.config.params.x).toBe(2)
expect(response.config.params.y).toBe(1)
expect(response.config.params.z).toBeFalsy()
})

test('headers can be created', t => {
test('headers can be created', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.falsy(req.headers['X-APISAUCE'])
expect(req.headers['X-APISAUCE']).toBeFalsy()
req.headers['X-APISAUCE'] = 'new'
resolve()
})
})
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.is(response.config.headers['X-APISAUCE'], 'new')
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBe('new')
})

test('headers from creation time can be changed', t => {
test('headers from creation time can be changed', async () => {
const x = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-APISAUCE': 'hello' },
})
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.is(req.headers['X-APISAUCE'], 'hello')
expect(req.headers['X-APISAUCE']).toBe('hello')
req.headers['X-APISAUCE'] = 'change'
resolve()
})
})
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.is(response.config.headers['X-APISAUCE'], 'change')
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBe('change')
})

test('headers can be deleted', t => {
test('headers can be deleted', async () => {
const x = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-APISAUCE': 'omg' },
})
x.addAsyncRequestTransform(req => {
return new Promise((resolve, reject) => {
setImmediate(_ => {
t.is(req.headers['X-APISAUCE'], 'omg')
expect(req.headers['X-APISAUCE']).toBe('omg')
delete req.headers['X-APISAUCE']
resolve()
})
})
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.falsy(response.config.headers['X-APISAUCE'])
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBeFalsy()
})
41 changes: 19 additions & 22 deletions test/async-response-transform.test.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('attaches a async response transform', t => {
test('attaches a async response transform', () => {
const api = create({ baseURL: `http://localhost:${port}` })

console.log(api.asyncResponseTransforms)
t.truthy(api.addAsyncResponseTransform)
t.truthy(api.asyncResponseTransforms)
t.is(api.asyncResponseTransforms.length, 0)
expect(api.addAsyncResponseTransform).toBeTruthy()
expect(api.asyncResponseTransforms).toBeTruthy()
expect(api.asyncResponseTransforms.length).toBe(0)
api.addAsyncResponseTransform(data => data)
t.is(api.asyncResponseTransforms.length, 1)
expect(api.asyncResponseTransforms.length).toBe(1)
})

test('alters the response', t => {
test('alters the response', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addAsyncResponseTransform(({ data }) => {
@@ -38,15 +38,14 @@ test('alters the response', t => {
})
})
})
t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(count, 1)
t.deepEqual(response.data.a, 'hi')
})
expect(count).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(count).toBe(1)
expect(response.data.a).toEqual('hi')
})

test('swap out data on response', t => {
test('swap out data on response', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addAsyncResponseTransform(response => {
@@ -59,10 +58,8 @@ test('swap out data on response', t => {
})
})
})
// t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 222)
t.is(count, 1)
t.deepEqual(response.data.a, [3, 2, 1])
})
const response = await x.get('/number/201')
expect(response.status).toBe(222)
expect(count).toBe(1)
expect(response.data.a).toEqual([3, 2, 1])
})
12 changes: 6 additions & 6 deletions test/async.test.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

let port
let server = null
const MOCK = { a: { b: [1, 2, 3] } }
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after.always('cleanup', t => {
afterAll(() => {
server.close()
})

test('can be used with async/await', async t => {
test('can be used with async/await', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
const response = await x.get('/number/200', { a: 'b' })
t.is(response.status, 200)
t.deepEqual(response.data, MOCK)
expect(response.status).toBe(200)
expect(response.data).toEqual(MOCK)
})
14 changes: 7 additions & 7 deletions test/cancellation.test.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import test from 'ava'
import { beforeAll, afterAll, test } from '@jest/globals'
import { CancelToken, isCancel, create, CANCEL_ERROR } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'

let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('cancel request', t => {
test('cancel request', () => {
const source = CancelToken.source()
const x = create({
baseURL: `http://localhost:${port}`,
@@ -26,8 +26,8 @@ test('cancel request', t => {
}, 20)

return x.get('/sleep/150').then(response => {
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved
t.truthy(isCancel(response.originalError))
t.falsy(response.ok)
t.is(response.problem, CANCEL_ERROR)
expect(isCancel(response.originalError)).toBeTruthy()
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved
expect(response.ok).toBeFalsy()
expect(response.problem).toBe(CANCEL_ERROR)
})
})
28 changes: 14 additions & 14 deletions test/config.test.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
import test from 'ava'
import { create, DEFAULT_HEADERS } from '../lib/apisauce'
import axios from 'axios'
import { expect } from '@jest/globals'
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved

const validConfig = {
baseURL: 'http://localhost:9991',
headers: { 'X-Testing': 'hello' },
}

test('is a function', t => {
t.is(typeof create, 'function')
test('is a function', () => {
expect(typeof create).toBe('function')
})

test('returns an object when we configure correctly', t => {
test('returns an object when we configure correctly', () => {
const x = create(validConfig)
t.truthy(x)
t.truthy(x.axiosInstance)
expect(x).toBeTruthy()
expect(x.axiosInstance).toBeTruthy()
})

test('configures axios correctly', t => {
test('configures axios correctly', () => {
const apisauce = create(validConfig)
const { axiosInstance } = apisauce
t.is(axiosInstance.defaults.timeout, 0)
t.is(axiosInstance.defaults.baseURL, validConfig.baseURL)
t.deepEqual(apisauce.headers, Object.assign({}, DEFAULT_HEADERS, validConfig.headers))
expect(axiosInstance.defaults.timeout).toBe(0)
expect(axiosInstance.defaults.baseURL).toBe(validConfig.baseURL)
expect(apisauce.headers).toEqual(Object.assign({}, DEFAULT_HEADERS, validConfig.headers))
})

test('configures axios correctly with passed instance', t => {
test('configures axios correctly with passed instance', () => {
const customAxiosInstance = axios.create({ baseURL: validConfig.baseURL })
const apisauce = create({ axiosInstance: customAxiosInstance, headers: validConfig.headers })
const { axiosInstance } = apisauce
t.is(axiosInstance.defaults.timeout, 0)
t.is(axiosInstance.defaults.baseURL, validConfig.baseURL)
t.deepEqual(apisauce.headers, Object.assign({}, DEFAULT_HEADERS, validConfig.headers))
expect(axiosInstance.defaults.timeout).toBe(0)
expect(axiosInstance.defaults.baseURL).toBe(validConfig.baseURL)
expect(apisauce.headers).toEqual(Object.assign({}, DEFAULT_HEADERS, validConfig.headers))
})
33 changes: 15 additions & 18 deletions test/data.test.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,37 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after.always('cleanup', t => {
afterAll(() => {
server.close()
})

test('has valid data with a 200', t => {
test('has valid data with a 200', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/200', { a: 'b' }).then(response => {
t.is(response.status, 200)
t.deepEqual(response.data, MOCK)
})
const response = await x.get('/number/200', { a: 'b' })
expect(response.status).toBe(200)
expect(response.data).toEqual(MOCK)
})

test('has valid data with a 400s', t => {
test('has valid data with a 400s', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/404').then(response => {
t.is(response.status, 404)
t.deepEqual(response.data, MOCK)
})
const response = await x.get('/number/404')
expect(response.status).toBe(404)
expect(response.data).toEqual(MOCK)
})

test('has valid data with a 500s', t => {
test('has valid data with a 500s', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/500').then(response => {
t.is(response.status, 500)
t.deepEqual(response.data, MOCK)
})
const response = await x.get('/number/500')
expect(response.status).toBe(500)
expect(response.data).toEqual(MOCK)
})
16 changes: 8 additions & 8 deletions test/headers.test.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('jumps the wire with the right headers', async t => {
test('jumps the wire with the right headers', async () => {
const api = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-Testing': 'hello' },
})
api.setHeaders({ 'X-Testing': 'foo', steve: 'hey' })
const response = await api.get('/number/200', { a: 'b' })
t.is(response.config.headers['X-Testing'], 'foo')
t.is(response.config.headers['steve'], 'hey')
expect(response.config.headers['X-Testing']).toBe('foo')
expect(response.config.headers['steve']).toBe('hey')

// then change one of them
api.setHeader('steve', 'thx')
const response2 = await api.get('/number/200', {})
t.is(response2.config.headers['steve'], 'thx')
expect(response2.config.headers['steve']).toBe('thx')

// then remove one of them
api.deleteHeader('steve')
const response3 = await api.get('/number/200', {})
t.is(response3.config.headers['steve'], undefined)
expect(response3.config.headers['steve']).toBeUndefined()
})
42 changes: 20 additions & 22 deletions test/monitor.test.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, expect, test } from '@jest/globals'
jamonholmgren marked this conversation as resolved.
Show resolved Hide resolved

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('attaches a monitor', t => {
test('attaches a monitor', () => {
const api = create({ baseURL: `http://localhost:${port}` })
t.truthy(api.addMonitor)
t.truthy(api.monitors)
t.is(api.monitors.length, 0)
expect(api.addMonitor).toBeTruthy()
expect(api.monitors).toBeTruthy()
expect(api.monitors.length).toBe(0)
api.addMonitor(x => x)
t.is(api.monitors.length, 1)
expect(api.monitors.length).toBe(1)
})

test('fires our monitor function', t => {
test('fires our monitor function', async () => {
let a = 0
let b = 0
const x = create({ baseURL: `http://localhost:${port}` })
@@ -34,15 +34,14 @@ test('fires our monitor function', t => {
x.addMonitor(response => {
b = response.status
})
t.is(a, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(a, 1)
t.is(b, 201)
})
expect(a).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(a).toBe(1)
expect(b).toBe(201)
})

test('ignores exceptions raised inside monitors', t => {
test('ignores exceptions raised inside monitors', async () => {
let a = 0
let b = 0
const x = create({ baseURL: `http://localhost:${port}` })
@@ -55,10 +54,9 @@ test('ignores exceptions raised inside monitors', t => {
x.addMonitor(response => {
b = response.status
})
t.is(a, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(a, 1)
t.is(b, 201)
})
expect(a).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(a).toBe(1)
expect(b).toBe(201)
})
10 changes: 5 additions & 5 deletions test/no-server.test.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import test from 'ava'
import { create, CONNECTION_ERROR } from '../lib/apisauce'
import getFreePort from './_getFreePort'
import { beforeAll, test } from '@jest/globals'

let port
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
})

test('has a response despite no server', t => {
test('has a response despite no server', () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/200', { a: 'b' }).then(response => {
t.is(response.status, null)
t.is(response.problem, CONNECTION_ERROR)
expect(response.status).toBe(null)
expect(response.problem).toBe(CONNECTION_ERROR)
})
})
114 changes: 51 additions & 63 deletions test/params.test.js
Original file line number Diff line number Diff line change
@@ -1,111 +1,99 @@
import test from 'ava'
import { create, NONE } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('GET supports params', t => {
test('GET supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo', { q: 'hello' }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.get('/echo', { q: 'hello' })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('POST supports params', t => {
test('POST supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.post('/echo', null, { params: { q: 'hello' } }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.post('/echo', null, { params: { q: 'hello' } })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('PATCH supports params', t => {
test('PATCH supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.patch('/echo', null, { params: { q: 'hello' } }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.patch('/echo', null, { params: { q: 'hello' } })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('PUT supports params', t => {
test('PUT supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.put('/echo', null, { params: { q: 'hello' } }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.put('/echo', null, { params: { q: 'hello' } })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('DELETE supports params', t => {
test('DELETE supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.delete('/echo', { q: 'hello' }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.delete('/echo', { q: 'hello' })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('LINK supports params', t => {
test('LINK supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.link('/echo', { q: 'hello' }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.link('/echo', { q: 'hello' })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('UNLINK supports params', t => {
test('UNLINK supports params', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.unlink('/echo', { q: 'hello' }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: 'hello' })
})
const response = await x.unlink('/echo', { q: 'hello' })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: 'hello' })
})

test('Empty params are supported', t => {
test('Empty params are supported', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo', {}).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: '' })
})
const response = await x.get('/echo', {})
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: '' })
})

test('Null params are supported', t => {
test('Null params are supported', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo', null).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: '' })
})
const response = await x.get('/echo', null)
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: '' })
})

test('Undefined params are supported', t => {
test('Undefined params are supported', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo').then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: '' })
})
const response = await x.get('/echo')
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: '' })
})

test('Null parameters should be null', t => {
test('Null parameters should be null', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo', { q: null }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: '' })
})
const response = await x.get('/echo', { q: null })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: '' })
})

test('Empty parameters should be empty', t => {
test('Empty parameters should be empty', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/echo', { q: '' }).then(response => {
t.is(response.problem, NONE)
t.deepEqual(response.data, { echo: '' })
})
const response = await x.get('/echo', { q: '' })
expect(response.problem).toBe(NONE)
expect(response.data).toEqual({ echo: '' })
})
33 changes: 15 additions & 18 deletions test/post-data.test.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,37 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('POST has proper data', t => {
test('POST has proper data', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.post('/post', MOCK).then(response => {
t.is(response.status, 200)
t.deepEqual(response.data, { got: MOCK })
})
const response = await x.post('/post', MOCK)
expect(response.status).toBe(200)
expect(response.data).toEqual({ got: MOCK })
})

test('PATCH has proper data', t => {
test('PATCH has proper data', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.patch('/post', MOCK).then(response => {
t.is(response.status, 200)
t.deepEqual(response.data, { got: MOCK })
})
const response = await x.patch('/post', MOCK)
expect(response.status).toBe(200)
expect(response.data).toEqual({ got: MOCK })
})

test('PUT has proper data', t => {
test('PUT has proper data', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.put('/post', MOCK).then(response => {
t.is(response.status, 200)
t.deepEqual(response.data, { got: MOCK })
})
const response = await x.put('/post', MOCK)
expect(response.status).toBe(200)
expect(response.data).toEqual({ got: MOCK })
})
106 changes: 49 additions & 57 deletions test/request-transform.test.js
Original file line number Diff line number Diff line change
@@ -1,134 +1,126 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, expect, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('attaches a request transform', t => {
test('attaches a request transform', () => {
const api = create({ baseURL: `http://localhost:${port}` })
t.truthy(api.addRequestTransform)
t.truthy(api.requestTransforms)
t.is(api.requestTransforms.length, 0)
expect(api.addRequestTransform).toBeTruthy()
expect(api.requestTransforms).toBeTruthy()
expect(api.requestTransforms.length).toBe(0)
api.addRequestTransform(request => request)
t.is(api.requestTransforms.length, 1)
expect(api.requestTransforms.length).toBe(1)
})

test('alters the request data', t => {
test('alters the request data', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addRequestTransform(({ data, url, method }) => {
data.a = 'hi'
count++
})
t.is(count, 0)
return x.post('/post', MOCK).then(response => {
t.is(response.status, 200)
t.is(count, 1)
t.deepEqual(response.data, { got: { a: 'hi' } })
})
expect(count).toBe(0)
const response = await x.post('/post', MOCK)
expect(response.status).toBe(200)
expect(count).toBe(1)
expect(response.data).toEqual({ got: { a: 'hi' } })
})

test('survives empty PUTs', t => {
test('survives empty PUTs', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addRequestTransform(() => {
count++
})
t.is(count, 0)
return x.put('/post', {}).then(response => {
t.is(response.status, 200)
t.is(count, 1)
})
expect(count).toBe(0)
const response = await x.put('/post', {})
expect(response.status).toBe(200)
expect(count).toBe(1)
})

test('fires for gets', t => {
test('fires for gets', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addRequestTransform(({ data, url, method }) => {
count++
})
t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(count, 1)
t.deepEqual(response.data, MOCK)
})
expect(count).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(count).toBe(1)
expect(response.data).toEqual(MOCK)
})

test('url can be changed', t => {
test('url can be changed', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addRequestTransform(request => {
request.url = request.url.replace('/201', '/200')
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 200)
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(200)
})

test('params can be added, edited, and deleted', t => {
test('params can be added, edited, and deleted', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addRequestTransform(request => {
request.params.x = 2
request.params.y = 1
delete request.params.z
})
return x.get('/number/200', { x: 1, z: 4 }).then(response => {
t.is(response.status, 200)
t.is(response.config.params.x, 2)
t.is(response.config.params.y, 1)
t.falsy(response.config.params.z)
})
const response = await x.get('/number/200', { x: 1, z: 4 })
expect(response.status).toBe(200)
expect(response.config.params.x).toBe(2)
expect(response.config.params.y).toBe(1)
expect(response.config.params.z).toBeFalsy()
})

test('headers can be created', t => {
test('headers can be created', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
x.addRequestTransform(request => {
t.falsy(request.headers['X-APISAUCE'])
expect(request.headers['X-APISAUCE']).toBeFalsy()
request.headers['X-APISAUCE'] = 'new'
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.is(response.config.headers['X-APISAUCE'], 'new')
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBe('new')
})

test('headers from creation time can be changed', t => {
test('headers from creation time can be changed', async () => {
const x = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-APISAUCE': 'hello' },
})
x.addRequestTransform(request => {
t.is(request.headers['X-APISAUCE'], 'hello')
expect(request.headers['X-APISAUCE']).toBe('hello')
request.headers['X-APISAUCE'] = 'change'
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.is(response.config.headers['X-APISAUCE'], 'change')
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBe('change')
})

test('headers can be deleted', t => {
test('headers can be deleted', async () => {
const x = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-APISAUCE': 'omg' },
})
x.addRequestTransform(request => {
t.is(request.headers['X-APISAUCE'], 'omg')
expect(request.headers['X-APISAUCE']).toBe('omg')
delete request.headers['X-APISAUCE']
})
return x.get('/number/201', { x: 1 }).then(response => {
t.is(response.status, 201)
t.falsy(response.config.headers['X-APISAUCE'])
})
const response = await x.get('/number/201', { x: 1 })
expect(response.status).toBe(201)
expect(response.config.headers['X-APISAUCE']).toBeFalsy()
})
41 changes: 19 additions & 22 deletions test/response-transform.test.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,53 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, expect, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('attaches a response transform', t => {
test('attaches a response transform', () => {
const api = create({ baseURL: `http://localhost:${port}` })
t.truthy(api.addResponseTransform)
t.truthy(api.responseTransforms)
t.is(api.responseTransforms.length, 0)
expect(api.addResponseTransform).toBeTruthy()
expect(api.responseTransforms).toBeTruthy()
expect(api.responseTransforms.length).toBe(0)
api.addResponseTransform(response => response)
t.is(api.responseTransforms.length, 1)
expect(api.responseTransforms.length).toBe(1)
})

test('alters the response', t => {
test('alters the response', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addResponseTransform(({ data }) => {
count++
data.a = 'hi'
})
t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(count, 1)
t.deepEqual(response.data.a, 'hi')
})
expect(count).toBe(0)
const response = await x.get('/number/201')
expect(response.status).toBe(201)
expect(count).toBe(1)
expect(response.data.a).toEqual('hi')
})

test('swap out data on response', t => {
test('swap out data on response', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
let count = 0
x.addResponseTransform(response => {
count++
response.status = 222
response.data = { a: response.data.a.b.reverse() }
})
// t.is(count, 0)
return x.get('/number/201').then(response => {
t.is(response.status, 222)
t.is(count, 1)
t.deepEqual(response.data.a, [3, 2, 1])
})
const response = await x.get('/number/201')
expect(response.status).toBe(222)
expect(count).toBe(1)
expect(response.data.a).toEqual([3, 2, 1])
})
16 changes: 8 additions & 8 deletions test/set-base-url.test.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
import test from 'ava'
import { beforeAll, afterAll, test } from '@jest/globals'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('changes the headers', async t => {
test('changes the headers', async () => {
const api = create({
baseURL: `http://localhost:${port}`,
headers: { 'X-Testing': 'hello' },
})
const response1 = await api.get('/number/200')
t.deepEqual(response1.data, MOCK)
expect(response1.data).toEqual(MOCK)

// change the url
const nextUrl = `http://127.0.0.1:${port}`
api.setBaseURL(nextUrl)
t.is(api.getBaseURL(), nextUrl)
expect(api.getBaseURL()).toBe(nextUrl)
const response2 = await api.get('/number/200')
t.deepEqual(response2.data, MOCK)
expect(response2.data).toEqual(MOCK)

// now close the server
server.close()

// and try connecting back to the original one
api.setBaseURL(`http://localhost:${port}`)
const response3 = await api.get('/number/200')
t.is(response3.problem, 'CONNECTION_ERROR')
expect(response3.problem).toBe('CONNECTION_ERROR')
})
16 changes: 8 additions & 8 deletions test/speed.test.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

const MOCK = { a: { b: [1, 2, 3] } }
let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port, MOCK)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('has a duration node', async t => {
test('has a duration node', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
const response = await x.get(`/sleep/150`)
t.is(response.status, 200)
t.truthy(response.duration)
t.truthy(response.duration >= 150)
// t.truthy(response.duration <= 1000) // fragile
expect(response.status).toBe(200)
expect(response.duration).toBeTruthy()
expect(response.duration >= 150).toBeTruthy()
// expect(response.duration <= 1000).toBeTruthy() // fragile
})
24 changes: 12 additions & 12 deletions test/status.test.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
import test from 'ava'
import { create, NONE, CLIENT_ERROR, SERVER_ERROR } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('reads the status code for 200s', t => {
test('reads the status code for 200s', () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/201').then(response => {
t.is(response.status, 201)
t.is(response.problem, NONE)
expect(response.status).toBe(201)
expect(response.problem).toBe(NONE)
})
})

test('reads the status code for 400s', t => {
test('reads the status code for 400s', () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/401').then(response => {
t.is(response.status, 401)
t.is(response.problem, CLIENT_ERROR)
expect(response.status).toBe(401)
expect(response.problem).toBe(CLIENT_ERROR)
})
})

test('reads the status code for 500s', t => {
test('reads the status code for 500s', () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/number/501').then(response => {
t.is(response.status, 501)
t.is(response.problem, SERVER_ERROR)
expect(response.status).toBe(501)
expect(response.problem).toBe(SERVER_ERROR)
})
})
15 changes: 7 additions & 8 deletions test/timeout.test.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
import test from 'ava'
import { create, TIMEOUT_ERROR } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, test } from '@jest/globals'

let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('times out', t => {
test('times out', async () => {
const x = create({ baseURL: `http://localhost:${port}`, timeout: 100 })
return x.get('/sleep/150').then(response => {
t.falsy(response.ok)
t.is(response.problem, TIMEOUT_ERROR)
})
const response = await x.get('/sleep/150')
expect(response.ok).toBeFalsy()
expect(response.problem).toBe(TIMEOUT_ERROR)
})
96 changes: 44 additions & 52 deletions test/verbs.test.js
Original file line number Diff line number Diff line change
@@ -1,91 +1,83 @@
import test from 'ava'
import { create } from '../lib/apisauce'
import createServer from './_server'
import getFreePort from './_getFreePort'
import { beforeAll, afterAll, expect, test } from '@jest/globals'

let port
let server = null
test.before(async t => {
beforeAll(async () => {
port = await getFreePort()
server = await createServer(port)
})

test.after('cleanup', t => {
afterAll(() => {
server.close()
})

test('supports all verbs', t => {
test('supports all verbs', () => {
const x = create({ baseURL: `http://localhost:${port}` })
t.truthy(x.get)
t.truthy(x.post)
t.truthy(x.patch)
t.truthy(x.put)
t.truthy(x.head)
t.truthy(x.delete)
t.truthy(x.link)
t.truthy(x.unlink)
expect(x.get).toBeTruthy()
expect(x.post).toBeTruthy()
expect(x.patch).toBeTruthy()
expect(x.put).toBeTruthy()
expect(x.head).toBeTruthy()
expect(x.delete).toBeTruthy()
expect(x.link).toBeTruthy()
expect(x.unlink).toBeTruthy()
})

test('can make a get', t => {
test('can make a get', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.get('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'get')
})
const response = await x.get('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('get')
})

test('can make a post', t => {
test('can make a post', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.post('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'post')
})
const response = await x.post('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('post')
})

test('can make a patch', t => {
test('can make a patch', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.patch('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'patch')
})
const response = await x.patch('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('patch')
})

test('can make a put', t => {
test('can make a put', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.put('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'put')
})
const response = await x.put('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('put')
})

test('can make a delete', t => {
test('can make a delete', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.delete('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'delete')
})
const response = await x.delete('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('delete')
})

test('can make a head', t => {
test('can make a head', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.head('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'head')
})
const response = await x.head('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('head')
})

test('can make a link', t => {
test('can make a link', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.link('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'link')
})
const response = await x.link('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('link')
})

test('can make a unlink', t => {
test('can make a unlink', async () => {
const x = create({ baseURL: `http://localhost:${port}` })
return x.unlink('/ok').then(response => {
t.truthy(response.ok)
t.is(response.config.method, 'unlink')
})
const response = await x.unlink('/ok')
expect(response.ok).toBeTruthy()
expect(response.config.method).toBe('unlink')
})