import { beforeEach, describe, expect, it } from "vitest"; import { authContainer } from "@/di/container"; import { AUTH_SYMBOLS } from "@/di/symbols"; import { MockUsersRepository } from "@/infrastructure/repositories/users.repository.mock"; import { MockAuthenticationService } from "@/infrastructure/services/authentication.service.mock"; import type { IUsersRepository } from "@/application/repositories/users.repository.interface"; import type { IAuthenticationService } from "@/application/services/authentication.service.interface"; import { AuthenticationError } from "@/entities/errors/auth"; import { signInUseCase } from "./sign-in.use-case"; describe("signInUseCase", () => { let usersRepo: MockUsersRepository; let authService: MockAuthenticationService; beforeEach(() => { if (authContainer.isBound(AUTH_SYMBOLS.IUsersRepository)) { authContainer.unbind(AUTH_SYMBOLS.IUsersRepository); } if (authContainer.isBound(AUTH_SYMBOLS.IAuthenticationService)) { authContainer.unbind(AUTH_SYMBOLS.IAuthenticationService); } usersRepo = new MockUsersRepository(); authService = new MockAuthenticationService(usersRepo); authContainer .bind(AUTH_SYMBOLS.IUsersRepository) .toConstantValue(usersRepo); authContainer .bind(AUTH_SYMBOLS.IAuthenticationService) .toConstantValue(authService); }); it("returns a session + cookie on valid credentials", async () => { const result = await signInUseCase({ username: "alice", password: "password_alice", }); expect(result.session.userId).toBe("1"); expect(result.cookie.name).toBe("session"); }); it("throws AuthenticationError when user does not exist", async () => { await expect( signInUseCase({ username: "ghost", password: "anything" }), ).rejects.toBeInstanceOf(AuthenticationError); }); it("throws AuthenticationError on wrong password", async () => { await expect( signInUseCase({ username: "alice", password: "wrong" }), ).rejects.toBeInstanceOf(AuthenticationError); }); });