Testing utility that generates arbitrary, pseudorandom TypeBox schemas, powered by fast-check
@traversable/typebox-test
has 2 peer dependencies:
@sinclair/typebox
(v0.34)fast-check
$ pnpm add -D @traversable/typebox-test @sinclair/typebox fast-check
Here's an example of importing the library:
import * as T from '@sinclair/typebox'
import { boxTest } from '@traversable/typebox-test'
// see below for specifc examples
boxTest.seedToSchema
Use boxTest.seedToSchema
to convert a seed generated by boxTest.SeedGenerator
into a
TypeBox schema that satisfies the configuration options you specified.
import * as T from '@sinclair/typebox'
import { boxTest } from '@traversable/typebox-test'
import * as fc from 'fast-check'
const builder = boxTest.SeedGenerator()['*']
const [mySeed] = fc.sample(builder.object, 1)
const mySchema = boxTest.seedToSchema(mySeed)
// ^? const mySchema: T.TSchema
boxTest.seedToValidData
Use boxTest.seedToValidData
to convert a seed generated by boxTest.SeedGenerator
into
data that satisfies the schema that the seed represents.
import * as T from '@sinclair/typebox'
import * as Value from '@sinclair/typebox/value'
import { boxTest } from '@traversable/typebox-test'
import * as fc from 'fast-check'
const builder = boxTest.SeedGenerator()['*']
const [mySeed] = fc.sample(builder.object, 1)
const mySchema = boxTest.seedToSchema(mySeed)
// ^? const mySchema: T.TSchema
const validData = boxTest.seedToValidData(mySeed)
Value.Check(mySchema, validData) // always `true`
boxTest.seedToInvalidData
Use boxTest.seedToInvalidData
to convert a seed generated by boxTest.SeedGenerator
into
data that does not satisfy the schema that the seed represents.
import * as T from '@sinclair/typebox'
import * as Value from '@sinclair/typebox/value'
import { boxTest } from '@traversable/typebox-test'
import * as fc from 'fast-check'
const builder = boxTest.SeedGenerator()['*']
const [mySeed] = fc.sample(builder.object, 1)
const mySchema = boxTest.seedToSchema(mySeed)
// ^? const mySchema: T.TSchema
const invalidData = boxTest.seedToValidData(mySeed)
Value.Check(mySchema, invalidData) // always `false`
boxTest.SeedGenerator
Generates a configurable, pseudo-random "seed builder".
boxTest.seedToSchema
to convert a seed into a TypeBox schemaboxTest.seedToValidData
to convert a seed into valid databoxTest.seedToInvalidData
to convert a seed into invalid dataimport * as T from '@sinclair/typebox'
import { boxTest } from '@traversable/typebox-test'
import * as fc from 'fast-check'
const builder = boxTest.SeedGenerator({
include: ["boolean", "string", "object"],
// 𐙘 use `include` to only include certain schema types
exclude: ["boolean", "any"],
// 𐙘 use `exclude` to exclude certain schema types altogether (overrides `include`)
minDepth: 1,
// 𐙘 use `minDepth` to control the schema's minimum depth
// **NOTE:** schemas can get very large!
// using in your CI/CD pipeline is _not_ recommended
object: { maxKeys: 5 },
// 𐙘 specific arbitraries are configurable by name
})
// included schemas are present as properties on your generator...
builder.string
builder.object
// ...excluded schemas are not present...
builder.boolean // 🚫 TypeError
// ...a special wildcard `"*"` property (pronounced "surprise me") is always present:
builder["*"]
/**
* `fast-check` will generate a seed, which is a data structure containing
* integers that represent a kind of AST.
*
* To use a seed, you need to pass it to an interpreter like `boxTest.seedToSchema`,
* `boxTest.seedToValidData` or `boxTest.seedToInvalidData`:
*/
const [mySeed] = fc.sample(builder.object, 1)
const mySchema = boxTest.seedToSchema(mySeed)
// ^? const mySchema: T.TSchema
const validData = boxTest.seedToValidData(mySeed)
// ^? since the `mySeed` was also used to generate `mySchema`,
// parsing `validData` should always succeed
const invalidData = boxTest.seedToInvalidData(mySeed)
// ^? since the `mySeed` was also used to generate `mySchema`,
// parsing `invalidData` should always fail