summary refs log tree commit diff
path: root/tests/cdn_endpoints.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/cdn_endpoints.test.js')
-rw-r--r--tests/cdn_endpoints.test.js238
1 files changed, 238 insertions, 0 deletions
diff --git a/tests/cdn_endpoints.test.js b/tests/cdn_endpoints.test.js
new file mode 100644
index 00000000..5a543e54
--- /dev/null
+++ b/tests/cdn_endpoints.test.js
@@ -0,0 +1,238 @@
+const dotenv = require("dotenv");
+const path = require("path");
+const fs = require("fs");
+dotenv.config();
+
+// TODO: write unittest to check if FileStorage.ts is working
+// TODO: write unitest to check if env vars are defined
+
+if (!process.env.STORAGE_PROVIDER) process.env.STORAGE_PROVIDER = "file";
+// TODO:nodejs path.join trailing slash windows compatible
+if (process.env.STORAGE_PROVIDER === "file") {
+	if (process.env.STORAGE_LOCATION) {
+		if (!process.env.STORAGE_LOCATION.startsWith("/")) {
+			process.env.STORAGE_LOCATION = path.join(
+				__dirname,
+				"..",
+				process.env.STORAGE_LOCATION,
+				"/"
+			);
+		}
+	} else {
+		process.env.STORAGE_LOCATION = path.join(__dirname, "..", "files", "/");
+	}
+	if(!fs.existsSync(process.env.STORAGE_LOCATION)) fs.mkdirSync(process.env.STORAGE_LOCATION, {recursive:true});
+}
+const { CDNServer } = require("../dist/Server");
+const { Config } = require("@fosscord/util");
+const supertest = require("supertest");
+const request = supertest("http://localhost:3003");
+const server = new CDNServer({ port: Number(process.env.PORT) || 3003 });
+
+beforeAll(async () => {
+	await server.start();
+	return server;
+});
+
+afterAll(() => {
+	return server.stop();
+});
+
+describe("/ping", () => {
+	describe("GET", () => {
+		describe("without signature specified", () => {
+			test("route should respond with 200", async () => {
+				let response = await request.get("/ping");
+				expect(response.text).toBe("pong");
+			});
+		});
+	});
+});
+
+describe("/attachments", () => {
+	describe("POST", () => {
+		describe("without signature specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request.post("/attachments/123456789");
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, without file specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request
+					.post("/attachments/123456789")
+					.set({ signature: Config.get().security.requestSignature });
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, with file specified ", () => {
+			test("route should respond with Content-type: application/json, 200 and res.body.url", async () => {
+				const response = await request
+					.post("/attachments/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				expect(response.statusCode).toBe(200);
+				expect(response.headers["content-type"]).toEqual(
+					expect.stringContaining("json")
+				);
+				expect(response.body.url).toBeDefined();
+			});
+		});
+	});
+	describe("GET", () => {
+		describe("getting uploaded image by url returned by POST /attachments", () => {
+			test("route should respond with 200", async () => {
+				let response = await request
+					.post("/attachments/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				request
+					.get(response.body.url.replace("http://localhost:3003", ""))
+					.then((x) => {
+						expect(x.statusCode).toBe(200);
+					});
+			});
+		});
+	});
+	describe("DELETE", () => {
+		describe("deleting uploaded image by url returned by POST /attachments", () => {
+			test("route should respond with res.body.success", async () => {
+				let response = await request
+					.post("/attachments/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				request
+					.delete(
+						response.body.url.replace("http://localhost:3003", "")
+					)
+					.then((x) => {
+						expect(x.body.success).toBeDefined();
+					});
+			});
+		});
+	});
+});
+
+describe("/avatars", () => {
+	describe("POST", () => {
+		describe("without signature specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request.post("/avatars/123456789");
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, without file specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request
+					.post("/avatars/123456789")
+					.set({ signature: Config.get().security.requestSignature });
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, with file specified ", () => {
+			test("route should respond with Content-type: application/json, 200 and res.body.url", async () => {
+				const response = await request
+					.post("/avatars/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				expect(response.statusCode).toBe(200);
+				expect(response.headers["content-type"]).toEqual(
+					expect.stringContaining("json")
+				);
+				expect(response.body.url).toBeDefined();
+			});
+		});
+	});
+	describe("GET", () => {
+		describe("getting uploaded image by url returned by POST /avatars", () => {
+			test("route should respond with 200", async () => {
+				let response = await request
+					.post("/avatars/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				request
+					.get(response.body.url.replace("http://localhost:3003", ""))
+					.then((x) => {
+						expect(x.statusCode).toBe(200);
+					});
+			});
+		});
+	});
+	describe("DELETE", () => {
+		describe("deleting uploaded image by url returned by POST /avatars", () => {
+			test("route should respond with res.body.success", async () => {
+				let response = await request
+					.post("/avatars/123456789")
+					.set({ signature: Config.get().security.requestSignature })
+					.attach("file", __dirname + "/antman.jpg");
+				request
+					.delete(
+						response.body.url.replace("http://localhost:3003", "")
+					)
+					.then((x) => {
+						expect(x.body.success).toBeDefined();
+					});
+			});
+		});
+	});
+});
+
+describe("/external", () => {
+	describe("POST", () => {
+		describe("without signature specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request.post("/external");
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, without file specified", () => {
+			test("route should respond with 400", async () => {
+				const response = await request
+					.post("/external")
+					.set({ signature: Config.get().security.requestSignature });
+				expect(response.statusCode).toBe(400);
+			});
+		});
+		describe("with signature specified, with file specified ", () => {
+			test("route should respond with Content-type: application/json, 200 and res.body.url", async () => {
+				const response = await request
+					.post("/external")
+					.set({ signature: Config.get().security.requestSignature })
+					.send({
+						url: "https://i.ytimg.com/vi_webp/TiXzhQr5AUc/mqdefault.webp",
+					});
+				expect(response.statusCode).toBe(200);
+				expect(response.headers["content-type"]).toEqual(
+					expect.stringContaining("json")
+				);
+				expect(response.body.id).toBeDefined();
+			});
+		});
+		describe("with signature specified, with falsy url specified ", () => {
+			test("route should respond with 400", async () => {
+				const response = await request
+					.post("/external")
+					.set({ signature: Config.get().security.requestSignature })
+					.send({
+						url: "notavalidurl.123",
+					});
+				expect(response.statusCode).toBe(400);
+			});
+		});
+	});
+	describe("GET", () => {
+		describe("getting uploaded image by url returned by POST /avatars", () => {
+			test("route should respond with 200", async () => {
+				let response = await request
+					.post("/external")
+					.set({ signature: Config.get().security.requestSignature })
+					.send({
+						url: "https://i.ytimg.com/vi_webp/TiXzhQr5AUc/mqdefault.webp",
+					});
+				request.get(`external/${response.body.id}`).then((x) => {
+					expect(x.statusCode).toBe(200);
+				});
+			});
+		});
+	});
+});