@prosopo/client-example-server 2.7.122 → 2.7.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build$colon$cjs.log +15 -31
- package/.turbo/turbo-build$colon$tsc.log +21 -21
- package/.turbo/turbo-build.log +16 -31
- package/CHANGELOG.md +35 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/app.d.ts +15 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +122 -93
- package/dist/app.js.map +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/app.cjs +148 -106
- package/dist/cjs/controllers/auth.cjs +180 -244
- package/dist/cjs/models/user.cjs +21 -22
- package/dist/cjs/routes/routes.cjs +21 -24
- package/dist/cjs/utils/connection.cjs +20 -23
- package/dist/cjs/utils/database.cjs +3 -28
- package/dist/controllers/auth.d.ts +1 -1
- package/dist/controllers/auth.d.ts.map +1 -1
- package/dist/controllers/auth.js +173 -241
- package/dist/controllers/auth.js.map +1 -1
- package/dist/models/user.d.ts +2 -2
- package/dist/models/user.js +18 -22
- package/dist/routes/routes.d.ts.map +1 -1
- package/dist/routes/routes.js +18 -24
- package/dist/routes/routes.js.map +1 -1
- package/dist/tests/app.unit.test.d.ts +2 -0
- package/dist/tests/app.unit.test.d.ts.map +1 -0
- package/dist/tests/app.unit.test.js +318 -0
- package/dist/tests/app.unit.test.js.map +1 -0
- package/dist/tests/appEntrypoint.unit.test.d.ts +2 -0
- package/dist/tests/appEntrypoint.unit.test.d.ts.map +1 -0
- package/dist/tests/appEntrypoint.unit.test.js +100 -0
- package/dist/tests/appEntrypoint.unit.test.js.map +1 -0
- package/dist/tests/auth.unit.test.d.ts +2 -0
- package/dist/tests/auth.unit.test.d.ts.map +1 -0
- package/dist/tests/auth.unit.test.js +426 -0
- package/dist/tests/auth.unit.test.js.map +1 -0
- package/dist/tests/authHarness.d.ts +40 -0
- package/dist/tests/authHarness.d.ts.map +1 -0
- package/dist/tests/authHarness.js +57 -0
- package/dist/tests/authHarness.js.map +1 -0
- package/dist/tests/clientExampleServer.test-d.d.ts +2 -0
- package/dist/tests/clientExampleServer.test-d.d.ts.map +1 -0
- package/dist/tests/clientExampleServer.test-d.js +84 -0
- package/dist/tests/clientExampleServer.test-d.js.map +1 -0
- package/dist/tests/routes.unit.test.d.ts +2 -0
- package/dist/tests/routes.unit.test.d.ts.map +1 -0
- package/dist/tests/routes.unit.test.js +123 -0
- package/dist/tests/routes.unit.test.js.map +1 -0
- package/dist/tests/utils.unit.test.d.ts +2 -0
- package/dist/tests/utils.unit.test.d.ts.map +1 -0
- package/dist/tests/utils.unit.test.js +125 -0
- package/dist/tests/utils.unit.test.js.map +1 -0
- package/dist/utils/connection.js +14 -19
- package/dist/utils/database.js +4 -8
- package/package.json +17 -14
- package/src/app.ts +114 -73
- package/src/controllers/auth.ts +40 -31
- package/src/routes/routes.ts +5 -2
- package/src/tests/app.unit.test.ts +428 -0
- package/src/tests/appEntrypoint.unit.test.ts +154 -0
- package/src/tests/auth.unit.test.ts +859 -0
- package/src/tests/authHarness.ts +131 -0
- package/src/tests/clientExampleServer.test-d.ts +146 -0
- package/src/tests/routes.unit.test.ts +166 -0
- package/src/tests/utils.unit.test.ts +169 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vite.test.config.ts +18 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assertType, describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
import { createApp, isDevelopmentOrTest, main, resolvePort, resolveVerifyEndpoint, resolveVerifyType, startServer, } from "../app.js";
|
|
3
|
+
import { isAuth, login, signup } from "../controllers/auth.js";
|
|
4
|
+
import getRoutes from "../routes/routes.js";
|
|
5
|
+
import connectionFactory from "../utils/connection.js";
|
|
6
|
+
import memoryServerSetup from "../utils/database.js";
|
|
7
|
+
describe("the app module's types", () => {
|
|
8
|
+
test("the environment readers take no arguments", () => {
|
|
9
|
+
expectTypeOf(resolveVerifyEndpoint).parameters.toEqualTypeOf();
|
|
10
|
+
expectTypeOf(resolveVerifyEndpoint).returns.toEqualTypeOf();
|
|
11
|
+
expectTypeOf(resolveVerifyType).returns.toEqualTypeOf();
|
|
12
|
+
expectTypeOf(isDevelopmentOrTest).returns.toEqualTypeOf();
|
|
13
|
+
});
|
|
14
|
+
test("the verification type is a closed set", () => {
|
|
15
|
+
expectTypeOf().toEqualTypeOf();
|
|
16
|
+
assertType("carrier-pigeon");
|
|
17
|
+
});
|
|
18
|
+
test("the port comes from the shared server config, not a loose object", () => {
|
|
19
|
+
expectTypeOf(resolvePort)
|
|
20
|
+
.parameter(0)
|
|
21
|
+
.toEqualTypeOf();
|
|
22
|
+
expectTypeOf(resolvePort).returns.toEqualTypeOf();
|
|
23
|
+
});
|
|
24
|
+
test("createApp yields an express app the caller can mount routes on", () => {
|
|
25
|
+
expectTypeOf(createApp).returns.toEqualTypeOf();
|
|
26
|
+
});
|
|
27
|
+
test("startServer's module directory is optional and it returns a server", () => {
|
|
28
|
+
expectTypeOf(startServer).parameter(1).toEqualTypeOf();
|
|
29
|
+
expectTypeOf(startServer).parameter(2).toEqualTypeOf();
|
|
30
|
+
expectTypeOf(startServer).returns.toEqualTypeOf();
|
|
31
|
+
});
|
|
32
|
+
test("main resolves to the server it started, so a caller can close it", () => {
|
|
33
|
+
expectTypeOf(main).parameters.toEqualTypeOf();
|
|
34
|
+
expectTypeOf(main).returns.toEqualTypeOf();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("the router's types", () => {
|
|
38
|
+
test("routes are built from a connection, config and verification settings", () => {
|
|
39
|
+
expectTypeOf(getRoutes).parameters.toEqualTypeOf();
|
|
40
|
+
expectTypeOf(getRoutes).returns.toEqualTypeOf();
|
|
41
|
+
});
|
|
42
|
+
test("every argument is required", () => {
|
|
43
|
+
getRoutes({}, {}, "endpoint");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("the controllers' types", () => {
|
|
47
|
+
test("signup and login are express handlers with their context bound first", () => {
|
|
48
|
+
expectTypeOf(signup).parameter(0).toEqualTypeOf();
|
|
49
|
+
expectTypeOf(signup)
|
|
50
|
+
.parameter(1)
|
|
51
|
+
.toEqualTypeOf();
|
|
52
|
+
expectTypeOf(signup).parameter(2).toEqualTypeOf();
|
|
53
|
+
expectTypeOf(signup).parameter(3).toEqualTypeOf();
|
|
54
|
+
expectTypeOf(signup).returns.toExtend();
|
|
55
|
+
expectTypeOf(login).parameter(0).toEqualTypeOf();
|
|
56
|
+
expectTypeOf(login).returns.toEqualTypeOf();
|
|
57
|
+
});
|
|
58
|
+
test("isAuth needs nothing bound, so it mounts directly", () => {
|
|
59
|
+
expectTypeOf(isAuth).parameters.toEqualTypeOf();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("the persistence types", () => {
|
|
63
|
+
test("connectionFactory takes a URI and returns a mongoose connection", () => {
|
|
64
|
+
expectTypeOf(connectionFactory).parameters.toEqualTypeOf();
|
|
65
|
+
expectTypeOf(connectionFactory).returns.toEqualTypeOf();
|
|
66
|
+
});
|
|
67
|
+
test("the memory server hands back a URI string", () => {
|
|
68
|
+
expectTypeOf(memoryServerSetup).parameters.toEqualTypeOf();
|
|
69
|
+
expectTypeOf(memoryServerSetup).returns.toEqualTypeOf();
|
|
70
|
+
});
|
|
71
|
+
test("the user schema is typed by the interface it stores", () => {
|
|
72
|
+
expectTypeOf().toEqualTypeOf();
|
|
73
|
+
expectTypeOf().toEqualTypeOf();
|
|
74
|
+
});
|
|
75
|
+
test("a user document cannot be built without credentials", () => {
|
|
76
|
+
assertType({
|
|
77
|
+
id: 1,
|
|
78
|
+
email: "user@example.com",
|
|
79
|
+
name: "user",
|
|
80
|
+
password: "0xhash",
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=clientExampleServer.test-d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientExampleServer.test-d.js","sourceRoot":"","sources":["../../src/tests/clientExampleServer.test-d.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/routes.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
3
|
+
import getRoutes from "../routes/routes.js";
|
|
4
|
+
import { VERIFY_ENDPOINT, serverConfig } from "./authHarness.js";
|
|
5
|
+
const mocks = vi.hoisted(() => ({
|
|
6
|
+
calls: [],
|
|
7
|
+
}));
|
|
8
|
+
vi.mock("../controllers/auth.js", () => {
|
|
9
|
+
const record = (handler) => (...args) => {
|
|
10
|
+
mocks.calls.push({ handler, args: args.slice(0, 4) });
|
|
11
|
+
const res = args[args.length - 2];
|
|
12
|
+
res.status(200).json({ handler });
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
signup: record("signup"),
|
|
16
|
+
login: record("login"),
|
|
17
|
+
isAuth: (_req, res) => res
|
|
18
|
+
.status(200)
|
|
19
|
+
.json({ handler: "isAuth" }),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
const connection = {};
|
|
23
|
+
let server;
|
|
24
|
+
const listen = () => {
|
|
25
|
+
const app = express();
|
|
26
|
+
app.use(express.json());
|
|
27
|
+
app.use(getRoutes(connection, serverConfig(), VERIFY_ENDPOINT, "api"));
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
server = app.listen(0, () => {
|
|
30
|
+
const { port } = server?.address();
|
|
31
|
+
resolve(`http://127.0.0.1:${port}`);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
afterEach(async () => {
|
|
36
|
+
mocks.calls.length = 0;
|
|
37
|
+
await new Promise((resolve) => {
|
|
38
|
+
if (!server)
|
|
39
|
+
return resolve();
|
|
40
|
+
server.close(() => resolve());
|
|
41
|
+
server = undefined;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("the router", () => {
|
|
45
|
+
test("serves the public resource without any authentication", async () => {
|
|
46
|
+
const base = await listen();
|
|
47
|
+
const response = await fetch(`${base}/public`);
|
|
48
|
+
expect(response.status).toBe(200);
|
|
49
|
+
expect(await response.json()).toEqual({
|
|
50
|
+
message: "here is your public resource",
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
test("answers health checks", async () => {
|
|
54
|
+
const base = await listen();
|
|
55
|
+
const response = await fetch(`${base}/health`);
|
|
56
|
+
expect(response.status).toBe(200);
|
|
57
|
+
expect(await response.json()).toEqual({ status: "ok" });
|
|
58
|
+
});
|
|
59
|
+
test("routes a signup to the signup handler, with the bound context", async () => {
|
|
60
|
+
const base = await listen();
|
|
61
|
+
const response = await fetch(`${base}/signup`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: { "content-type": "application/json" },
|
|
64
|
+
body: JSON.stringify({ email: "user@example.com" }),
|
|
65
|
+
});
|
|
66
|
+
expect(response.status).toBe(200);
|
|
67
|
+
expect(mocks.calls[0]?.handler).toBe("signup");
|
|
68
|
+
expect(mocks.calls[0]?.args).toEqual([
|
|
69
|
+
connection,
|
|
70
|
+
serverConfig(),
|
|
71
|
+
VERIFY_ENDPOINT,
|
|
72
|
+
"api",
|
|
73
|
+
]);
|
|
74
|
+
});
|
|
75
|
+
test("routes a login to the login handler", async () => {
|
|
76
|
+
const base = await listen();
|
|
77
|
+
await fetch(`${base}/login`, {
|
|
78
|
+
method: "POST",
|
|
79
|
+
headers: { "content-type": "application/json" },
|
|
80
|
+
body: JSON.stringify({}),
|
|
81
|
+
});
|
|
82
|
+
expect(mocks.calls[0]?.handler).toBe("login");
|
|
83
|
+
});
|
|
84
|
+
test("guards the private resource", async () => {
|
|
85
|
+
const base = await listen();
|
|
86
|
+
const response = await fetch(`${base}/private`);
|
|
87
|
+
expect(await response.json()).toEqual({ handler: "isAuth" });
|
|
88
|
+
});
|
|
89
|
+
test("answers anything else with a 404 body, not express's HTML", async () => {
|
|
90
|
+
const base = await listen();
|
|
91
|
+
const response = await fetch(`${base}/nope`);
|
|
92
|
+
expect(response.status).toBe(404);
|
|
93
|
+
expect(await response.json()).toEqual({ error: "page not found" });
|
|
94
|
+
});
|
|
95
|
+
test("a GET to a POST-only path falls through to the catch-all", async () => {
|
|
96
|
+
const base = await listen();
|
|
97
|
+
const response = await fetch(`${base}/login`);
|
|
98
|
+
expect(response.status).toBe(404);
|
|
99
|
+
expect(mocks.calls).toHaveLength(0);
|
|
100
|
+
});
|
|
101
|
+
test("each call builds a fresh router", async () => {
|
|
102
|
+
const first = getRoutes(connection, serverConfig(), "https://one", "api");
|
|
103
|
+
const second = getRoutes(connection, serverConfig(), "https://two", "api");
|
|
104
|
+
expect(first).not.toBe(second);
|
|
105
|
+
const app = express();
|
|
106
|
+
app.use(express.json());
|
|
107
|
+
app.use(second);
|
|
108
|
+
const base = await new Promise((resolve) => {
|
|
109
|
+
server = app.listen(0, () => {
|
|
110
|
+
const { port } = server?.address();
|
|
111
|
+
resolve(`http://127.0.0.1:${port}`);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
await fetch(`${base}/signup`, {
|
|
115
|
+
method: "POST",
|
|
116
|
+
headers: { "content-type": "application/json" },
|
|
117
|
+
body: JSON.stringify({}),
|
|
118
|
+
});
|
|
119
|
+
expect(mocks.calls).toHaveLength(1);
|
|
120
|
+
expect(mocks.calls[0]?.args[2]).toBe("https://two");
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=routes.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.unit.test.js","sourceRoot":"","sources":["../../src/tests/routes.unit.test.ts"],"names":[],"mappings":"AAgBA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMjE,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,EAA4C;CACnD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;IAEtC,MAAM,MAAM,GACX,CAAC,OAAe,EAAW,EAAE,CAC7B,CAAC,GAAG,IAAe,EAAE,EAAE;QACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAE/B,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC;IACH,OAAO;QACN,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;QAEtB,MAAM,EAAE,CAAC,IAAa,EAAE,GAAY,EAAE,EAAE,CACtC,GAAuE;aACtE,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;KAC9B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAe,EAA2B,CAAC;AAE3D,IAAI,MAA0B,CAAC;AAE/B,MAAM,MAAM,GAAG,GAAoB,EAAE;IACpC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;YAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,OAAO,EAAiB,CAAC;YAClD,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9B,MAAM,GAAG,SAAS,CAAC;IACpB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;YACrC,OAAO,EAAE,8BAA8B;SACvC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC;YACpC,UAAU;YACV,YAAY,EAAE;YACd,eAAe;YACf,KAAK;SACL,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,GAAG,IAAI,QAAQ,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAIlD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YAClD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;gBAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,OAAO,EAAiB,CAAC;gBAClD,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/utils.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import UserSchema from "../models/user.js";
|
|
3
|
+
import connectionFactory from "../utils/connection.js";
|
|
4
|
+
import memoryServerSetup from "../utils/database.js";
|
|
5
|
+
const mocks = vi.hoisted(() => ({
|
|
6
|
+
createConnection: vi.fn(),
|
|
7
|
+
models: {},
|
|
8
|
+
model: vi.fn(),
|
|
9
|
+
plugin: vi.fn(),
|
|
10
|
+
connectionOptions: vi.fn(),
|
|
11
|
+
memoryUri: "mongodb://memory:27017/",
|
|
12
|
+
memoryCreate: vi.fn(),
|
|
13
|
+
}));
|
|
14
|
+
vi.mock("mongoose", async (importOriginal) => {
|
|
15
|
+
const actual = await importOriginal();
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
default: {
|
|
19
|
+
...actual.default,
|
|
20
|
+
createConnection: (...args) => {
|
|
21
|
+
mocks.createConnection(...args);
|
|
22
|
+
return {
|
|
23
|
+
models: mocks.models,
|
|
24
|
+
model: mocks.model,
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
vi.mock("@typegoose/auto-increment", () => ({
|
|
31
|
+
AutoIncrementID: "auto-increment-plugin",
|
|
32
|
+
}));
|
|
33
|
+
vi.mock("@prosopo/database", async (importOriginal) => {
|
|
34
|
+
const actual = await importOriginal();
|
|
35
|
+
return {
|
|
36
|
+
...actual,
|
|
37
|
+
getMongoConnectionOptions: (args) => {
|
|
38
|
+
mocks.connectionOptions(args);
|
|
39
|
+
return { appName: args.appName };
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
vi.mock("mongodb-memory-server", () => ({
|
|
44
|
+
MongoMemoryServer: {
|
|
45
|
+
create: () => {
|
|
46
|
+
mocks.memoryCreate();
|
|
47
|
+
return Promise.resolve({ getUri: () => mocks.memoryUri });
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
mocks.createConnection.mockClear();
|
|
53
|
+
mocks.model.mockClear();
|
|
54
|
+
mocks.plugin.mockClear();
|
|
55
|
+
mocks.connectionOptions.mockClear();
|
|
56
|
+
mocks.memoryCreate.mockClear();
|
|
57
|
+
mocks.models = {};
|
|
58
|
+
vi.spyOn(UserSchema, "plugin").mockImplementation((...args) => {
|
|
59
|
+
mocks.plugin(...args);
|
|
60
|
+
return UserSchema;
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("connectionFactory", () => {
|
|
64
|
+
const URI = "mongodb://localhost:27017/client-example";
|
|
65
|
+
test("connects to the URI it was given", () => {
|
|
66
|
+
connectionFactory(URI);
|
|
67
|
+
expect(mocks.createConnection).toHaveBeenCalledTimes(1);
|
|
68
|
+
expect(mocks.createConnection.mock.calls[0]?.[0]).toBe(URI);
|
|
69
|
+
});
|
|
70
|
+
test("names the connection after the module, for mongo's server logs", () => {
|
|
71
|
+
connectionFactory(URI);
|
|
72
|
+
const options = mocks.createConnection.mock.calls[0]?.[1];
|
|
73
|
+
expect(options.appName).toContain("connection");
|
|
74
|
+
expect(mocks.connectionOptions).toHaveBeenCalledWith({
|
|
75
|
+
url: URI,
|
|
76
|
+
appName: options.appName,
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
test("registers the User model with auto-incrementing ids", () => {
|
|
80
|
+
connectionFactory(URI);
|
|
81
|
+
expect(mocks.plugin).toHaveBeenCalledWith("auto-increment-plugin", {
|
|
82
|
+
field: "id",
|
|
83
|
+
});
|
|
84
|
+
expect(mocks.model).toHaveBeenCalledWith("User", UserSchema);
|
|
85
|
+
});
|
|
86
|
+
test("leaves an already-registered model alone", () => {
|
|
87
|
+
mocks.models = { user: {} };
|
|
88
|
+
connectionFactory(URI);
|
|
89
|
+
expect(mocks.model).not.toHaveBeenCalled();
|
|
90
|
+
expect(mocks.plugin).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
test("returns the connection it created", () => {
|
|
93
|
+
const connection = connectionFactory(URI);
|
|
94
|
+
expect(connection.model).toBe(mocks.model);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("memoryServerSetup", () => {
|
|
98
|
+
test("boots an in-memory mongo and returns its URI", async () => {
|
|
99
|
+
await expect(memoryServerSetup()).resolves.toBe(mocks.memoryUri);
|
|
100
|
+
expect(mocks.memoryCreate).toHaveBeenCalledTimes(1);
|
|
101
|
+
});
|
|
102
|
+
test("each call gets its own server", async () => {
|
|
103
|
+
await memoryServerSetup();
|
|
104
|
+
await memoryServerSetup();
|
|
105
|
+
expect(mocks.memoryCreate).toHaveBeenCalledTimes(2);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("the User schema", () => {
|
|
109
|
+
test("requires the fields a login needs to work", () => {
|
|
110
|
+
for (const field of ["email", "password", "salt"]) {
|
|
111
|
+
expect(UserSchema.path(field).isRequired).toBe(true);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
test("leaves name and id optional", () => {
|
|
115
|
+
expect(UserSchema.path("name").isRequired).toBeFalsy();
|
|
116
|
+
expect(UserSchema.path("id").isRequired).toBeFalsy();
|
|
117
|
+
});
|
|
118
|
+
test("stores the id as a number and the rest as strings", () => {
|
|
119
|
+
expect(UserSchema.path("id").instance).toBe("Number");
|
|
120
|
+
for (const field of ["email", "name", "password", "salt"]) {
|
|
121
|
+
expect(UserSchema.path(field).instance).toBe("String");
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=utils.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.unit.test.js","sourceRoot":"","sources":["../../src/tests/utils.unit.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/connection.js
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
|
+
import UserSchema from "../models/user.js";
|
|
1
2
|
import { fileURLToPath } from "node:url";
|
|
2
3
|
import { getMongoConnectionOptions } from "@prosopo/database";
|
|
3
4
|
import { AutoIncrementID } from "@typegoose/auto-increment";
|
|
4
5
|
import mongoose from "mongoose";
|
|
5
|
-
|
|
6
|
+
//#region src/utils/connection.ts
|
|
6
7
|
function connectionFactory(uri) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
field: "id"
|
|
18
|
-
});
|
|
19
|
-
conn.model("User", UserSchema);
|
|
20
|
-
}
|
|
21
|
-
return conn;
|
|
8
|
+
const appName = fileURLToPath(import.meta.url);
|
|
9
|
+
const conn = mongoose.createConnection(uri, getMongoConnectionOptions({
|
|
10
|
+
url: uri,
|
|
11
|
+
appName
|
|
12
|
+
}));
|
|
13
|
+
if (!conn.models.user) {
|
|
14
|
+
UserSchema.plugin(AutoIncrementID, { field: "id" });
|
|
15
|
+
conn.model("User", UserSchema);
|
|
16
|
+
}
|
|
17
|
+
return conn;
|
|
22
18
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { connectionFactory as default };
|
package/dist/utils/database.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
+
//#region src/utils/database.ts
|
|
1
2
|
async function memoryServerSetup() {
|
|
2
|
-
|
|
3
|
-
const mongod = MongoMemoryServer.create();
|
|
4
|
-
const memoryServer = await mongod;
|
|
5
|
-
return memoryServer.getUri();
|
|
3
|
+
return (await (await import("mongodb-memory-server")).MongoMemoryServer.create()).getUri();
|
|
6
4
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
memoryServerSetup
|
|
10
|
-
};
|
|
5
|
+
//#endregion
|
|
6
|
+
export { memoryServerSetup as default, memoryServerSetup };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/client-example-server",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.124",
|
|
4
4
|
"description": "Backend for client-example",
|
|
5
5
|
"main": "dist/app.js",
|
|
6
6
|
"types": "dist/app.d.ts",
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
"build:tsc": "tsc --build --verbose",
|
|
26
26
|
"build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
|
|
27
27
|
"typecheck": "tsc --project tsconfig.types.json",
|
|
28
|
+
"test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts",
|
|
29
|
+
"test:watch": "NODE_ENV=${NODE_ENV:-test}; npx vitest --config ./vite.test.config.ts",
|
|
30
|
+
"test:coverage": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --coverage --config ./vite.test.config.ts",
|
|
28
31
|
"bundle": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.config.ts --mode $NODE_ENV"
|
|
29
32
|
},
|
|
30
33
|
"repository": {
|
|
@@ -42,34 +45,34 @@
|
|
|
42
45
|
"@noble/hashes": "1.8.0",
|
|
43
46
|
"@polkadot/util": "13.5.7",
|
|
44
47
|
"@polkadot/util-crypto": "13.5.7",
|
|
45
|
-
"@prosopo/common": "3.1.
|
|
46
|
-
"@prosopo/database": "3.15.
|
|
47
|
-
"@prosopo/logger": "2.0.
|
|
48
|
-
"@prosopo/dotenv": "3.0.
|
|
49
|
-
"@prosopo/keyring": "2.9.
|
|
50
|
-
"@prosopo/server": "2.10.
|
|
51
|
-
"@prosopo/types": "4.
|
|
52
|
-
"@prosopo/util": "3.3.
|
|
48
|
+
"@prosopo/common": "3.1.48",
|
|
49
|
+
"@prosopo/database": "3.15.21",
|
|
50
|
+
"@prosopo/logger": "2.0.4",
|
|
51
|
+
"@prosopo/dotenv": "3.0.50",
|
|
52
|
+
"@prosopo/keyring": "2.9.61",
|
|
53
|
+
"@prosopo/server": "2.10.42",
|
|
54
|
+
"@prosopo/types": "4.10.0",
|
|
55
|
+
"@prosopo/util": "3.3.5",
|
|
53
56
|
"@typegoose/auto-increment": "4.13.0",
|
|
54
57
|
"cors": "2.8.5",
|
|
55
58
|
"express": "4.21.2",
|
|
56
59
|
"jsonwebtoken": "9.0.2",
|
|
57
60
|
"mongodb-memory-server": "10.3.0",
|
|
58
|
-
"mongoose": "8.
|
|
61
|
+
"mongoose": "8.24.1",
|
|
59
62
|
"zod": "3.23.8"
|
|
60
63
|
},
|
|
61
64
|
"devDependencies": {
|
|
62
|
-
"@prosopo/config": "3.3.
|
|
65
|
+
"@prosopo/config": "3.3.5",
|
|
63
66
|
"@types/jsonwebtoken": "9.0.6",
|
|
64
67
|
"@types/node": "22.10.2",
|
|
65
|
-
"@vitest/coverage-v8": "
|
|
68
|
+
"@vitest/coverage-v8": "4.1.10",
|
|
66
69
|
"concurrently": "9.0.1",
|
|
67
70
|
"del-cli": "6.0.0",
|
|
68
71
|
"npm-run-all": "4.1.5",
|
|
69
72
|
"tslib": "2.7.0",
|
|
70
73
|
"tsx": "4.20.3",
|
|
71
74
|
"typescript": "5.6.2",
|
|
72
|
-
"vite": "
|
|
73
|
-
"vitest": "
|
|
75
|
+
"vite": "8.1.5",
|
|
76
|
+
"vitest": "4.1.10"
|
|
74
77
|
}
|
|
75
78
|
}
|