Some useful helpers for tests in AVA.
Install ava-patterns by running:
yarn add ava-patterns
Create a temporary directory and delete it (and its contents) at the end of the test.
Takes the following options (all of which are optional):
prefix
: The directory in which to create the temporary directory. Defaults to a suitable location based on the host system (e.g./tmp
).
Returns an object with the following members:
path
: The absolute path to the temporary directory.writeFile(filePath, fileContents)
: Write a file with path relative to the temporary directory, returning the absolute path to the file. Any leading whitespace in the file contents is stripped. If the file starts with a shebang, it is given executable permissions.
import process from 'node:process'
import test from 'ava'
import {useTemporaryDirectory} from 'ava-patterns'
test('writing files to a temporary directory', async (t) => {
const directory = await useTemporaryDirectory(t)
await directory.writeFile('file.txt', `
Hello World!
`)
t.pass()
})
test('creating temporary directories in a specified location', async (t) => {
const directory = await useTemporaryDirectory(t, { prefix: process.cwd() })
await directory.writeFile('file.txt', `
Hello World!
`)
t.pass()
})
Spawn a process and kill it at the end of the test.
The second argument supports the following options:
command
: The command line command as an array of strings.env
: An object of environment variables.cwd
: The working directory in which to run the command
Returns an object with the following members:
output
: A string containing all of the output from stdout and stderr.events
: AnEventEmitter
that emits the following events:stdout
: Any output written to standard outputstderr
: Any output written to standard erroroutput
: Any output written to either standard output or errorexit
: The exit code after the process ends
waitForOutput(pattern, timeout = 1000)
: Enables waiting for a given substring or regular expression to be output, for up to a given timeout.waitUntilExit()
: Returns a promise that will resolve with the exit code.childProcess
: The underlying instance ofChildProcess
import test from 'ava'
import {runProcess} from 'ava-patterns'
import got from 'got'
test('running a Node server', async (t) => {
const script = `
import * as http from 'http'
const server = http.createServer((request, response) => {
response.end('Hello World!')
})
server.listen(10000, () => {
console.log('Listening')
})
`
const program = runProcess(t, {
command: ['node', '--input-type', 'module', '--eval', script]
})
await program.waitForOutput('Listening')
t.is(program.output, 'Listening\n')
const response = await got('http://localhost:10000')
t.is(response.body, 'Hello World!')
})
Wait for a given number of milliseconds.
import test from 'ava'
import {wait} from 'ava-patterns'
test('writing files', async (t) => {
// perform action and wait for results
await wait(500)
// check results
})
Make an HTTP request.
It takes in an object with properties method
, url
, optional headers
, and
an optional body
and returns an object with properties status
, headers
,
and body
.
import {http} from 'ava-patterns'
test('sending HTTP requests', async (t) => {
const response = await http({
method: 'POST',
url: 'https://httpbin.org/post',
body: 'Hello World!'
})
t.like(JSON.parse(response.body), {data: 'Hello World!'})
})