import { beforeEach, describe, expect, it } from "vitest"; import { authContainer } from "@/di/container"; import { AUTH_SYMBOLS } from "@/di/symbols"; import { MockUsersRepository } from "@/infrastructure/repositories/mock-users.repository"; import { MockAuthenticationService } from "@/infrastructure/services/mock-authentication.service"; 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 { signUpUseCase } from "./sign-up.use-case"; describe("signUpUseCase", () => { 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("creates a new user and returns session + cookie + user", async () => { const result = await signUpUseCase({ username: "carol", password: "secret_password", }); expect(result.user.username).toBe("carol"); expect(result.session.userId).toBe(result.user.id); expect(result.cookie.name).toBe("session"); }); it("throws AuthenticationError when username taken", async () => { await expect( signUpUseCase({ username: "alice", password: "secret_password" }), ).rejects.toBeInstanceOf(AuthenticationError); }); });