diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts index 3210d10..8058747 100644 --- a/src/auth/auth.controller.spec.ts +++ b/src/auth/auth.controller.spec.ts @@ -7,7 +7,6 @@ import { getRepositoryToken, TypeOrmModule } from "@nestjs/typeorm"; import { type Request } from "express"; import { dataSourceJest } from "src/config/data-source"; import jestConfig from "src/config/jest.config"; -import { jwtAccessConfig } from "src/config/jwt.config"; import { UserEntity } from "src/user/entities/user.entity"; import type { CreateUserResponse } from "src/user/responses/create-user-response"; import { UserService } from "src/user/user.service"; @@ -26,7 +25,7 @@ describe("AuthController", () => { let authService: AuthService; let userRepository: Repository | undefined; - const fakeAccessToken = "mocked_token"; + const fakeAccessToken = "mocked_access_token"; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -37,7 +36,7 @@ describe("AuthController", () => { }), PassportModule, TypeOrmModule.forRoot(dataSourceJest), - JwtModule.registerAsync(jwtAccessConfig), + JwtModule.register({}), ], providers: [ AuthService, @@ -51,7 +50,7 @@ describe("AuthController", () => { provide: JwtService, useValue: { // 模擬JwtService中的方法 - sign: jest.fn().mockReturnValue(fakeAccessToken), + sign: jest.fn(), }, }, LocalStrategy, @@ -112,6 +111,11 @@ describe("AuthController", () => { id: 1, } as JwtUser, } as unknown as Request; + + jest + .spyOn(authService, "generateAccessToken") + .mockImplementation(async () => fakeAccessToken); + const mockAuthService = jest.spyOn(authService, "login"); const result = await authController.login(request); diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts index 9d006de..7aa36e5 100644 --- a/src/auth/auth.service.spec.ts +++ b/src/auth/auth.service.spec.ts @@ -11,7 +11,6 @@ import { getRepositoryToken, TypeOrmModule } from "@nestjs/typeorm"; import { validate } from "class-validator"; import { dataSourceJest } from "src/config/data-source"; import jestConfig from "src/config/jest.config"; -import { jwtAccessConfig } from "src/config/jwt.config"; import type { CreateUserDto } from "src/user/dto/create-user.dto"; import { UserEntity } from "src/user/entities/user.entity"; import { UserService } from "src/user/user.service"; @@ -24,10 +23,9 @@ import { LocalStrategy } from "./local/local.strategy"; describe("AuthService", () => { let authService: AuthService; let userService: UserService; - let jwtService: JwtService; let userRepository: Repository | undefined; - const fakeAccessToken = "mocked_token"; + const fakeAccessToken = "mocked_access_token"; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -37,7 +35,7 @@ describe("AuthService", () => { }), PassportModule, TypeOrmModule.forRoot(dataSourceJest), - JwtModule.registerAsync(jwtAccessConfig), + JwtModule.register({}), ], providers: [ AuthService, @@ -51,7 +49,7 @@ describe("AuthService", () => { provide: JwtService, useValue: { // 模擬JwtService中的方法 - sign: jest.fn().mockReturnValue(fakeAccessToken), + sign: jest.fn(), }, }, LocalStrategy, @@ -59,7 +57,6 @@ describe("AuthService", () => { ], }).compile(); - jwtService = module.get(JwtService); userService = module.get(UserService); authService = module.get(AuthService); userRepository = module.get>( @@ -164,15 +161,16 @@ describe("AuthService", () => { email: "test@example.com", id: 1, }; - const expectedToken = fakeAccessToken; const expectedStatusCode = HttpStatus.CREATED; - jest.spyOn(jwtService, "sign").mockReturnValue(expectedToken); + jest + .spyOn(authService, "generateAccessToken") + .mockImplementation(async () => fakeAccessToken); const result = await authService.login(mockUser); expect(result).toEqual({ - accessToken: expectedToken, + accessToken: fakeAccessToken, statusCode: expectedStatusCode, }); }); diff --git a/src/auth/jwt/jwt-access.guard.spec.ts b/src/auth/jwt/jwt-access.guard.spec.ts index eea22b0..cc26242 100644 --- a/src/auth/jwt/jwt-access.guard.spec.ts +++ b/src/auth/jwt/jwt-access.guard.spec.ts @@ -1,10 +1,9 @@ import { type ExecutionContext, UnauthorizedException } from "@nestjs/common"; -import { ConfigModule } from "@nestjs/config"; +import { ConfigModule, ConfigService } from "@nestjs/config"; import { JwtModule, JwtService } from "@nestjs/jwt"; import { PassportModule } from "@nestjs/passport"; import { Test } from "@nestjs/testing"; import jestConfig from "src/config/jest.config"; -import { jwtAccessConfig } from "src/config/jwt.config"; import { JwtAccessGuard } from "./jwt-access.guard"; import { JwtAccessStrategy } from "./jwt-access.strategy"; @@ -12,6 +11,7 @@ import { JwtAccessStrategy } from "./jwt-access.strategy"; describe("JwtAccessGuard", () => { let jwtAccessGuard: JwtAccessGuard; let jwtService: JwtService; + let configService: ConfigService; beforeEach(async () => { const moduleRef = await Test.createTestingModule({ @@ -20,13 +20,14 @@ describe("JwtAccessGuard", () => { load: [jestConfig], }), PassportModule, - JwtModule.registerAsync(jwtAccessConfig), + JwtModule.register({}), ], providers: [JwtAccessGuard, JwtAccessStrategy, JwtService], }).compile(); jwtAccessGuard = moduleRef.get(JwtAccessGuard); jwtService = moduleRef.get(JwtService); + configService = moduleRef.get(ConfigService); }); it("should be defined", () => { @@ -35,7 +36,11 @@ describe("JwtAccessGuard", () => { it("should return true for a valid JWT", async () => { const payload = { email: "testuser", id: 1 }; - const token = jwtService.sign(payload); + const secret: string | undefined = configService.get("jwtSecret.access"); + const token = jwtService.sign(payload, { + expiresIn: "1h", + secret, + }); const response = {}; const context: ExecutionContext = { @@ -55,7 +60,8 @@ describe("JwtAccessGuard", () => { it("should throw an error for an expired JWT", async () => { const payload = { email: "testuser", id: 1 }; - const token = jwtService.sign(payload, { expiresIn: 0 }); + const secret: string | undefined = configService.get("jwtSecret.access"); + const token = jwtService.sign(payload, { expiresIn: 0, secret }); const response = {}; const context: ExecutionContext = { diff --git a/src/config/jwt.config.ts b/src/config/jwt.config.ts deleted file mode 100644 index 4c1bd2b..0000000 --- a/src/config/jwt.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ConfigModule, ConfigService } from "@nestjs/config"; -import { type JwtModuleAsyncOptions } from "@nestjs/jwt"; - -export const jwtAccessConfig: JwtModuleAsyncOptions = { - imports: [ConfigModule], - inject: [ConfigService], - useFactory: (configService: ConfigService) => ({ - secret: configService.get("jwtSecret.access"), - signOptions: { expiresIn: "1d" }, - }), -}; diff --git a/src/swagger/swagger.module.ts b/src/swagger/swagger.module.ts index 8271574..64678de 100644 --- a/src/swagger/swagger.module.ts +++ b/src/swagger/swagger.module.ts @@ -8,7 +8,6 @@ import { AuthModule } from "src/auth/auth.module"; import { JwtAccessStrategy } from "src/auth/jwt/jwt-access.strategy"; import { dataSourceJest } from "src/config/data-source"; import jestConfig from "src/config/jest.config"; -import { jwtAccessConfig } from "src/config/jwt.config"; import { UserModule } from "src/user/user.module"; @Module({ @@ -21,7 +20,7 @@ import { UserModule } from "src/user/user.module"; }), UserModule, AuthModule, - JwtModule.registerAsync(jwtAccessConfig), + JwtModule.register({}), ], providers: [AppService, JwtAccessStrategy], })