97 lines
2.5 KiB
TypeScript
97 lines
2.5 KiB
TypeScript
// Auth routes test
|
|
import { describe, it, before, after } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { buildApp } from "../index.js";
|
|
import type { FastifyInstance } from "fastify";
|
|
|
|
let app: FastifyInstance;
|
|
let token: string;
|
|
|
|
before(async () => {
|
|
process.env.JWT_SECRET = "test-secret";
|
|
process.env.DATABASE_URL = ":memory:";
|
|
app = await buildApp();
|
|
await app.ready();
|
|
});
|
|
|
|
after(async () => {
|
|
await app.close();
|
|
});
|
|
|
|
describe("POST /api/auth/register", () => {
|
|
it("registers a new user", async () => {
|
|
const res = await app.inject({
|
|
method: "POST",
|
|
url: "/api/auth/register",
|
|
payload: { username: "testuser", password: "password123" },
|
|
});
|
|
assert.equal(res.statusCode, 201);
|
|
const body = res.json();
|
|
assert.ok(body.token);
|
|
assert.equal(body.user.username, "testuser");
|
|
token = body.token;
|
|
});
|
|
|
|
it("rejects duplicate username", async () => {
|
|
const res = await app.inject({
|
|
method: "POST",
|
|
url: "/api/auth/register",
|
|
payload: { username: "testuser", password: "password123" },
|
|
});
|
|
assert.equal(res.statusCode, 409);
|
|
});
|
|
|
|
it("rejects short password", async () => {
|
|
const res = await app.inject({
|
|
method: "POST",
|
|
url: "/api/auth/register",
|
|
payload: { username: "user2", password: "123" },
|
|
});
|
|
assert.equal(res.statusCode, 400);
|
|
});
|
|
});
|
|
|
|
describe("POST /api/auth/login", () => {
|
|
it("logs in with correct credentials", async () => {
|
|
const res = await app.inject({
|
|
method: "POST",
|
|
url: "/api/auth/login",
|
|
payload: { username: "testuser", password: "password123" },
|
|
});
|
|
assert.equal(res.statusCode, 200);
|
|
const body = res.json();
|
|
assert.ok(body.token);
|
|
token = body.token;
|
|
});
|
|
|
|
it("rejects wrong password", async () => {
|
|
const res = await app.inject({
|
|
method: "POST",
|
|
url: "/api/auth/login",
|
|
payload: { username: "testuser", password: "wrongpassword" },
|
|
});
|
|
assert.equal(res.statusCode, 401);
|
|
});
|
|
});
|
|
|
|
describe("GET /api/auth/me", () => {
|
|
it("returns current user with valid token", async () => {
|
|
const res = await app.inject({
|
|
method: "GET",
|
|
url: "/api/auth/me",
|
|
headers: { authorization: `Bearer ${token}` },
|
|
});
|
|
assert.equal(res.statusCode, 200);
|
|
const body = res.json();
|
|
assert.equal(body.data.username, "testuser");
|
|
});
|
|
|
|
it("rejects without token", async () => {
|
|
const res = await app.inject({
|
|
method: "GET",
|
|
url: "/api/auth/me",
|
|
});
|
|
assert.equal(res.statusCode, 401);
|
|
});
|
|
});
|