// Feature-level test: sign-up, then sign-in with the new credentials, then sign-out. // Constructs the full chain via direct injection (no container rebinding). import { describe, it, expect } from "vitest"; import { RecordingEventBus } from "@repo/core-testing/instrumentation"; import { MockUsersRepository } from "../src/infrastructure/repositories/users.repository.mock"; import { MockAuthenticationService } from "../src/infrastructure/services/authentication.service.mock"; import { signInUseCase } from "../src/application/use-cases/sign-in.use-case"; import { signUpUseCase } from "../src/application/use-cases/sign-up.use-case"; import { signOutUseCase } from "../src/application/use-cases/sign-out.use-case"; import { signInController } from "../src/interface-adapters/controllers/sign-in.controller"; import { signUpController } from "../src/interface-adapters/controllers/sign-up.controller"; import { signOutController } from "../src/interface-adapters/controllers/sign-out.controller"; describe("auth feature: sign-up → sign-in → sign-out", () => { it("a new user can sign up, then sign in, then sign out", async () => { // Construct the full chain via direct injection const users = new MockUsersRepository([]); const auth = new MockAuthenticationService(users); const signIn = signInController(signInUseCase(users, auth)); const signUp = signUpController(signUpUseCase(users, auth, new RecordingEventBus())); const signOut = signOutController(signOutUseCase(auth)); // signUp returns a cookie (presenter shape) const signUpCookie = await signUp({ username: "newperson", password: "verysecret", confirmPassword: "verysecret", }); expect(signUpCookie.name).toBe("session"); expect(signUpCookie.value).toBeTruthy(); const signInCookie = await signIn({ username: "newperson", password: "verysecret", }); expect(signInCookie.name).toBe("session"); expect(signInCookie.value).toBeTruthy(); // signOut takes { sessionId } and returns void const signOutResult = await signOut({ sessionId: signInCookie.value }); expect(signOutResult).toBeUndefined(); }); });