import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest"; import type { FastifyInstance } from "fastify"; import { createTestApp, cleanDb, signupUser } from "./helpers.js"; let app: FastifyInstance; beforeAll(async () => { app = await createTestApp(); }); afterAll(async () => { await app.close(); }); beforeEach(async () => { await cleanDb(); }); describe("GET /accounts", () => { it("returns user's accounts", async () => { const signup = await signupUser(app, "user@example.com", "Org"); const { accessToken } = signup.json(); const res = await app.inject({ method: "GET", url: "/accounts", headers: { authorization: `Bearer ${accessToken}` }, }); expect(res.statusCode).toBe(200); const body = res.json(); expect(body).toHaveLength(1); expect(body[0].name).toBe("Org"); expect(body[0].role).toBe("owner"); }); it("returns 401 without auth", async () => { const res = await app.inject({ method: "GET", url: "/accounts", }); expect(res.statusCode).toBe(401); }); }); describe("POST /accounts", () => { it("creates a new account and makes user owner", async () => { const signup = await signupUser(app, "user@example.com", "Org 1"); const { accessToken } = signup.json(); const res = await app.inject({ method: "POST", url: "/accounts", headers: { authorization: `Bearer ${accessToken}` }, payload: { name: "Org 2" }, }); expect(res.statusCode).toBe(201); expect(res.json().name).toBe("Org 2"); expect(res.json().role).toBe("owner"); // User should now have 2 accounts const list = await app.inject({ method: "GET", url: "/accounts", headers: { authorization: `Bearer ${accessToken}` }, }); expect(list.json()).toHaveLength(2); }); it("returns 400 if name is missing", async () => { const signup = await signupUser(app, "user@example.com", "Org"); const { accessToken } = signup.json(); const res = await app.inject({ method: "POST", url: "/accounts", headers: { authorization: `Bearer ${accessToken}` }, payload: {}, }); expect(res.statusCode).toBe(400); }); });