From 58a935b31d0ce6d8138d1ae7dfa916d174bcf018 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 8 Sep 2023 13:02:27 -0700 Subject: [PATCH] test(server): make testing more isolated (#4290) --- apps/server/src/modules/auth/index.ts | 4 +- apps/server/src/session.ts | 37 +++++++++++------ apps/server/src/tests/session.spec.ts | 40 ++++++++++--------- .../src/tests/{user.spec.ts => user.e2e.ts} | 0 4 files changed, 49 insertions(+), 32 deletions(-) rename apps/server/src/tests/{user.spec.ts => user.e2e.ts} (100%) diff --git a/apps/server/src/modules/auth/index.ts b/apps/server/src/modules/auth/index.ts index ca10b40c0f..95dc5405c7 100644 --- a/apps/server/src/modules/auth/index.ts +++ b/apps/server/src/modules/auth/index.ts @@ -1,6 +1,6 @@ import { Global, Module } from '@nestjs/common'; -import { SessionService } from '../../session'; +import { SessionModule } from '../../session'; import { MAILER, MailService } from './mailer'; import { NextAuthController } from './next-auth.controller'; import { NextAuthOptionsProvider } from './next-auth-options'; @@ -9,9 +9,9 @@ import { AuthService } from './service'; @Global() @Module({ + imports: [SessionModule], providers: [ AuthService, - SessionService, AuthResolver, NextAuthOptionsProvider, MAILER, diff --git a/apps/server/src/session.ts b/apps/server/src/session.ts index ab1a657f8b..e3ca61c4f6 100644 --- a/apps/server/src/session.ts +++ b/apps/server/src/session.ts @@ -1,19 +1,23 @@ import KeyvRedis from '@keyv/redis'; -import { Global, Injectable, Module } from '@nestjs/common'; +import { + FactoryProvider, + Global, + Inject, + Injectable, + Module, +} from '@nestjs/common'; import Redis from 'ioredis'; import Keyv from 'keyv'; import { Config } from './config'; -@Injectable() -export class SessionService { - private readonly cache: Keyv; - private readonly prefix = 'session:'; - private readonly sessionTtl = 30 * 60 * 1000; // 30 min +export const KeyvProvide = Symbol('KeyvProvide'); - constructor(protected readonly config: Config) { +export const KeyvProvider: FactoryProvider = { + provide: KeyvProvide, + useFactory(config: Config) { if (config.redis.enabled) { - this.cache = new Keyv({ + return new Keyv({ store: new KeyvRedis( new Redis(config.redis.port, config.redis.host, { username: config.redis.username, @@ -23,9 +27,18 @@ export class SessionService { ), }); } else { - this.cache = new Keyv(); + return new Keyv(); } - } + }, + inject: [Config], +}; + +@Injectable() +export class SessionService { + private readonly prefix = 'session:'; + private readonly sessionTtl = 30 * 60 * 1000; // 30 min + + constructor(@Inject(KeyvProvide) private readonly cache: Keyv) {} /** * get session @@ -54,7 +67,7 @@ export class SessionService { @Global() @Module({ - providers: [SessionService], - exports: [SessionService], + providers: [KeyvProvider, SessionService], + exports: [KeyvProvider, SessionService], }) export class SessionModule {} diff --git a/apps/server/src/tests/session.spec.ts b/apps/server/src/tests/session.spec.ts index cc7171c76a..0bad83ee2d 100644 --- a/apps/server/src/tests/session.spec.ts +++ b/apps/server/src/tests/session.spec.ts @@ -1,40 +1,44 @@ /// import { Test, TestingModule } from '@nestjs/testing'; -import { PrismaClient } from '@prisma/client'; -import test from 'ava'; +import ava, { TestFn } from 'ava'; import { ConfigModule } from '../config'; import { SessionModule, SessionService } from '../session'; -let session: SessionService; -let module: TestingModule; +const test = ava as TestFn<{ + session: SessionService; + app: TestingModule; +}>; -// cleanup database before each test -test.beforeEach(async () => { - const client = new PrismaClient(); - await client.$connect(); - await client.user.deleteMany({}); - await client.$disconnect(); -}); - -test.beforeEach(async () => { - module = await Test.createTestingModule({ - imports: [ConfigModule.forRoot(), SessionModule], +test.beforeEach(async t => { + const module = await Test.createTestingModule({ + imports: [ + ConfigModule.forRoot({ + redis: { + enabled: false, + }, + }), + SessionModule, + ], }).compile(); - session = module.get(SessionService); + const session = module.get(SessionService); + t.context.app = module; + t.context.session = session; }); -test.afterEach(async () => { - await module.close(); +test.afterEach(async t => { + await t.context.app.close(); }); test('should be able to set session', async t => { + const { session } = t.context; await session.set('test', 'value'); t.is(await session.get('test'), 'value'); }); test('should be expired by ttl', async t => { + const { session } = t.context; await session.set('test', 'value', 100); t.is(await session.get('test'), 'value'); await new Promise(resolve => setTimeout(resolve, 500)); diff --git a/apps/server/src/tests/user.spec.ts b/apps/server/src/tests/user.e2e.ts similarity index 100% rename from apps/server/src/tests/user.spec.ts rename to apps/server/src/tests/user.e2e.ts