Reusable test data factories for all Nova Rewards domain entities, built with fishery and @faker-js/faker.
Location: novaRewards/backend/tests/fixtures/factories.js
fishery must be installed as a dev dependency:
cd novaRewards/backend
npm install --save-dev fishery| Factory | Prisma Model | File |
|---|---|---|
merchantFactory |
Merchant |
tests/fixtures/factories.js |
campaignFactory |
Campaign |
tests/fixtures/factories.js |
userFactory |
User |
tests/fixtures/factories.js |
rewardIssuanceFactory |
RewardIssuance |
tests/fixtures/factories.js |
const {
merchantFactory,
campaignFactory,
userFactory,
rewardIssuanceFactory,
} = require('./fixtures/factories');
// Build a single object
const merchant = merchantFactory.build();
// Build with field overrides
const campaign = campaignFactory.build({ merchant_id: merchant.id, name: 'VIP Rewards' });
// Build a list
const users = userFactory.buildList(5);Traits are pre-defined param sets for common test scenarios.
// Expired campaign (end_date in the past, is_active: false)
const expired = campaignFactory.build(campaignFactory.params.expired());
// Depleted budget (reward_rate near zero)
const depleted = campaignFactory.build(campaignFactory.params.depletedBudget());// Admin user
const admin = userFactory.build(userFactory.params.admin());// Confirmed on-chain
const confirmed = rewardIssuanceFactory.build(rewardIssuanceFactory.params.confirmed());
// Failed issuance (tx_hash is null)
const failed = rewardIssuanceFactory.build(rewardIssuanceFactory.params.failed());const { campaignFactory } = require('../fixtures/factories');
describe('validateCampaign', () => {
it('rejects an expired campaign', () => {
const campaign = campaignFactory.build(campaignFactory.params.expired());
expect(() => validateCampaign(campaign)).toThrow('Campaign has expired');
});
});const request = require('supertest');
const app = require('../server');
const { merchantFactory, campaignFactory } = require('./fixtures/factories');
it('POST /campaigns returns 201', async () => {
const merchant = merchantFactory.build();
// Seed merchant into DB or mock the repository, then:
const body = campaignFactory.build({ merchant_id: merchant.id });
const res = await request(app)
.post('/api/campaigns')
.set('x-api-key', merchant.api_key)
.send(body);
expect(res.status).toBe(201);
});- Define the factory in
tests/fixtures/factories.jsfollowing the existing pattern. - Add traits for common scenarios using
Factory.params. - Export it from the module.
- Add a smoke test in
tests/factories.test.js. - Update the table in this document.