Skip to content

Commit 76d5791

Browse files
committed
fix(api): require auth for message routes
1 parent d0dd71f commit 76d5791

2 files changed

Lines changed: 81 additions & 0 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { Router } from "express";
22
import { getMessages, postMessage } from "../controllers/messageController.js";
3+
import { authMiddleware } from "../middleware/auth.js";
34

45
export const messageRoutes = Router();
56

7+
messageRoutes.use(authMiddleware);
68
messageRoutes.get("/", getMessages);
79
messageRoutes.post("/", postMessage);
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import test from "node:test";
2+
import assert from "node:assert/strict";
3+
import { createApp } from "../app.js";
4+
import { signAccessToken } from "../utils/jwt.js";
5+
6+
const messagePayload = {
7+
recipientId: "usr_freelancer",
8+
body: "Can we discuss the project timeline?"
9+
};
10+
11+
async function withServer(callback) {
12+
const app = createApp();
13+
const server = app.listen(0);
14+
15+
await new Promise((resolve, reject) => {
16+
server.once("listening", resolve);
17+
server.once("error", reject);
18+
});
19+
20+
try {
21+
const { port } = server.address();
22+
await callback(`http://127.0.0.1:${port}`);
23+
} finally {
24+
await new Promise((resolve, reject) => {
25+
server.close((error) => (error ? reject(error) : resolve()));
26+
});
27+
}
28+
}
29+
30+
test("message routes reject unauthenticated requests", async () => {
31+
await withServer(async (baseUrl) => {
32+
const getResponse = await fetch(`${baseUrl}/api/messages`);
33+
const getPayload = await getResponse.json();
34+
35+
assert.equal(getResponse.status, 401);
36+
assert.equal(getPayload.success, false);
37+
assert.equal(getPayload.message, "Unauthorized");
38+
39+
const postResponse = await fetch(`${baseUrl}/api/messages`, {
40+
method: "POST",
41+
headers: { "Content-Type": "application/json" },
42+
body: JSON.stringify(messagePayload)
43+
});
44+
const postPayload = await postResponse.json();
45+
46+
assert.equal(postResponse.status, 401);
47+
assert.equal(postPayload.success, false);
48+
assert.equal(postPayload.message, "Unauthorized");
49+
});
50+
});
51+
52+
test("message routes allow authenticated send and list requests", async () => {
53+
await withServer(async (baseUrl) => {
54+
const token = signAccessToken({ sub: "usr_client", role: "client" });
55+
const headers = {
56+
"Content-Type": "application/json",
57+
Authorization: `Bearer ${token}`
58+
};
59+
60+
const postResponse = await fetch(`${baseUrl}/api/messages`, {
61+
method: "POST",
62+
headers,
63+
body: JSON.stringify(messagePayload)
64+
});
65+
const postPayload = await postResponse.json();
66+
67+
assert.equal(postResponse.status, 201);
68+
assert.equal(postPayload.success, true);
69+
assert.equal(postPayload.data.body, messagePayload.body);
70+
assert.ok(postPayload.data.id);
71+
72+
const getResponse = await fetch(`${baseUrl}/api/messages`, { headers });
73+
const getPayload = await getResponse.json();
74+
75+
assert.equal(getResponse.status, 200);
76+
assert.equal(getPayload.success, true);
77+
assert.ok(getPayload.data.some((message) => message.id === postPayload.data.id));
78+
});
79+
});

0 commit comments

Comments
 (0)