feat: deterministic seed, impersonation migration, test factories (GRO-110)
Phase 1 — Seed Hardening: - Replace all Math.random() calls in seed.ts with a Mulberry32 seeded PRNG (seed 42) so the same data set is reproduced on every run - Replace crypto.randomUUID() with a PRNG-based UUID v4 generator - Add manager (Jordan Lee) and receptionist (Sam Rivera) staff members to seed — previously all staff were groomers - New packages/db/src/reset.ts drops all tables/enums and re-runs migrate + seed; exposed as `pnpm db:reset` at root - Generate migration 0010_impersonation_sessions.sql for the impersonation_sessions and impersonation_audit_logs tables that were already in schema.ts but had no corresponding migration Phase 2 — Test Factories: - New packages/db/src/factories.ts with buildStaff, buildClient, buildPet, buildService, buildAppointment and resetFactoryCounters helpers - Exported via @groombook/db/factories subpath (package.json + vitest alias) - impersonation.test.ts updated to use buildStaff instead of hand-rolled fixture objects Closes #90 (Phases 1 + 2) Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
-- Create impersonation_session_status enum and tables
|
||||
CREATE TYPE "impersonation_session_status" AS ENUM ('active', 'ended', 'expired');
|
||||
|
||||
CREATE TABLE "impersonation_sessions" (
|
||||
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||
"staff_id" uuid NOT NULL,
|
||||
"client_id" uuid NOT NULL,
|
||||
"reason" text,
|
||||
"status" "impersonation_session_status" DEFAULT 'active' NOT NULL,
|
||||
"started_at" timestamp DEFAULT now() NOT NULL,
|
||||
"ended_at" timestamp,
|
||||
"expires_at" timestamp NOT NULL,
|
||||
"created_at" timestamp DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "impersonation_sessions_staff_id_staff_id_fk" FOREIGN KEY ("staff_id") REFERENCES "staff"("id") ON DELETE restrict,
|
||||
CONSTRAINT "impersonation_sessions_client_id_clients_id_fk" FOREIGN KEY ("client_id") REFERENCES "clients"("id") ON DELETE restrict
|
||||
);
|
||||
|
||||
CREATE TABLE "impersonation_audit_logs" (
|
||||
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
||||
"session_id" uuid NOT NULL,
|
||||
"action" text NOT NULL,
|
||||
"page_visited" text,
|
||||
"metadata" jsonb,
|
||||
"created_at" timestamp DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "impersonation_audit_logs_session_id_impersonation_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "impersonation_sessions"("id") ON DELETE cascade
|
||||
);
|
||||
@@ -71,6 +71,13 @@
|
||||
"when": 1773993600000,
|
||||
"tag": "0009_client_soft_delete",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 10,
|
||||
"version": "7",
|
||||
"when": 1742500800000,
|
||||
"tag": "0010_impersonation_sessions",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user