From 3b0421aa8108d3b41f3dc99dcf5cb0741cdaf59c Mon Sep 17 00:00:00 2001 From: Matt Ciaccio Date: Fri, 24 Apr 2026 14:48:40 +0200 Subject: [PATCH] fix(tests): use dynamic imports in portal.test.ts to avoid env validation --- tests/unit/services/portal.test.ts | 100 +++++++++++++++++++++++------ vitest.config.ts | 9 ++- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/tests/unit/services/portal.test.ts b/tests/unit/services/portal.test.ts index a22bdbe..02f990c 100644 --- a/tests/unit/services/portal.test.ts +++ b/tests/unit/services/portal.test.ts @@ -1,24 +1,41 @@ -import { describe, it, expect } from 'vitest'; - -import { - getPortalUserYachts, - getPortalUserMemberships, - getPortalUserReservations, -} from '@/lib/services/portal.service'; -import { - makeClient, - makeCompany, - makeMembership, - makePort, - makeYacht, - makeBerth, - makeReservation, -} from '../../helpers/factories'; -import { db } from '@/lib/db'; -import { yachts } from '@/lib/db/schema'; -import { eq } from 'drizzle-orm'; +import { describe, it, expect, beforeAll } from 'vitest'; describe('portal.service — getPortalUserYachts', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let getPortalUserYachts: (clientId: string, portId: string) => Promise>; + + let makeClient: typeof import('../../helpers/factories').makeClient; + + let makePort: typeof import('../../helpers/factories').makePort; + + let makeYacht: typeof import('../../helpers/factories').makeYacht; + + let makeCompany: typeof import('../../helpers/factories').makeCompany; + + let makeMembership: typeof import('../../helpers/factories').makeMembership; + + let db: typeof import('@/lib/db').db; + + let yachts: typeof import('@/lib/db/schema').yachts; + + let eq: typeof import('drizzle-orm').eq; + + beforeAll(async () => { + const portalMod = await import('@/lib/services/portal.service'); + getPortalUserYachts = portalMod.getPortalUserYachts; + const factoriesMod = await import('../../helpers/factories'); + makeClient = factoriesMod.makeClient; + makePort = factoriesMod.makePort; + makeYacht = factoriesMod.makeYacht; + makeCompany = factoriesMod.makeCompany; + makeMembership = factoriesMod.makeMembership; + const dbMod = await import('@/lib/db'); + db = dbMod.db; + const schemaMod = await import('@/lib/db/schema'); + yachts = schemaMod.yachts; + const ormMod = await import('drizzle-orm'); + eq = ormMod.eq; + }); it('returns client-owned yachts only when client has no memberships', async () => { const port = await makePort(); const client = await makeClient({ portId: port.id }); @@ -156,6 +173,27 @@ describe('portal.service — getPortalUserYachts', () => { }); describe('portal.service — getPortalUserMemberships', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let getPortalUserMemberships: (clientId: string, portId: string) => Promise>; + + let makeClient: typeof import('../../helpers/factories').makeClient; + + let makePort: typeof import('../../helpers/factories').makePort; + + let makeCompany: typeof import('../../helpers/factories').makeCompany; + + let makeMembership: typeof import('../../helpers/factories').makeMembership; + + beforeAll(async () => { + const portalMod = await import('@/lib/services/portal.service'); + getPortalUserMemberships = portalMod.getPortalUserMemberships; + const factoriesMod = await import('../../helpers/factories'); + makeClient = factoriesMod.makeClient; + makePort = factoriesMod.makePort; + makeCompany = factoriesMod.makeCompany; + makeMembership = factoriesMod.makeMembership; + }); + it('returns only active memberships', async () => { const port = await makePort(); const client = await makeClient({ portId: port.id }); @@ -203,6 +241,30 @@ describe('portal.service — getPortalUserMemberships', () => { }); describe('portal.service — getPortalUserReservations', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let getPortalUserReservations: (clientId: string, portId: string) => Promise>; + + let makeClient: typeof import('../../helpers/factories').makeClient; + + let makePort: typeof import('../../helpers/factories').makePort; + + let makeYacht: typeof import('../../helpers/factories').makeYacht; + + let makeBerth: typeof import('../../helpers/factories').makeBerth; + + let makeReservation: typeof import('../../helpers/factories').makeReservation; + + beforeAll(async () => { + const portalMod = await import('@/lib/services/portal.service'); + getPortalUserReservations = portalMod.getPortalUserReservations; + const factoriesMod = await import('../../helpers/factories'); + makeClient = factoriesMod.makeClient; + makePort = factoriesMod.makePort; + makeYacht = factoriesMod.makeYacht; + makeBerth = factoriesMod.makeBerth; + makeReservation = factoriesMod.makeReservation; + }); + it('returns active + pending reservations', async () => { const port = await makePort(); const client = await makeClient({ portId: port.id }); diff --git a/vitest.config.ts b/vitest.config.ts index 5726a62..4208952 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,5 +1,7 @@ import { defineConfig } from 'vitest/config'; import path from 'path'; +// eslint-disable-next-line @typescript-eslint/no-require-imports +const { loadEnv } = require('vite'); export default defineConfig({ test: { @@ -12,13 +14,10 @@ export default defineConfig({ provider: 'v8', reporter: ['text', 'lcov', 'json-summary'], include: ['src/lib/**'], - exclude: [ - 'src/lib/db/migrations/**', - 'src/lib/db/schema/**', - 'src/**/*.d.ts', - ], + exclude: ['src/lib/db/migrations/**', 'src/lib/db/schema/**', 'src/**/*.d.ts'], }, testTimeout: 30_000, + env: loadEnv('test', process.cwd(), ''), }, resolve: { alias: { '@': path.resolve(__dirname, './src') },