Skip to main content

Data Factories

Available in: Business, Enterprise tiers

Type-safe builders for realistic mock data with optional Prisma persistence.

Why Use Data Factories

Problem: Creating test data is tedious:

  • Manually writing test data for every test
  • Data doesn't match real schema structure
  • Hard to create valid related data
  • No easy way to persist to database

Solution: Generate factories that build type-safe test data with realistic values.

Benefits

  • Type-Safe: Follows your Prisma schema exactly
  • Realistic Data: Sensible defaults for all fields
  • Relationships: Handle nested data easily
  • Optional Persistence: Build in-memory or save to database

Prerequisites

# Core dependencies
pnpm add @prisma/client

# PZG Pro license required

Generate

Add to your schema.prisma:

generator pzgPro {
provider = "node ./lib/cli/pzg-pro.js"
output = "./generated/pro"
enableFactories = true
}

Then run:

prisma generate

Generated Files

generated/
pro/
factories/
factories.ts # Factory functions for each model

Basic Usage

import { userFactory, postFactory } from '@/generated/pro/factories/factories'

// Build in-memory (no database)
const user = userFactory.build({
email: 'test@example.com'
})

// Build many
const users = userFactory.buildMany(10)

// With custom values
const admin = userFactory.build({
email: 'admin@example.com',
role: 'ADMIN'
})

Persistence (Optional)

When Prisma client is available:

// Create in database
const user = await userFactory.create({
email: 'db@example.com'
})

// Create many
const users = await userFactory.createMany(5)

// With relationships
const userWithPosts = await userFactory.create({
posts: {
create: [
postFactory.build({ title: 'First Post' }),
postFactory.build({ title: 'Second Post' })
]
}
})

Testing Example

import { describe, it, expect } from 'vitest'
import { userFactory } from '@/generated/pro/factories/factories'

describe('User API', () => {
it('creates a user', async () => {
const userData = userFactory.build()

const response = await fetch('/api/users', {
method: 'POST',
body: JSON.stringify(userData)
})

expect(response.ok).toBe(true)
})
})

See Also