diff --git a/api/jest/getRouteDescriptions.ts b/api/jest/getRouteDescriptions.ts
new file mode 100644
index 00000000..33922899
--- /dev/null
+++ b/api/jest/getRouteDescriptions.ts
@@ -0,0 +1,58 @@
+import { traverseDirectory } from "lambert-server";
+import path from "path";
+import express from "express";
+import * as RouteUtility from "../dist/util/route";
+import { RouteOptions } from "../dist/util/route";
+const Router = express.Router;
+
+const routes = new Map<string, RouteUtility.RouteOptions>();
+let currentPath = "";
+let currentFile = "";
+const methods = ["get", "post", "put", "delete", "patch"];
+
+function registerPath(file, method, prefix, path, ...args) {
+ const urlPath = prefix + path;
+ const sourceFile = file.replace("/dist/", "/src/").replace(".js", ".ts");
+ const opts: RouteOptions = args.find((x) => typeof x === "object");
+ if (opts) {
+ routes.set(urlPath + "|" + method, opts); // @ts-ignore
+ opts.file = sourceFile;
+ // console.log(method, urlPath, opts);
+ } else {
+ console.log(`${sourceFile}\nrouter.${method}("${path}") is missing the "route()" description middleware\n`, args);
+ }
+}
+
+function routeOptions(opts) {
+ return opts;
+}
+
+// @ts-ignore
+RouteUtility.route = routeOptions;
+
+express.Router = (opts) => {
+ const path = currentPath;
+ const file = currentFile;
+ const router = Router(opts);
+
+ for (const method of methods) {
+ router[method] = registerPath.bind(null, file, method, path);
+ }
+
+ return router;
+};
+
+export default function getRouteDescriptions() {
+ const root = path.join(__dirname, "..", "dist", "routes", "/");
+ traverseDirectory({ dirname: root, recursive: true }, (file) => {
+ currentFile = file;
+ let path = file.replace(root.slice(0, -1), "");
+ path = path.split(".").slice(0, -1).join("."); // trancate .js/.ts file extension of path
+ path = path.replaceAll("#", ":").replaceAll("\\", "/"); // replace # with : for path parameters and windows paths with slashes
+ if (path.endsWith("/index")) path = path.slice(0, "/index".length * -1); // delete index from path
+ currentPath = path;
+
+ require(file);
+ });
+ return routes;
+}
diff --git a/api/jest/globalSetup.js b/api/jest/globalSetup.js
new file mode 100644
index 00000000..98e70fb9
--- /dev/null
+++ b/api/jest/globalSetup.js
@@ -0,0 +1,15 @@
+const fs = require("fs");
+const path = require("path");
+const { FosscordServer } = require("../dist/Server");
+const Server = new FosscordServer({ port: 3001 });
+global.server = Server;
+module.exports = async () => {
+ try {
+ fs.unlinkSync(path.join(__dirname, "..", "database.db"));
+ } catch {}
+ return await Server.start();
+};
+
+// afterAll(async () => {
+// return await Server.stop();
+// });
diff --git a/api/jest/setup.js b/api/jest/setup.js
index abc485ae..bd535866 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());
|