middlehaven v0.4.2
Middlehaven
Middlehaven makes it easy to create test data through object factories.
Table of contents
Installation
yarn add -D middlehaven
npm install --save-dev middlehaven
Overview
Get started using Middlehaven in your project today. Check out the following examples to get up and running.
Defining a factory
Let's take a look at a trivial libraryFactory
to see how factories in
Middlehaven are built up.
import { createFactory } from 'middlehaven'
const libraryFactory = createFactory({
libraryName: 'Middlehaven',
authorName: 'Glazy',
usage: 'factories',
yearCreated: 2019,
})
Using a factory
Now we have created our libraryFactory
, let us take a look at how we might go
about using it in a test.
// `createFactory` returns an object with both `build` and `insert`.
const { build } = createFactory({ ... })
// Now we can use our `build` function to generate users on the fly. Here we are
// using our factory to check the Library is created and returned successfully.
const library = build()
const dataSourceResponse = await someDataSource.createLibrary(library)
expect(dataSourceResponse.authorName).toEqual(library.authorName))
const { insert } = createFactory({ ... }, {
tableName: 'libraries',
insertFn: (tableName, attributes) => {
// We're using `knex` here in this example but you can use any library you
// want to.
return knex(tableName).insert(attributes)
}
})
insert()
// After running `insert` above we now have our `library` in the database.
// Here we are using our inserted library to check the `getLibraryByAuthorName`
// function works as expected.
const library = await getLibraryByAuthorName('Glazy')
expect(library).not.toBeNull()
expect(library.authorName).toEqual('Glazy')
expect(library.yearCreated).toEqual(2019)
You can also use Middlehaven's insert
function to seed your database.
const { insert } = createFactory({ ... })
[...Array(10).keys()].forEach(() => {
insert()
})
Overrides
If you want to override any values in the factory then you can do so with either
build
or insert
.
const { build, insert } = createFactory({ ... })
build({ overrides: 'here' })
insert({ overrides: 'also here' })
Note: If you want to use a dynamic
function such as sequence
when
overriding then you have to make sure that the value passed into createFactory
initially is also dynamic
.
Dynamic factory data
In order to make a factory property dynamic the value must be a dynamic
template literal.
import { createFactory, dynamic, sequence } from 'middlehaven'
const myFactory = createFactory({
/**
* You can optionally provide an array to `sequence` which will be infinitely
* stepped through.
*/
emailAddress: dynamic`test-email-${sequence()}@middlehaven.lib`,
})
You can run any function you want in a dynamic
template literal so long as it
returns a value which can be interpolated into the string.