From 0b84c032a493e8008081d3751e0b24f0c5f9c06e Mon Sep 17 00:00:00 2001 From: shadrach68 Date: Mon, 1 Jun 2026 10:21:34 +0100 Subject: [PATCH 1/3] first part solved --- src/modules/creator/creator.service.test.ts | 22 +++------ .../creators/creator-list-item.mapper.test.ts | 9 ++-- .../seeded-creator-fixtures.utils.test.ts | 37 +++++++++++++++ .../test/seeded-creator-fixtures.utils.ts | 46 +++++++++++++++++++ 4 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 src/utils/test/seeded-creator-fixtures.utils.test.ts create mode 100644 src/utils/test/seeded-creator-fixtures.utils.ts diff --git a/src/modules/creator/creator.service.test.ts b/src/modules/creator/creator.service.test.ts index d4c1a61..f128179 100644 --- a/src/modules/creator/creator.service.test.ts +++ b/src/modules/creator/creator.service.test.ts @@ -1,5 +1,6 @@ import { getPaginatedCreators } from './creator.service'; import { prisma } from '../../utils/prisma.utils'; +import { createSeededCreatorFixture } from '../../utils/test/seeded-creator-fixtures.utils'; import { CreatorSortOptions } from './creator.utils'; import { CREATOR_LIST_DEFAULT_SELECT } from '../../constants/creator-list-projection.constants'; @@ -17,17 +18,6 @@ const count = prisma.creatorProfile.count as jest.Mock; const baseSort: CreatorSortOptions = { field: 'createdAt', order: 'desc' }; -function makeCreator(overrides: Record = {}) { - return { - id: 'creator-1', - handle: 'alice', - displayName: 'Alice', - avatarUrl: null, - isVerified: false, - ...overrides, - }; -} - describe('getPaginatedCreators', () => { beforeEach(() => { findMany.mockReset(); @@ -52,8 +42,8 @@ describe('getPaginatedCreators', () => { it('returns the resolved creators and the matching pagination metadata', async () => { const creators = [ - makeCreator(), - makeCreator({ id: 'creator-2', handle: 'bob' }), + createSeededCreatorFixture(1), + createSeededCreatorFixture(2), ]; findMany.mockResolvedValue(creators); count.mockResolvedValue(35); @@ -76,7 +66,7 @@ describe('getPaginatedCreators', () => { }); it('flags hasNextPage=false when on the last page', async () => { - findMany.mockResolvedValue([makeCreator()]); + findMany.mockResolvedValue([createSeededCreatorFixture(1)]); count.mockResolvedValue(15); const result = await getPaginatedCreators({ @@ -91,7 +81,7 @@ describe('getPaginatedCreators', () => { }); it('flags hasPrevPage=false when on the first page', async () => { - findMany.mockResolvedValue([makeCreator()]); + findMany.mockResolvedValue([createSeededCreatorFixture(1)]); count.mockResolvedValue(15); const result = await getPaginatedCreators({ @@ -146,7 +136,7 @@ describe('getPaginatedCreators', () => { }); expect(findMany).toHaveBeenCalledWith( - expect.objectContaining({ + expect.objectContaining({ orderBy: { displayName: 'asc' }, select: CREATOR_LIST_DEFAULT_SELECT, }) diff --git a/src/modules/creators/creator-list-item.mapper.test.ts b/src/modules/creators/creator-list-item.mapper.test.ts index fb4e6db..ac17af6 100644 --- a/src/modules/creators/creator-list-item.mapper.test.ts +++ b/src/modules/creators/creator-list-item.mapper.test.ts @@ -1,15 +1,16 @@ import { strict as assert } from 'assert'; import { mapCreatorListItem } from './creator-list-item.mapper'; +import { createSeededCreatorFixture } from '../../utils/test/seeded-creator-fixtures.utils'; function run() { - const input = { id: '1', displayName: 'John', avatarUrl: null } as any; + const input = createSeededCreatorFixture(1); const result = mapCreatorListItem(input); assert.deepEqual(result, { - id: '1', - name: 'John', - avatar: null, + id: 'creator-1', + name: 'Creator 1', + avatar: 'https://example.com/avatar-1.png', followers: 0, }); diff --git a/src/utils/test/seeded-creator-fixtures.utils.test.ts b/src/utils/test/seeded-creator-fixtures.utils.test.ts new file mode 100644 index 0000000..3a5be11 --- /dev/null +++ b/src/utils/test/seeded-creator-fixtures.utils.test.ts @@ -0,0 +1,37 @@ +import { createSeededCreatorFixture } from './seeded-creator-fixtures.utils'; + +describe('createSeededCreatorFixture', () => { + it('produces deterministic records for the same seed', () => { + const first = createSeededCreatorFixture(5); + const second = createSeededCreatorFixture(5); + + expect(first).toEqual(second); + }); + + it('produces distinct records for different seeds', () => { + const seedOne = createSeededCreatorFixture(1); + const seedTwo = createSeededCreatorFixture(2); + + expect(seedOne).not.toEqual(seedTwo); + expect(seedOne.id).toBe('creator-1'); + expect(seedTwo.id).toBe('creator-2'); + }); + + it('derives stable field values from the seed', () => { + const fixture = createSeededCreatorFixture(3); + + expect(fixture).toMatchObject({ + id: 'creator-3', + userId: 'user-3', + handle: 'creator-3', + displayName: 'Creator 3', + avatarUrl: 'https://example.com/avatar-3.png', + bio: 'Bio for creator 3', + perkSummary: 'Perks for creator 3', + isVerified: false, + }); + expect(fixture.updatedAt.getTime()).toBe( + fixture.createdAt.getTime() + 1000 + ); + }); +}); diff --git a/src/utils/test/seeded-creator-fixtures.utils.ts b/src/utils/test/seeded-creator-fixtures.utils.ts new file mode 100644 index 0000000..97272cf --- /dev/null +++ b/src/utils/test/seeded-creator-fixtures.utils.ts @@ -0,0 +1,46 @@ +import { CreatorProfile } from '../../types/profile.types'; + +const CREATOR_FIXTURE_BASE_DATE = new Date(Date.UTC(2020, 0, 1)); + +/** + * Generates a deterministic creator record from a numeric seed. + * + * Field mapping: + * - id: `creator-${seed}` + * - userId: `user-${seed}` + * - handle: `creator-${seed}` + * - displayName: `Creator ${seed}` + * - avatarUrl: `https://example.com/avatar-${seed}.png` + * - bio: `Bio for creator ${seed}` + * - perkSummary: `Perks for creator ${seed}` + * - perks: [] + * - isVerified: true for even seeds, false for odd seeds + * - createdAt: 2020-01-01 UTC plus `seed` days + * - updatedAt: `createdAt` plus 1 second + * + * This helper is intentionally stable: the same seed always returns the same object, + * and different seeds produce distinct creator values. + */ +export function createSeededCreatorFixture( + seed: number, + overrides: Partial = {} +): CreatorProfile { + const normalizedSeed = Math.max(0, Math.floor(seed)); + const createdAt = new Date(CREATOR_FIXTURE_BASE_DATE); + createdAt.setUTCDate(createdAt.getUTCDate() + normalizedSeed); + + return { + id: `creator-${normalizedSeed}`, + userId: `user-${normalizedSeed}`, + handle: `creator-${normalizedSeed}`, + displayName: `Creator ${normalizedSeed}`, + bio: `Bio for creator ${normalizedSeed}`, + avatarUrl: `https://example.com/avatar-${normalizedSeed}.png`, + perkSummary: `Perks for creator ${normalizedSeed}`, + perks: [], + isVerified: normalizedSeed % 2 === 0, + createdAt, + updatedAt: new Date(createdAt.getTime() + 1000), + ...overrides, + }; +} From 81041829528c047389c36191b5d6456eb29dc437 Mon Sep 17 00:00:00 2001 From: shadrach68 Date: Mon, 1 Jun 2026 10:30:12 +0100 Subject: [PATCH 2/3] test: add helper for stable seeded creator fixtures (#396) --- src/utils/test/seeded-creator-fixtures.utils.test.ts | 8 ++++++++ src/utils/test/seeded-creator-fixtures.utils.ts | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/utils/test/seeded-creator-fixtures.utils.test.ts b/src/utils/test/seeded-creator-fixtures.utils.test.ts index 3a5be11..d31bb66 100644 --- a/src/utils/test/seeded-creator-fixtures.utils.test.ts +++ b/src/utils/test/seeded-creator-fixtures.utils.test.ts @@ -34,4 +34,12 @@ describe('createSeededCreatorFixture', () => { fixture.createdAt.getTime() + 1000 ); }); + + it('respects overridden createdAt when deriving updatedAt', () => { + const customDate = new Date('2025-01-01T00:00:00.000Z'); + const fixture = createSeededCreatorFixture(4, { createdAt: customDate }); + + expect(fixture.createdAt).toEqual(customDate); + expect(fixture.updatedAt.getTime()).toBe(customDate.getTime() + 1000); + }); }); diff --git a/src/utils/test/seeded-creator-fixtures.utils.ts b/src/utils/test/seeded-creator-fixtures.utils.ts index 97272cf..b7f8c67 100644 --- a/src/utils/test/seeded-creator-fixtures.utils.ts +++ b/src/utils/test/seeded-creator-fixtures.utils.ts @@ -28,6 +28,7 @@ export function createSeededCreatorFixture( const normalizedSeed = Math.max(0, Math.floor(seed)); const createdAt = new Date(CREATOR_FIXTURE_BASE_DATE); createdAt.setUTCDate(createdAt.getUTCDate() + normalizedSeed); + const finalCreatedAt = overrides.createdAt ?? createdAt; return { id: `creator-${normalizedSeed}`, @@ -39,8 +40,9 @@ export function createSeededCreatorFixture( perkSummary: `Perks for creator ${normalizedSeed}`, perks: [], isVerified: normalizedSeed % 2 === 0, - createdAt, - updatedAt: new Date(createdAt.getTime() + 1000), + createdAt: finalCreatedAt, + updatedAt: + overrides.updatedAt ?? new Date(finalCreatedAt.getTime() + 1000), ...overrides, }; } From e87f553c01f2754c938c0e91856e909093a968b3 Mon Sep 17 00:00:00 2001 From: shadrach68 Date: Mon, 1 Jun 2026 10:42:45 +0100 Subject: [PATCH 3/3] fix: resolve parsing error in mapper test --- src/modules/creators/creator-list-item.mapper.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/creators/creator-list-item.mapper.test.ts b/src/modules/creators/creator-list-item.mapper.test.ts index ac17af6..718b7bb 100644 --- a/src/modules/creators/creator-list-item.mapper.test.ts +++ b/src/modules/creators/creator-list-item.mapper.test.ts @@ -14,7 +14,7 @@ function run() { followers: 0, }); - console.log('creator-list-item.mapper test passed'); + console.log('creator-list-item.mapper test passed'); } run();