Files
myDrive/tests/controller/file-controller.test.js
T

1601 lines
48 KiB
JavaScript

const request = require("supertest");
const app = require("../utils/express-app");
const mongoose = require("mongoose");
const { MongoMemoryServer } = require("mongodb-memory-server");
const getEnvVariables = require("../../dist-backend/enviroment/get-env-variables");
const getKey = require("../../dist-backend/key/get-key").default;
getEnvVariables();
const env = require("../../dist-backend/enviroment/env");
const { envFileFix } = require("../utils/db-setup");
const { ObjectId } = require("mongodb");
let mongoServer;
let authToken;
let authToken2;
let file;
let file2;
let user;
let user2;
describe("File Controller", () => {
beforeAll(async () => {
envFileFix(env);
await getKey();
mongoServer = await MongoMemoryServer.create();
await mongoose.connect(mongoServer.getUri(), { useNewUrlParser: true });
user = await request(app)
.post("/user-service/create")
.send({
email: "test@test.com",
password: "test1234",
})
.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 () => {
await mongoose.model("fs.files").deleteMany({});
await mongoose.model("Folder").deleteMany({});
file = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c2"),
filename: "test.txt",
uploadDate: new Date(),
length: 10000,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10000",
IV: "test",
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 () => {
await mongoose.disconnect();
await mongoServer.stop();
});
describe("File info: GET /file-service/info/:id", () => {
test("Should return file info", async () => {
const fileResponse = await request(app)
.get(`/file-service/info/${file._id}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
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`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.get(`/file-service/info/${file._id}`)
.set("Cookie", "access-token=test");
expect(fileResponse.status).toBe(401);
});
test("Should return 401/404 if not owner of file", async () => {
const fileResponse = await request(app)
.get(`/file-service/info/${file2._id}`)
.set("Cookie", authToken);
expect([401, 404]).toContain(fileResponse.status);
});
});
describe("File rename: PATCH /file-service/rename", () => {
test("Should rename file", async () => {
const fileResponse = await request(app)
.patch(`/file-service/rename`)
.set("Cookie", authToken)
.send({
id: file._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: file._id,
});
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`)
.set("Cookie", authToken)
.send({
id: "5f7e5d8d1f962d5a0f5e8a9e",
title: "newname.txt",
});
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/rename`)
.set("Cookie", "access-token=test")
.send({
id: file._id,
title: "newname.txt",
});
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`)
.set("Cookie", authToken)
.send({
id: file._id,
});
expect(fileResponse.status).toBe(400);
});
test("Should return 400 if title length is less than 1", async () => {
const fileResponse = await request(app)
.patch(`/file-service/rename`)
.set("Cookie", authToken)
.send({
id: file._id,
title: "",
});
expect(fileResponse.status).toBe(400);
});
test("Should return 400 if title length is greater than 256", async () => {
const fileResponse = await request(app)
.patch(`/file-service/rename`)
.set("Cookie", authToken)
.send({
id: file._id,
title: "a".repeat(257),
});
expect(fileResponse.status).toBe(400);
});
test("Should return 400 if no id", async () => {
const fileResponse = await request(app)
.patch(`/file-service/rename`)
.set("Cookie", authToken)
.send({
title: "newname.txt",
});
expect(fileResponse.status).toBe(400);
});
});
describe("Trash file: PATCH /file-service/trash", () => {
test("Should trash file", async () => {
const fileResponse = await request(app)
.patch(`/file-service/trash`)
.set("Cookie", authToken)
.send({
id: file._id,
});
expect(fileResponse.status).toBe(200);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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`)
.set("Cookie", authToken)
.send({
id: "5f7e5d8d1f962d5a0f5e8a9e",
});
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/trash`)
.set("Cookie", "access-token=test")
.send({
id: file._id,
});
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`)
.set("Cookie", authToken)
.send();
expect(fileResponse.status).toBe(400);
});
});
describe("Restore file: PATCH /file-service/restore", () => {
test("Should restore file", async () => {
await mongoose
.model("fs.files")
.updateOne({ _id: file._id }, { $set: { "metadata.trashed": true } });
const fileResponse = await request(app)
.patch(`/file-service/restore`)
.set("Cookie", authToken)
.send({
id: file._id,
});
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.metadata.trashed).toBe(null);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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`)
.set("Cookie", authToken)
.send({
id: "5f7e5d8d1f962d5a0f5e8a9e",
});
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/restore`)
.set("Cookie", "access-token=test")
.send({
id: file._id,
});
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`)
.set("Cookie", authToken)
.send();
expect(fileResponse.status).toBe(400);
});
});
describe("Make public file: PATCH /file-service/make-public", () => {
test("Should make file public", async () => {
const fileResponse = await request(app)
.patch(`/file-service/make-public/${file._id}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/make-public/${file._id}`)
.set("Cookie", "access-token=test");
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/", () => {
test("Should make file one time public", async () => {
const fileResponse = await request(app)
.patch(`/file-service/make-one/${file._id}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/make-one/${file._id}`)
.set("Cookie", "access-token=test");
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", () => {
test("Should make file private", async () => {
await mongoose
.model("fs.files")
.updateOne(
{ _id: file._id },
{ $set: { "metadata.link": "test", "metadata.linkType": "public" } }
);
const fileResponse = await request(app)
.patch(`/file-service/remove-link/${file._id}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/remove-link/${file._id}`)
.set("Cookie", "access-token=test");
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", () => {
test("Should return public file info", async () => {
const makePublicResponse = await request(app)
.patch(`/file-service/make-public/${file._id}`)
.set("Cookie", authToken);
const tempToken = makePublicResponse.body.token;
const fileResponse = await request(app)
.get(`/file-service/public/info/${file._id}/${tempToken}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(file.filename === fileResponse.body.filename).toBeTruthy();
});
test("Should return 404 if file not found", async () => {
const fileResponse = await request(app)
.get(`/file-service/public/info/5f7e5d8d1f962d5a0f5e8a9e/test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(404);
});
test("Should return 401/404 if not authorized", async () => {
const fileResponse = await request(app)
.get(`/file-service/public/info/${file._id}/abcd`)
.set("Cookie", authToken);
expect([401, 404]).toContain(fileResponse.status);
});
test("Should return 401/404 if not public", async () => {
const makePublicResponse = await request(app)
.patch(`/file-service/make-public/${file._id}`)
.set("Cookie", authToken);
const tempToken = makePublicResponse.body.token;
await mongoose
.model("fs.files")
.updateOne(
{ _id: file._id },
{ $set: { "metadata.link": null, "metadata.linkType": null } }
);
const fileResponse = await request(app)
.get(`/file-service/public/info/${file._id}/${tempToken}`)
.set("Cookie", authToken);
expect([401, 404]).toContain(fileResponse.status);
});
});
describe("Move file: PATCH /file-service/move", () => {
test("Should move file", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.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", authToken)
.send({
id: file._id,
parentID: folderId,
});
expect(fileResponse.status).toBe(200);
const fileDbCheck = await mongoose.model("fs.files").findOne({
_id: file._id,
});
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")
.set("Cookie", authToken)
.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", authToken)
.send({
id: "5f7e5d8d1f962d5a0f5e8a9e",
parentID: folderId,
});
expect(fileResponse.status).toBe(404);
});
test("Should return 404 if folder not found", async () => {
const fileResponse = await request(app)
.patch(`/file-service/move`)
.set("Cookie", authToken)
.send({
id: file._id,
parentID: "5f7e5d8d1f962d5a0f5e8a9e",
});
expect(fileResponse.status).toBe(404);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.patch(`/file-service/move`)
.set("Cookie", "access-token=test")
.send({
id: file._id,
parentID: "5f7e5d8d1f962d5a0f5e8a9e",
});
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")
.send({
email: "test2@test.com",
password: "test1234",
})
.set("uuid", 12314123123);
const authToken2 = userResponse2.headers["set-cookie"]
.map((cookie) => cookie.split(";")[0])
.join("; ");
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", authToken)
.send({
id: file._id,
parentID: folderId,
});
expect([401, 404]).toContain(fileResponse.status);
});
test("Should correctly move into nested folder", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
const folderResponse2 = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test2",
parent: folderResponse.body._id,
});
expect(folderResponse2.status).toBe(201);
const folderId = folderResponse2.body._id;
const fileResponse = await request(app)
.patch(`/file-service/move`)
.set("Cookie", authToken)
.send({
id: file._id,
parentID: folderId,
});
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.metadata.parent).toBe(folderResponse2.body._id);
expect(fileResponse.body.metadata.parentList).toBe(
`/,${folderResponse.body._id},${folderResponse2.body._id}`
);
});
test("Should move file home", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.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", authToken)
.send({
id: file._id,
parentID: folderId,
});
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.metadata.parent).toBe(folderId);
expect(fileResponse.body.metadata.parentList).toBe(`/,${folderId}`);
const fileResponse2 = await request(app)
.patch(`/file-service/move`)
.set("Cookie", authToken)
.send({
id: file._id,
parentID: "/",
});
expect(fileResponse2.status).toBe(200);
expect(fileResponse2.body.metadata.parent).toBe("/");
expect(fileResponse2.body.metadata.parentList).toBe("/");
});
});
describe("Get quick file list: GET /file-service/quick-list", () => {
test("Should return quick file list", async () => {
const quickListResponse = await request(app)
.get(`/file-service/quick-list`)
.set("Cookie", authToken);
expect(quickListResponse.status).toBe(200);
expect(quickListResponse.body.length).toBe(1);
});
test("Should return 401 if not authorized", async () => {
const quickListResponse = await request(app)
.get(`/file-service/quick-list`)
.set("Cookie", "access-token=test");
expect(quickListResponse.status).toBe(401);
});
test("Should return quick file list including files in folders", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const quickListResponse = await request(app)
.get(`/file-service/quick-list`)
.set("Cookie", authToken);
expect(quickListResponse.status).toBe(200);
expect(quickListResponse.body.length).toBe(2);
});
test("Should not return a file that is trashed", async () => {
const fileResponse = await request(app)
.patch(`/file-service/trash`)
.set("Cookie", authToken)
.send({
id: file._id,
});
expect(fileResponse.status).toBe(200);
const quickListResponse = await request(app)
.get(`/file-service/quick-list`)
.set("Cookie", authToken);
expect(quickListResponse.status).toBe(200);
expect(quickListResponse.body.length).toBe(0);
});
test("Should return newer files first", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const quickListResponse = await request(app)
.get(`/file-service/quick-list`)
.set("Cookie", authToken);
expect(quickListResponse.status).toBe(200);
expect(quickListResponse.body[0].filename).toBe("test2.txt");
});
});
describe("Get file list: GET /file-service/list", () => {
test("Should return file list", async () => {
const fileResponse = await request(app)
.get(`/file-service/list`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.get(`/file-service/list`)
.set("Cookie", "access-token=test");
expect(fileResponse.status).toBe(401);
});
test("Should return files in descending date order/default order", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list`)
.set("Cookie", authToken);
const fileResponse2 = await request(app)
.get(`/file-service/list?sortBy=date_desc`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body[0].filename).toBe(file2.filename);
expect(fileResponse.body[1].filename).toBe(file.filename);
expect(fileResponse2.status).toBe(200);
expect(fileResponse2.body[0].filename).toBe(file2.filename);
expect(fileResponse2.body[1].filename).toBe(file.filename);
});
test("Should return files in ascending date order", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?sortBy=date_asc`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body[0].filename).toBe(file.filename);
expect(fileResponse.body[1].filename).toBe(file2.filename);
});
test("Should return files in descending alphabetical order", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?sortBy=alp_desc`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body[0].filename).toBe(file.filename);
expect(fileResponse.body[1].filename).toBe(file2.filename);
});
test("Should return files in ascending alphabetical order", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?sortBy=alp_asc`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body[0].filename).toBe(file2.filename);
expect(fileResponse.body[1].filename).toBe(file.filename);
});
test("Should correctly show only home files", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?parent=/`)
.set("Cookie", authToken);
const fileResponse2 = await request(app)
.get(`/file-service/list`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file.filename);
expect(fileResponse2.status).toBe(200);
expect(fileResponse2.body.length).toBe(1);
expect(fileResponse2.body[0].filename).toBe(file.filename);
});
test("Should correctly show only folder files", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const folderResponse2 = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test2",
parent: "/",
});
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c4"),
filename: "b.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse2.body._id,
parentList: `/,${folderResponse2.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?parent=${folderResponse.body._id}`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file2.filename);
});
test("Should correctly show only file search results", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?search=a`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file2.filename);
});
test("Should correctly show nested files search results", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "test1.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?search=test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(2);
});
test("Should return 0 files if no search results", async () => {
const fileResponse = await request(app)
.get(`/file-service/list?search=asdfasdfkl`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(0);
});
test("Should correctly show only trashed files", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
trashed: true,
},
});
const fileResponse = await request(app)
.get(`/file-service/list?trashMode=true`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file2.filename);
});
test("Should correctly show only trashes files in a folder", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
await request(app)
.patch("/folder-service/trash")
.set("Cookie", authToken)
.send({
id: folderResponse.body._id,
});
expect(folderResponse.status).toBe(201);
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c4"),
filename: "ab.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
trashed: true,
},
});
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
trashed: true,
},
});
const fileResponse = await request(app)
.get(
`/file-service/list?parent=${folderResponse.body._id}&trashMode=true`
)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file2.filename);
});
test("Should only return files that belong to the user", async () => {
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c3"),
filename: "a.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/list`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.length).toBe(1);
expect(fileResponse.body[0].filename).toBe(file.filename);
});
test("Should not return file that is processing", async () => {
await mongoose
.model("fs.files")
.updateOne(
{ _id: file._id },
{ $set: { "metadata.processingFile": true } }
);
const fileResponse2 = await request(app)
.get(`/file-service/list`)
.set("Cookie", authToken);
expect(fileResponse2.status).toBe(200);
expect(fileResponse2.body.length).toBe(0);
});
});
describe("Get suggested list: GET /file-service/suggested-list", () => {
test("Should return suggested list", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(1);
expect(fileResponse.body.folderList.length).toBe(1);
});
test("Should return 401 if not authorized", async () => {
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test`)
.set("Cookie", "access-token=test");
expect(fileResponse.status).toBe(401);
});
test("If search is provided should atleast be length of 1", async () => {
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(400);
});
test("Should return nested files and folders", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test2",
parent: folderResponse.body._id,
});
await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c4"),
filename: "test3.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: folderResponse.body._id,
parentList: `/,${folderResponse.body._id}`,
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
},
});
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(2);
expect(fileResponse.body.folderList.length).toBe(2);
});
test("Should not reutrn items not in the search query", async () => {
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=qweqweqwe`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(0);
expect(fileResponse.body.folderList.length).toBe(0);
});
test("Should not return files that are processing", async () => {
await mongoose
.model("fs.files")
.updateOne(
{ _id: file._id },
{ $set: { "metadata.processingFile": true } }
);
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(0);
});
test("Should not return items that are trashed", async () => {
await mongoose
.model("fs.files")
.updateOne({ _id: file._id }, { $set: { "metadata.trashed": true } });
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
await mongoose
.model("Folder")
.updateOne(
{ _id: folderResponse.body._id },
{ $set: { trashed: true } }
);
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(0);
expect(fileResponse.body.folderList.length).toBe(0);
});
test("Should only return trashed items", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c4"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: false,
size: "10001",
IV: "test1",
isVideo: false,
trashed: true,
},
});
const folderResponse = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
expect(folderResponse.status).toBe(201);
const folderResponse2 = await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test2",
parent: "/",
});
await mongoose
.model("Folder")
.updateOne(
{ _id: folderResponse2.body._id },
{ $set: { trashed: true } }
);
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test&trashMode=true`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(1);
expect(fileResponse.body.folderList.length).toBe(1);
expect(fileResponse.body.fileList[0].filename).toBe(file2.filename);
expect(fileResponse.body.folderList[0].name).toBe(
folderResponse2.body.name
);
});
test("Should only reutrn moedia items", async () => {
const file2 = await mongoose.model("fs.files").create({
_id: new ObjectId("5eb88f29ecb8c9319ddca3c4"),
filename: "test2.txt",
uploadDate: new Date(),
length: 10001,
metadata: {
owner: user.body.user._id,
parent: "/",
parentList: "/",
hasThumbnail: true,
size: "10001",
IV: "test1",
isVideo: true,
},
});
await request(app)
.post("/folder-service/create")
.set("Cookie", authToken)
.send({
name: "test",
parent: "/",
});
const fileResponse = await request(app)
.get(`/file-service/suggested-list?search=test&mediaMode=true`)
.set("Cookie", authToken);
expect(fileResponse.status).toBe(200);
expect(fileResponse.body.fileList.length).toBe(1);
expect(fileResponse.body.fileList[0].filename).toBe(file2.filename);
expect(fileResponse.body.folderList.length).toBe(0);
});
});
});