diff --git a/tests/controller/file-controller.test.js b/tests/controller/file-controller.test.js index 12e3d32..94916cc 100644 --- a/tests/controller/file-controller.test.js +++ b/tests/controller/file-controller.test.js @@ -11,8 +11,11 @@ const { ObjectId } = require("mongodb"); let mongoServer; let authToken; +let authToken2; let file; +let file2; let user; +let user2; describe("File Controller", () => { beforeAll(async () => { @@ -28,9 +31,21 @@ describe("File Controller", () => { }) .set("uuid", 12314123123); + user2 = await request(app) + .post("/user-service/create") + .send({ + email: "test@test2.com", + password: "test1234", + }) + .set("uuid", 12314123124); + authToken = user.headers["set-cookie"] .map((cookie) => cookie.split(";")[0]) .join("; "); + + authToken2 = user2.headers["set-cookie"] + .map((cookie) => cookie.split(";")[0]) + .join("; "); }); beforeEach(async () => { @@ -52,6 +67,22 @@ describe("File Controller", () => { isVideo: false, }, }); + + file2 = await mongoose.model("fs.files").create({ + _id: new ObjectId("4eb88f29ecb8c9319ddca3c2"), + filename: "test.txt2", + uploadDate: new Date(), + length: 10000, + metadata: { + owner: user2.body.user._id, + parent: "/", + parentList: "/", + hasThumbnail: false, + size: "10000", + IV: "test", + isVideo: false, + }, + }); }); afterAll(async () => { @@ -69,6 +100,14 @@ describe("File Controller", () => { expect(fileResponse.body.filename).toBe(file.filename); expect(fileResponse.body.length).toBe(file.length); }); + test("Should return user 2's file info", async () => { + const fileResponse = await request(app) + .get(`/file-service/info/${file2._id}`) + .set("Cookie", authToken2); + + expect(fileResponse.status).toBe(200); + expect(fileResponse.body.filename).toBe(file2.filename); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .get(`/file-service/info/5f7e5d8d1f962d5a0f5e8a9e`) @@ -84,32 +123,6 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); test("Should return 401/404 if not owner of file", async () => { - const user2 = await request(app) - .post("/user-service/create") - .send({ - email: "tes@test.com", - password: "test1234", - }) - .set("uuid", 12314123123); - - expect(user2.status).toBe(201); - - const file2 = await mongoose.model("fs.files").create({ - _id: new ObjectId("5eb88f29ecb8c9319ddca3c3"), - filename: "test2.txt", - uploadDate: new Date(), - length: 10001, - metadata: { - owner: user2.body.user._id, - parent: "/", - parentList: "/", - hasThumbnail: false, - size: "10001", - IV: "test1", - isVideo: false, - }, - }); - const fileResponse = await request(app) .get(`/file-service/info/${file2._id}`) .set("Cookie", authToken); @@ -137,6 +150,24 @@ describe("File Controller", () => { expect(fileDbCheck.filename).toBe("newname.txt"); }); + test("Should rename user 2's file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/rename`) + .set("Cookie", authToken2) + .send({ + id: file2._id, + title: "newname.txt", + }); + + expect(fileResponse.status).toBe(200); + expect(fileResponse.body.filename).toBe("newname.txt"); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.filename).toBe("newname.txt"); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/rename`) @@ -159,6 +190,17 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/rename`) + .set("Cookie", authToken) + .send({ + id: file2._id, + title: "newname.txt", + }); + + expect([401, 404]).toContain(fileResponse.status); + }); test("Should return 400 if no title", async () => { const fileResponse = await request(app) .patch(`/file-service/rename`) @@ -220,6 +262,22 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.trashed).toBe(true); }); + test("Should trash user 2's file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/trash`) + .set("Cookie", authToken2) + .send({ + id: file2._id, + }); + + expect(fileResponse.status).toBe(200); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.trashed).toBe(true); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/trash`) @@ -240,6 +298,16 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/trash`) + .set("Cookie", authToken) + .send({ + id: file2._id, + }); + + expect([401, 404]).toContain(fileResponse.status); + }); test("Should return 400 if no id", async () => { const fileResponse = await request(app) .patch(`/file-service/trash`) @@ -272,6 +340,27 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.trashed).toBe(null); }); + test("Should restore user 2's file", async () => { + await mongoose + .model("fs.files") + .updateOne({ _id: file2._id }, { $set: { "metadata.trashed": true } }); + + const fileResponse = await request(app) + .patch(`/file-service/restore`) + .set("Cookie", authToken2) + .send({ + id: file2._id, + }); + + expect(fileResponse.status).toBe(200); + expect(fileResponse.body.metadata.trashed).toBe(null); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.trashed).toBe(null); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/restore`) @@ -292,6 +381,16 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/restore`) + .set("Cookie", authToken) + .send({ + id: file2._id, + }); + + expect([401, 404]).toContain(fileResponse.status); + }); test("Should return 400 if no id", async () => { const fileResponse = await request(app) .patch(`/file-service/restore`) @@ -317,6 +416,20 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.link).toBeTruthy(); expect(fileDbCheck.metadata.linkType).toBe("public"); }); + test("Should make user 2's file public", async () => { + const fileResponse = await request(app) + .patch(`/file-service/make-public/${file2._id}`) + .set("Cookie", authToken2); + + expect(fileResponse.status).toBe(200); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.link).toBeTruthy(); + expect(fileDbCheck.metadata.linkType).toBe("public"); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/make-public/5f7e5d8d1f962d5a0f5e8a9e`) @@ -331,6 +444,13 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/make-public/${file2._id}`) + .set("Cookie", authToken); + + expect([401, 404]).toContain(fileResponse.status); + }); }); describe("Make one time public file: PATCH /file-service/make-one/", () => { @@ -348,6 +468,20 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.link).toBeTruthy(); expect(fileDbCheck.metadata.linkType).toBe("one"); }); + test("Should make user 2's file one time public", async () => { + const fileResponse = await request(app) + .patch(`/file-service/make-one/${file2._id}`) + .set("Cookie", authToken2); + + expect(fileResponse.status).toBe(200); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.link).toBeTruthy(); + expect(fileDbCheck.metadata.linkType).toBe("one"); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/make-one/5f7e5d8d1f962d5a0f5e8a9e`) @@ -362,6 +496,13 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/make-one/${file2._id}`) + .set("Cookie", authToken); + + expect([401, 404]).toContain(fileResponse.status); + }); }); describe("Make private file: PATCH /file-service/remove-link/:id", () => { @@ -386,6 +527,27 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.link).toBeFalsy(); expect(fileDbCheck.metadata.linkType).toBeFalsy(); }); + test("Should make user 2's file private", async () => { + await mongoose + .model("fs.files") + .updateOne( + { _id: file2._id }, + { $set: { "metadata.link": "test", "metadata.linkType": "public" } } + ); + + const fileResponse = await request(app) + .patch(`/file-service/remove-link/${file2._id}`) + .set("Cookie", authToken2); + + expect(fileResponse.status).toBe(200); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.link).toBeFalsy(); + expect(fileDbCheck.metadata.linkType).toBeFalsy(); + }); test("Should return 404 if file not found", async () => { const fileResponse = await request(app) .patch(`/file-service/remove-link/5f7e5d8d1f962d5a0f5e8a9e`) @@ -400,6 +562,13 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/remove-link/${file2._id}`) + .set("Cookie", authToken); + + expect([401, 404]).toContain(fileResponse.status); + }); }); describe("Get public file info: GET /file-service/public/info/:id/:tempToken", () => { @@ -484,6 +653,36 @@ describe("File Controller", () => { expect(fileDbCheck.metadata.parent).toBe(folderId); expect(fileDbCheck.metadata.parentList).toBe(`/,${folderId}`); }); + test("Should move user 2's file", async () => { + const folderResponse = await request(app) + .post("/folder-service/create") + .set("Cookie", authToken2) + .send({ + name: "test", + parent: "/", + }); + + expect(folderResponse.status).toBe(201); + + const folderId = folderResponse.body._id; + + const fileResponse = await request(app) + .patch(`/file-service/move`) + .set("Cookie", authToken2) + .send({ + id: file2._id, + parentID: folderId, + }); + + expect(fileResponse.status).toBe(200); + + const fileDbCheck = await mongoose.model("fs.files").findOne({ + _id: file2._id, + }); + + expect(fileDbCheck.metadata.parent).toBe(folderId); + expect(fileDbCheck.metadata.parentList).toBe(`/,${folderId}`); + }); test("Should return 404 if file not found", async () => { const folderResponse = await request(app) .post("/folder-service/create") @@ -529,6 +728,17 @@ describe("File Controller", () => { expect(fileResponse.status).toBe(401); }); + test("Should return 401/404 if not owner of file", async () => { + const fileResponse = await request(app) + .patch(`/file-service/move`) + .set("Cookie", authToken) + .send({ + id: file2._id, + parentID: "/", + }); + + expect([401, 404]).toContain(fileResponse.status); + }); test("Should not allow moving into folder not owned by user", async () => { const userResponse2 = await request(app) .post("/user-service/create") @@ -1119,16 +1329,6 @@ describe("File Controller", () => { expect(fileResponse.body[0].filename).toBe(file2.filename); }); test("Should only return files that belong to the user", async () => { - const user2 = await request(app) - .post("/user-service/create") - .send({ - email: "test3@test.com", - password: "test1234", - }) - .set("uuid", 12314123123); - - expect(user2.status).toBe(201); - await mongoose.model("fs.files").create({ _id: new ObjectId("5eb88f29ecb8c9319ddca3c3"), filename: "a.txt", diff --git a/tests/controller/folder.controller.test.js b/tests/controller/folder.controller.test.js index cf7d6d3..0a68b41 100644 --- a/tests/controller/folder.controller.test.js +++ b/tests/controller/folder.controller.test.js @@ -11,8 +11,11 @@ const { ObjectId } = require("mongodb"); let mongoServer; let authToken; +let authToken2; let folder; +let folder2; let user; +let user2; describe("File Controller", () => { beforeAll(async () => { @@ -28,9 +31,21 @@ describe("File Controller", () => { }) .set("uuid", 12314123123); + user2 = await request(app) + .post("/user-service/create") + .send({ + email: "test@test2.com", + password: "test1234", + }) + .set("uuid", 12314123124); + authToken = user.headers["set-cookie"] .map((cookie) => cookie.split(";")[0]) .join("; "); + + authToken2 = user2.headers["set-cookie"] + .map((cookie) => cookie.split(";")[0]) + .join("; "); }); beforeEach(async () => { @@ -45,8 +60,19 @@ describe("File Controller", () => { parent: "/", }); + const folderResponse2 = await request(app) + .post("/folder-service/create") + .set("Cookie", authToken2) + .send({ + name: "test", + parent: "/", + }); + expect(folderResponse.status).toBe(201); folder = folderResponse.body; + + expect(folderResponse2.status).toBe(201); + folder2 = folderResponse2.body; }); afterAll(async () => { @@ -63,6 +89,14 @@ describe("File Controller", () => { expect(folderResponse.status).toBe(200); expect(folderResponse.body.name).toBe(folder.name); }); + test("Should return user 2's folder info", async () => { + const folderResponse = await request(app) + .get(`/folder-service/info/${folder2._id}`) + .set("Cookie", authToken2); + + expect(folderResponse.status).toBe(200); + expect(folderResponse.body.name).toBe(folder2.name); + }); test("Should return 404 if folder not found", async () => { const folderResponse = await request(app) .get(`/folder-service/info/5f7e5d8d1f962d5a0f5e8a9e`) @@ -78,37 +112,14 @@ describe("File Controller", () => { expect(folderResponse.status).toBe(401); }); test("Should return 401/404 if not owner of folder", async () => { - const user2 = await request(app) - .post("/user-service/create") - .send({ - email: "test4@test.com", - password: "test1234", - }) - .set("uuid", 12314123123); - - expect(user2.status).toBe(201); - - const authToken2 = user2.headers["set-cookie"] - .map((cookie) => cookie.split(";")[0]) - .join("; "); - - const folderCreateResponse = await request(app) - .post(`/folder-service/create`) - .set("Cookie", authToken2) - .send({ - name: "test", - parent: "/", - }); - - expect(folderCreateResponse.status).toBe(201); - const folderResponse = await request(app) - .get(`/folder-service/info/${folderCreateResponse.body._id}`) + .get(`/folder-service/info/${folder2._id}`) .set("Cookie", authToken); expect([401, 404]).toContain(folderResponse.status); }); }); + describe("Create folder: POST /folder-service/create", () => { test("Should create folder", async () => { const folderResponse = await request(app) @@ -159,5 +170,166 @@ describe("File Controller", () => { expect(folderResponse.status).toBe(400); }); + test("Should return 400 if title length is greater than 256", async () => { + const folderResponse = await request(app) + .post(`/folder-service/create`) + .set("Cookie", authToken) + .send({ + name: "a" * 257, + parent: "/", + }); + + expect(folderResponse.status).toBe(400); + }); + test("Should default parent to / if not provided", async () => { + const folderResponse = await request(app) + .post(`/folder-service/create`) + .set("Cookie", authToken) + .send({ + name: "test", + }); + + expect(folderResponse.status).toBe(201); + + const folderDbCheck = await mongoose.model("Folder").findOne({ + _id: folderResponse.body._id, + }); + + expect(folderDbCheck.name).toBe(folderResponse.body.name); + expect(folderDbCheck.parent).toBe("/"); + }); + test("Should correctly create nested folder", async () => { + const folderResponse = await request(app) + .post(`/folder-service/create`) + .set("Cookie", authToken) + .send({ + name: "test", + parent: folder._id, + }); + + expect(folderResponse.status).toBe(201); + + const folderDbCheck = await mongoose.model("Folder").findOne({ + _id: folderResponse.body._id, + }); + + expect(folderDbCheck.name).toBe(folderResponse.body.name); + expect(folderDbCheck.parent).toBe(folder._id); + expect(folderDbCheck.parentList.length).toBe(2); + expect(folderDbCheck.parentList[0]).toBe("/"); + expect(folderDbCheck.parentList[1]).toBe(folder._id); + }); + }); + + describe("Rename folder: PATCH /folder-service/rename", () => { + test("Should rename folder", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: folder._id, + title: "newname.txt", + }); + + expect(folderResponse.status).toBe(200); + + const folderDbCheck = await mongoose.model("Folder").findOne({ + _id: folder._id, + }); + + expect(folderDbCheck.name).toBe("newname.txt"); + }); + test("Should rename user 2's folder", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken2) + .send({ + id: folder2._id, + title: "newname.txt", + }); + + expect(folderResponse.status).toBe(200); + + const folderDbCheck = await mongoose.model("Folder").findOne({ + _id: folder2._id, + }); + + expect(folderDbCheck.name).toBe("newname.txt"); + }); + test("Should return 404 if folder not found", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: "5f7e5d8d1f962d5a0f5e8a9e", + title: "newname.txt", + }); + + expect(folderResponse.status).toBe(404); + }); + test("Should return 401 if not authorized", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", "access-token=test") + .send({ + id: folder._id, + title: "newname.txt", + }); + + expect(folderResponse.status).toBe(401); + }); + test("Should return 401/404 if not owner of folder", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: folder2._id, + title: "newname.txt", + }); + + expect([401, 404]).toContain(folderResponse.status); + }); + test("Should return 400 if no title", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: folder._id, + }); + + expect(folderResponse.status).toBe(400); + }); + test("Should return 400 if title length is less than 1", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: folder._id, + title: "", + }); + + expect(folderResponse.status).toBe(400); + }); + test("Should return 400 if title length is greater than 256", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + id: folder._id, + title: "a" * 257, + }); + + expect(folderResponse.status).toBe(400); + }); + test("Should return 400 if no id", async () => { + const folderResponse = await request(app) + .patch(`/folder-service/rename`) + .set("Cookie", authToken) + .send({ + title: "newname.txt", + }); + + expect(folderResponse.status).toBe(400); + }); }); });