feat(features): add test factories to all 5 features
Adds src/__factories__/<entity>.factory.ts to auth, blog, marketing-pages, navigation, media. Each factory uses defineFactory from @repo/core-testing with stable date defaults (2026-01-01) so snapshot diffs reflect SUT behavior only. Refactors mechanical inline-fixture tests to use factories. Also adds vitest.config.ts and tsconfig path alias to @repo/media (lacked both), and adds @repo/core-testing devDependency to @repo/media. Spec: §5.1, §6.3
This commit is contained in:
2
packages/auth/src/__factories__/index.ts
Normal file
2
packages/auth/src/__factories__/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export { userFactory } from "./user.factory.js";
|
||||
export { sessionFactory } from "./session.factory.js";
|
||||
26
packages/auth/src/__factories__/session.factory.test.ts
Normal file
26
packages/auth/src/__factories__/session.factory.test.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { describe, it, expect, beforeEach } from "vitest";
|
||||
import { sessionFactory } from "@/__factories__/session.factory";
|
||||
|
||||
describe("sessionFactory", () => {
|
||||
beforeEach(() => sessionFactory.reset());
|
||||
|
||||
it("returns a Session with stable defaults", () => {
|
||||
const s = sessionFactory.build();
|
||||
expect(s.id).toBe("session-1");
|
||||
expect(s.userId).toBe("user-1");
|
||||
expect(s.expiresAt).toBeInstanceOf(Date);
|
||||
});
|
||||
|
||||
it("applies overrides", () => {
|
||||
const s = sessionFactory.build({ userId: "user-42" });
|
||||
expect(s.userId).toBe("user-42");
|
||||
expect(s.id).toBe("session-1");
|
||||
});
|
||||
|
||||
it("increments sequence per build", () => {
|
||||
const a = sessionFactory.build();
|
||||
const b = sessionFactory.build();
|
||||
expect(a.id).toBe("session-1");
|
||||
expect(b.id).toBe("session-2");
|
||||
});
|
||||
});
|
||||
8
packages/auth/src/__factories__/session.factory.ts
Normal file
8
packages/auth/src/__factories__/session.factory.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { defineFactory } from "@repo/core-testing/factory";
|
||||
import type { Session } from "../entities/session.js";
|
||||
|
||||
export const sessionFactory = defineFactory<Session>(({ sequence }) => ({
|
||||
id: `session-${sequence}`,
|
||||
userId: "user-1",
|
||||
expiresAt: new Date("2026-12-31T23:59:59Z"),
|
||||
}));
|
||||
26
packages/auth/src/__factories__/user.factory.test.ts
Normal file
26
packages/auth/src/__factories__/user.factory.test.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { describe, it, expect, beforeEach } from "vitest";
|
||||
import { userFactory } from "@/__factories__/user.factory";
|
||||
|
||||
describe("userFactory", () => {
|
||||
beforeEach(() => userFactory.reset());
|
||||
|
||||
it("returns a User with stable defaults", () => {
|
||||
const u = userFactory.build();
|
||||
expect(u.id).toBe("user-1");
|
||||
expect(u.username).toBe("user1");
|
||||
expect(u.passwordHash).toHaveLength(60);
|
||||
});
|
||||
|
||||
it("applies overrides", () => {
|
||||
const u = userFactory.build({ username: "alice" });
|
||||
expect(u.username).toBe("alice");
|
||||
expect(u.id).toBe("user-1");
|
||||
});
|
||||
|
||||
it("increments sequence per build", () => {
|
||||
const a = userFactory.build();
|
||||
const b = userFactory.build();
|
||||
expect(a.id).toBe("user-1");
|
||||
expect(b.id).toBe("user-2");
|
||||
});
|
||||
});
|
||||
8
packages/auth/src/__factories__/user.factory.ts
Normal file
8
packages/auth/src/__factories__/user.factory.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { defineFactory } from "@repo/core-testing/factory";
|
||||
import type { User } from "../entities/user.js";
|
||||
|
||||
export const userFactory = defineFactory<User>(({ sequence }) => ({
|
||||
id: `user-${sequence}`,
|
||||
username: `user${sequence}`,
|
||||
passwordHash: `$2b$10$stablehashfortest${sequence}`.padEnd(60, "x"),
|
||||
}));
|
||||
Reference in New Issue
Block a user