summary refs log tree commit diff
path: root/api
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-09-20 23:35:37 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-09-20 23:35:37 +0200
commitecc7683c02430cee57eac59bf2c9c64fe87b7091 (patch)
tree8f39ad0d7d0255d6da07cc088a47e01e748f97b7 /api
parent:sparkles: add option to disable all rate limits (diff)
downloadserver-ecc7683c02430cee57eac59bf2c9c64fe87b7091.tar.xz
:bug: fix unittests
Diffstat (limited to 'api')
-rw-r--r--api/jest/globalSetup.js7
-rw-r--r--api/jest/setup.js4
-rw-r--r--api/src/util/route.ts4
-rw-r--r--api/tests/routes.test.ts88
4 files changed, 82 insertions, 21 deletions
diff --git a/api/jest/globalSetup.js b/api/jest/globalSetup.js
index 98e70fb9..520aa0e2 100644
--- a/api/jest/globalSetup.js
+++ b/api/jest/globalSetup.js
@@ -1,3 +1,4 @@
+const { Config, initDatabase } = require("@fosscord/util");
 const fs = require("fs");
 const path = require("path");
 const { FosscordServer } = require("../dist/Server");
@@ -5,8 +6,12 @@ const Server = new FosscordServer({ port: 3001 });
 global.server = Server;
 module.exports = async () => {
 	try {
-		fs.unlinkSync(path.join(__dirname, "..", "database.db"));
+		fs.unlinkSync(path.join(process.cwd(), "database.db"));
 	} catch {}
+
+	await initDatabase();
+	await Config.init();
+	Config.get().limits.rate.disabled = true;
 	return await Server.start();
 };
 
diff --git a/api/jest/setup.js b/api/jest/setup.js
index bd535866..abc485ae 100644
--- a/api/jest/setup.js
+++ b/api/jest/setup.js
@@ -1,2 +1,2 @@
-// jest.spyOn(global.console, "log").mockImplementation(() => jest.fn());
-// jest.spyOn(global.console, "info").mockImplementation(() => jest.fn());
+jest.spyOn(global.console, "log").mockImplementation(() => jest.fn());
+jest.spyOn(global.console, "info").mockImplementation(() => jest.fn());
diff --git a/api/src/util/route.ts b/api/src/util/route.ts
index 5b06a2b5..e7c7ed1c 100644
--- a/api/src/util/route.ts
+++ b/api/src/util/route.ts
@@ -1,4 +1,4 @@
-import { DiscordApiErrors, Event, EventData, getPermission, PermissionResolvable, Permissions } from "@fosscord/util";
+import { DiscordApiErrors, EVENT, Event, EventData, getPermission, PermissionResolvable, Permissions } from "@fosscord/util";
 import { NextFunction, Request, Response } from "express";
 import fs from "fs";
 import path from "path";
@@ -38,7 +38,7 @@ export interface RouteOptions {
 		response?: RouteResponse;
 		body?: any;
 		path?: string;
-		event?: EventData | EventData[];
+		event?: EVENT | EVENT[];
 		headers?: Record<string, string>;
 	};
 }
diff --git a/api/tests/routes.test.ts b/api/tests/routes.test.ts
index 4cb7e6bc..0473c579 100644
--- a/api/tests/routes.test.ts
+++ b/api/tests/routes.test.ts
@@ -2,12 +2,12 @@
 // TODO: check every route with different database engine
 
 import getRouteDescriptions from "../jest/getRouteDescriptions";
-import supertest, { Response } from "supertest";
 import { join } from "path";
 import fs from "fs";
 import Ajv from "ajv";
 import addFormats from "ajv-formats";
-const request = supertest("http://localhost:3001/api");
+import fetch from "node-fetch";
+import { User } from "@fosscord/util";
 
 const SchemaPath = join(__dirname, "..", "assets", "responses.json");
 const schemas = JSON.parse(fs.readFileSync(SchemaPath, { encoding: "utf8" }));
@@ -18,34 +18,90 @@ export const ajv = new Ajv({
 	schemas,
 	messages: true,
 	strict: true,
-	strictRequired: true
+	strictRequired: true,
+	coerceTypes: true
 });
 addFormats(ajv);
 
+var token: string;
+var user: User;
+beforeAll(async (done) => {
+	try {
+		const response = await fetch("http://localhost:3001/api/auth/register", {
+			method: "POST",
+			body: JSON.stringify({
+				fingerprint: "805826570869932034.wR8vi8lGlFBJerErO9LG5NViJFw",
+				email: "test@example.com",
+				username: "tester",
+				password: "wtp9gep9gw",
+				invite: null,
+				consent: true,
+				date_of_birth: "2000-01-01",
+				gift_code_sku_id: null,
+				captcha_key: null
+			}),
+			headers: {
+				"content-type": "application/json"
+			}
+		});
+		const json = await response.json();
+		token = json.token;
+		user = await (
+			await fetch(`http://localhost:3001/api/users/@me`, {
+				headers: { authorization: token }
+			})
+		).json();
+
+		done();
+	} catch (error) {
+		done(error);
+	}
+});
+
 describe("Automatic unit tests with route description middleware", () => {
 	const routes = getRouteDescriptions();
 
 	routes.forEach((route, pathAndMethod) => {
 		const [path, method] = pathAndMethod.split("|");
 
-		test(path, (done) => {
-			if (!route.example) {
+		test(path, async (done) => {
+			if (!route.test) {
 				console.log(`${(route as any).file}\nrouter.${method} is missing the test property`);
 				return done();
 			}
-			const urlPath = path || route.example?.path;
-			const validate = ajv.getSchema(route.response.body);
-			if (!validate) return done(new Error(`Response schema ${route.response.body} not found`));
-
-			request[method](urlPath)
-				.expect(route.response.status)
-				.expect((err: any, res: Response) => {
-					if (err) return done(err);
-					const valid = validate(res.body);
-					if (!valid) return done(validate.errors);
+			const urlPath = path.replace(":id", user.id) || route.test?.path;
+			var validate: any;
+			if (route.test.body) {
+				validate = ajv.getSchema(route.test.body);
+				if (!validate) return done(new Error(`Response schema ${route.test.body} not found`));
+			}
+
+			var body = "";
 
-					return done();
+			try {
+				const response = await fetch(`http://localhost:3001/api${urlPath}`, {
+					method: method.toUpperCase(),
+					body: JSON.stringify(route.test.body),
+					headers: { ...route.test.headers, authorization: token }
 				});
+
+				body = await response.text();
+
+				expect(response.status, body).toBe(route.test.response.status || 200);
+
+				// TODO: check headers
+				// TODO: expect event
+
+				if (validate) {
+					body = JSON.parse(body);
+					const valid = validate(body);
+					if (!valid) return done(validate.errors);
+				}
+			} catch (error) {
+				return done(error);
+			}
+
+			return done();
 		});
 	});
 });