From d21f343e3d2f205ddd327c28de6892505fe3bbfd Mon Sep 17 00:00:00 2001 From: Piotr Maszczak Date: Sun, 24 Mar 2024 18:14:00 +0100 Subject: [PATCH] Add pagination and tests to friends endpoint --- backend/src/routes/usersFriendsRoute.ts | 40 ++++++++++++- backend/src/routes/usersRoute.ts | 30 ---------- backend/test/userFriends.test.ts | 79 +++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 32 deletions(-) create mode 100644 backend/test/userFriends.test.ts diff --git a/backend/src/routes/usersFriendsRoute.ts b/backend/src/routes/usersFriendsRoute.ts index 5e6d7ae6..d76a4de4 100644 --- a/backend/src/routes/usersFriendsRoute.ts +++ b/backend/src/routes/usersFriendsRoute.ts @@ -35,6 +35,8 @@ friendshipRouter.get( try { const session = driver.session(); const userId = req.params.userId; + const page: number = parseInt(req.query.page as string); + const maxUsersOnPage: number = parseInt(req.query.maxUsers as string); const user = await userExists(session, res, userId); if ("json" in user) { @@ -50,8 +52,42 @@ friendshipRouter.get( ); await session.close(); - const friends = friendQuery.records.map((f) => f.get("f").properties); - return res.json({ status: "ok", friends }); + const allFriends = friendQuery.records.map((f) => f.get("f").properties); + + if (!page && !maxUsersOnPage) { + if (allFriends.length === 0) { + return res.status(404).json({ + status: "error", + errors: { friends: "No friends found" }, + }); + } + return res.status(200).json({ + status: "ok", + friends: allFriends, + }); + } else if (!page || !maxUsersOnPage) { + return res.status(400).json({ + status: "error", + errors: { params: "Missing or incorrect query params" }, + }); + } + + const friends = allFriends.slice( + (page - 1) * maxUsersOnPage, + page * maxUsersOnPage, + ); + + if (friends.length === 0) { + return res.status(404).json({ + status: "error", + errors: { friends: "No friends found with given queries" }, + }); + } + + return res.status(200).json({ + status: "ok", + friends, + }); } catch (err) { console.log("Error:", err); return res.status(404).json({ status: "error", errors: err as object }); diff --git a/backend/src/routes/usersRoute.ts b/backend/src/routes/usersRoute.ts index 1ba84a04..8b931fed 100644 --- a/backend/src/routes/usersRoute.ts +++ b/backend/src/routes/usersRoute.ts @@ -202,36 +202,6 @@ usersRouter.get("/:userId", async (req: Request, res: UserErrorResponse) => { } }); -usersRouter.get( - "/:userId/friends", - async (req: Request, res: FriendsErrorResponse) => { - try { - const userId = req.params.userId; - - const session = driver.session(); - const user = await userExists(session, { id: userId }); - - if (!user) { - return userNotFoundRes(res); - } - - const friendRequest = await session.run( - `MATCH (u:User {id: $userId})-[:IS_FRIENDS_WITH]-(f:User) RETURN f`, - { userId }, - ); - await session.close(); - - const friends = friendRequest.records.map((f) => - filterUser(f.get("f").properties), - ); - return res.json({ status: "ok", friends }); - } catch (err) { - console.log("Error:", err); - return res.status(404).json({ status: "error", errors: err as object }); - } - }, -); - usersRouter.get("/meetings/:userId", async (req: Request, res) => { try { const session = driver.session(); diff --git a/backend/test/userFriends.test.ts b/backend/test/userFriends.test.ts new file mode 100644 index 00000000..887f6c5c --- /dev/null +++ b/backend/test/userFriends.test.ts @@ -0,0 +1,79 @@ +import { expect, test } from "vitest"; + +let userId: number; +let page: number = 3; +let maxUsers: number = 5; + +test("Search user", async () => { + const response = await fetch("http://localhost:5000/users/search?q=a"); + + const responseData = await response.json(); + const users = responseData.users; + const status = responseData.status; + + expect(status).toBe("ok"); + + userId = users[0][0].id; +}); + +test("Get friends", async () => { + const response = await fetch(`http://localhost:5000/users/${userId}/friends`); + + const responseData = await response.json(); + const friends = responseData.friends; + const status = responseData.status; + + expect(status).toBe("ok"); + expect(friends.length).toBe(6); +}); + +test("Missing page", async () => { + const response = await fetch( + `http://localhost:5000/users/${userId}/friends?maxUsers=${maxUsers}`, + ); + + const responseData = await response.json(); + const status = responseData.status; + + expect(status).toBe("error"); +}); + +test("Missing maxUsers", async () => { + const response = await fetch( + `http://localhost:5000/users/${userId}/friends?page=${page}`, + ); + + const responseData = await response.json(); + const status = responseData.status; + + expect(status).toBe("error"); +}); + +test("First user", async () => { + page = 1; + maxUsers = 1; + const response = await fetch( + `http://localhost:5000/users/${userId}/friends?page=${page}&maxUsers=${maxUsers}`, + ); + + const responseData = await response.json(); + const status = responseData.status; + const users = responseData.friends; + + expect(status).toBe("ok"); + expect(users.length).toBe(1); +}); + +test("Not found users", async () => { + page = 3; + maxUsers = 3; + const response = await fetch( + `http://localhost:5000/users/${userId}/friends?page=${page}&maxUsers=${maxUsers}`, + ); + const responseData = await response.json(); + const status = responseData.status; + const message = responseData.errors.friends; + + expect(status).toBe("error"); + expect(message).toBe("No friends found with given queries"); +});