feat: customize public profile visibility
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
This commit is contained in:
@@ -173,46 +173,67 @@ test("GET /api/races requires authentication", async () => {
|
||||
assert.equal(res.body.error, "unauthorized");
|
||||
});
|
||||
|
||||
test("public profile exposes only its owner's calendar after they enable it", async () => {
|
||||
test("public profile uses its username and separate visibility settings", async () => {
|
||||
const { agent } = await authAgent();
|
||||
const user = await agent.get("/api/auth/me").expect(200);
|
||||
const userId = user.body.user.id as string;
|
||||
await agent
|
||||
.post("/api/races")
|
||||
.set("X-CSRF-Token", user.body.csrfToken as string)
|
||||
.send({
|
||||
slug: "2026-08-01-public-race",
|
||||
slug: "2026-08-01-planned-race",
|
||||
date: "2026-08-01",
|
||||
title: "Public Race",
|
||||
title: "Planned Race",
|
||||
distanceKm: 10,
|
||||
notes: "Private note",
|
||||
bibNumber: "123",
|
||||
})
|
||||
.expect(201);
|
||||
await agent
|
||||
.post("/api/races")
|
||||
.set("X-CSRF-Token", user.body.csrfToken as string)
|
||||
.send({
|
||||
slug: "2026-07-01-completed-race",
|
||||
date: "2026-07-01",
|
||||
title: "Completed Race",
|
||||
distanceKm: 10,
|
||||
status: "completed",
|
||||
finishTime: "00:40:00",
|
||||
finishPlace: "12",
|
||||
notes: "Private note",
|
||||
})
|
||||
.expect(201);
|
||||
|
||||
await request(app).get(`/api/users/${userId}/races`).expect(404);
|
||||
await request(app).get("/api/users/public-runner/races").expect(404);
|
||||
await agent
|
||||
.patch("/api/auth/profile")
|
||||
.set("X-CSRF-Token", user.body.csrfToken as string)
|
||||
.send({ isProfilePublic: true })
|
||||
.send({ profileUsername: "public-runner", isFutureRacesPublic: true, isCompletedRacesPublic: false })
|
||||
.expect(200);
|
||||
|
||||
const publicRaces = await request(app).get(`/api/users/${userId}/races`).expect(200);
|
||||
assert.deepEqual(publicRaces.body, [{
|
||||
const futureRaces = await request(app).get("/api/users/public-runner/races").expect(200);
|
||||
assert.deepEqual(futureRaces.body, [{
|
||||
date: "2026-08-01",
|
||||
title: "Public Race",
|
||||
title: "Planned Race",
|
||||
distanceKm: 10,
|
||||
status: null,
|
||||
coverImageUrl: null,
|
||||
finishTime: null,
|
||||
finishPlace: null,
|
||||
}]);
|
||||
|
||||
await agent
|
||||
.patch("/api/auth/profile")
|
||||
.set("X-CSRF-Token", user.body.csrfToken as string)
|
||||
.send({ isProfilePublic: false })
|
||||
.send({ isFutureRacesPublic: false, isCompletedRacesPublic: true })
|
||||
.expect(200);
|
||||
await request(app).get(`/api/users/${userId}/races`).expect(404);
|
||||
const completedRaces = await request(app).get("/api/users/public-runner/races").expect(200);
|
||||
assert.deepEqual(completedRaces.body, [{
|
||||
date: "2026-07-01",
|
||||
title: "Completed Race",
|
||||
distanceKm: 10,
|
||||
status: "completed",
|
||||
coverImageUrl: null,
|
||||
finishTime: "00:40:00",
|
||||
finishPlace: "12",
|
||||
}]);
|
||||
});
|
||||
|
||||
test("login uses generic response for missing user and wrong password", async () => {
|
||||
|
||||
Reference in New Issue
Block a user