@stratum-hq/control-plane 0.4.0 → 1.0.1
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/dist/app.js.map +1 -1
- package/dist/middleware/auth.d.ts +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +1 -1
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/authorize.d.ts +1 -1
- package/dist/middleware/authorize.d.ts.map +1 -1
- package/dist/middleware/authorize.js +4 -2
- package/dist/middleware/authorize.js.map +1 -1
- package/dist/openapi.js.map +1 -1
- package/dist/routes/tenants.js.map +1 -1
- package/package.json +16 -3
- package/dist/__tests__/admin-scope-query-string.test.d.ts +0 -2
- package/dist/__tests__/admin-scope-query-string.test.d.ts.map +0 -1
- package/dist/__tests__/admin-scope-query-string.test.js +0 -69
- package/dist/__tests__/admin-scope-query-string.test.js.map +0 -1
- package/dist/__tests__/api-keys.test.d.ts +0 -2
- package/dist/__tests__/api-keys.test.d.ts.map +0 -1
- package/dist/__tests__/api-keys.test.js +0 -240
- package/dist/__tests__/api-keys.test.js.map +0 -1
- package/dist/__tests__/auth.test.d.ts +0 -2
- package/dist/__tests__/auth.test.d.ts.map +0 -1
- package/dist/__tests__/auth.test.js +0 -229
- package/dist/__tests__/auth.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -256
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/configdiff-roles-scope.test.d.ts +0 -2
- package/dist/__tests__/configdiff-roles-scope.test.d.ts.map +0 -1
- package/dist/__tests__/configdiff-roles-scope.test.js +0 -246
- package/dist/__tests__/configdiff-roles-scope.test.js.map +0 -1
- package/dist/__tests__/default-deny.test.d.ts +0 -2
- package/dist/__tests__/default-deny.test.d.ts.map +0 -1
- package/dist/__tests__/default-deny.test.js +0 -92
- package/dist/__tests__/default-deny.test.js.map +0 -1
- package/dist/__tests__/tenant-create-scope.test.d.ts +0 -2
- package/dist/__tests__/tenant-create-scope.test.d.ts.map +0 -1
- package/dist/__tests__/tenant-create-scope.test.js +0 -129
- package/dist/__tests__/tenant-create-scope.test.js.map +0 -1
- package/dist/__tests__/tenant-move-scope.test.d.ts +0 -2
- package/dist/__tests__/tenant-move-scope.test.d.ts.map +0 -1
- package/dist/__tests__/tenant-move-scope.test.js +0 -113
- package/dist/__tests__/tenant-move-scope.test.js.map +0 -1
- package/dist/__tests__/tenants.test.d.ts +0 -2
- package/dist/__tests__/tenants.test.d.ts.map +0 -1
- package/dist/__tests__/tenants.test.js +0 -214
- package/dist/__tests__/tenants.test.js.map +0 -1
- package/dist/__tests__/test-helpers.d.ts +0 -71
- package/dist/__tests__/test-helpers.d.ts.map +0 -1
- package/dist/__tests__/test-helpers.js +0 -189
- package/dist/__tests__/test-helpers.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-move-scope.test.js","sourceRoot":"","sources":["../../src/__tests__/tenant-move-scope.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tenants.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const test_helpers_js_1 = require("./test-helpers.js");
|
|
5
|
-
(0, vitest_1.describe)("Tenant Routes", () => {
|
|
6
|
-
let app;
|
|
7
|
-
let stratum;
|
|
8
|
-
(0, vitest_1.beforeEach)(async () => {
|
|
9
|
-
stratum = (0, test_helpers_js_1.createMockStratum)();
|
|
10
|
-
(0, test_helpers_js_1.setupAdminApiKey)(stratum);
|
|
11
|
-
app = await (0, test_helpers_js_1.buildTestApp)(stratum);
|
|
12
|
-
});
|
|
13
|
-
(0, vitest_1.afterEach)(async () => {
|
|
14
|
-
await app.close();
|
|
15
|
-
});
|
|
16
|
-
// ── POST /api/v1/tenants ────────────────────────────────────────────
|
|
17
|
-
(0, vitest_1.describe)("POST /api/v1/tenants", () => {
|
|
18
|
-
(0, vitest_1.it)("creates a tenant and returns 201", async () => {
|
|
19
|
-
const input = { slug: "acme_corp", name: "Acme Corp" };
|
|
20
|
-
stratum.createTenant.mockResolvedValue(test_helpers_js_1.SAMPLE_TENANT);
|
|
21
|
-
const response = await app.inject({
|
|
22
|
-
method: "POST",
|
|
23
|
-
url: "/api/v1/tenants",
|
|
24
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
25
|
-
payload: input,
|
|
26
|
-
});
|
|
27
|
-
(0, vitest_1.expect)(response.statusCode).toBe(201);
|
|
28
|
-
const body = response.json();
|
|
29
|
-
(0, vitest_1.expect)(body.id).toBe(test_helpers_js_1.SAMPLE_TENANT.id);
|
|
30
|
-
(0, vitest_1.expect)(body.slug).toBe("acme_corp");
|
|
31
|
-
(0, vitest_1.expect)(stratum.createTenant).toHaveBeenCalledOnce();
|
|
32
|
-
(0, vitest_1.expect)(stratum.createTenant.mock.calls[0][0]).toMatchObject({ slug: "acme_corp" });
|
|
33
|
-
});
|
|
34
|
-
(0, vitest_1.it)("returns 400 for invalid input (missing slug)", async () => {
|
|
35
|
-
const response = await app.inject({
|
|
36
|
-
method: "POST",
|
|
37
|
-
url: "/api/v1/tenants",
|
|
38
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
39
|
-
payload: { name: "No Slug" },
|
|
40
|
-
});
|
|
41
|
-
// Zod validation triggers 400
|
|
42
|
-
(0, vitest_1.expect)(response.statusCode).toBe(400);
|
|
43
|
-
const body = response.json();
|
|
44
|
-
(0, vitest_1.expect)(body.error.code).toBe("VALIDATION_ERROR");
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
// ── POST /api/v1/tenants/batch ──────────────────────────────────────
|
|
48
|
-
(0, vitest_1.describe)("POST /api/v1/tenants/batch", () => {
|
|
49
|
-
(0, vitest_1.it)("batch creates tenants and returns 201", async () => {
|
|
50
|
-
const batchResult = {
|
|
51
|
-
created: [test_helpers_js_1.SAMPLE_TENANT, test_helpers_js_1.SAMPLE_CHILD_TENANT],
|
|
52
|
-
errors: [],
|
|
53
|
-
};
|
|
54
|
-
stratum.batchCreateTenants.mockResolvedValue(batchResult);
|
|
55
|
-
const response = await app.inject({
|
|
56
|
-
method: "POST",
|
|
57
|
-
url: "/api/v1/tenants/batch",
|
|
58
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
59
|
-
payload: {
|
|
60
|
-
tenants: [
|
|
61
|
-
{ slug: "acme_corp", name: "Acme Corp" },
|
|
62
|
-
{ slug: "acme_division", name: "Acme Division", parent_id: test_helpers_js_1.SAMPLE_TENANT.id },
|
|
63
|
-
],
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
(0, vitest_1.expect)(response.statusCode).toBe(201);
|
|
67
|
-
const body = response.json();
|
|
68
|
-
(0, vitest_1.expect)(body.created).toHaveLength(2);
|
|
69
|
-
(0, vitest_1.expect)(stratum.batchCreateTenants).toHaveBeenCalledOnce();
|
|
70
|
-
});
|
|
71
|
-
(0, vitest_1.it)("returns 400 when tenants array is empty", async () => {
|
|
72
|
-
const response = await app.inject({
|
|
73
|
-
method: "POST",
|
|
74
|
-
url: "/api/v1/tenants/batch",
|
|
75
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
76
|
-
payload: { tenants: [] },
|
|
77
|
-
});
|
|
78
|
-
(0, vitest_1.expect)(response.statusCode).toBe(400);
|
|
79
|
-
(0, vitest_1.expect)(response.json().error.code).toBe("VALIDATION_ERROR");
|
|
80
|
-
});
|
|
81
|
-
(0, vitest_1.it)("returns 400 when tenants field is missing", async () => {
|
|
82
|
-
const response = await app.inject({
|
|
83
|
-
method: "POST",
|
|
84
|
-
url: "/api/v1/tenants/batch",
|
|
85
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
86
|
-
payload: {},
|
|
87
|
-
});
|
|
88
|
-
(0, vitest_1.expect)(response.statusCode).toBe(400);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
// ── GET /api/v1/tenants/:id ─────────────────────────────────────────
|
|
92
|
-
(0, vitest_1.describe)("GET /api/v1/tenants/:id", () => {
|
|
93
|
-
(0, vitest_1.it)("returns the tenant", async () => {
|
|
94
|
-
stratum.getTenant.mockResolvedValue(test_helpers_js_1.SAMPLE_TENANT);
|
|
95
|
-
const response = await app.inject({
|
|
96
|
-
method: "GET",
|
|
97
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
98
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
99
|
-
});
|
|
100
|
-
(0, vitest_1.expect)(response.statusCode).toBe(200);
|
|
101
|
-
const body = response.json();
|
|
102
|
-
(0, vitest_1.expect)(body.id).toBe(test_helpers_js_1.SAMPLE_TENANT.id);
|
|
103
|
-
(0, vitest_1.expect)(body.slug).toBe("acme_corp");
|
|
104
|
-
});
|
|
105
|
-
(0, vitest_1.it)("returns 404 when tenant does not exist", async () => {
|
|
106
|
-
const { StratumError, ErrorCode } = await import("@stratum-hq/core");
|
|
107
|
-
stratum.getTenant.mockRejectedValue(new StratumError(ErrorCode.TENANT_NOT_FOUND, "Tenant not found", 404));
|
|
108
|
-
const response = await app.inject({
|
|
109
|
-
method: "GET",
|
|
110
|
-
url: "/api/v1/tenants/nonexistent-id",
|
|
111
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
112
|
-
});
|
|
113
|
-
(0, vitest_1.expect)(response.statusCode).toBe(404);
|
|
114
|
-
const body = response.json();
|
|
115
|
-
(0, vitest_1.expect)(body.error.code).toBe("TENANT_NOT_FOUND");
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
// ── PATCH /api/v1/tenants/:id ───────────────────────────────────────
|
|
119
|
-
(0, vitest_1.describe)("PATCH /api/v1/tenants/:id", () => {
|
|
120
|
-
(0, vitest_1.it)("updates a tenant and returns 200", async () => {
|
|
121
|
-
const updatedTenant = { ...test_helpers_js_1.SAMPLE_TENANT, name: "Acme Corp Updated" };
|
|
122
|
-
stratum.updateTenant.mockResolvedValue(updatedTenant);
|
|
123
|
-
const response = await app.inject({
|
|
124
|
-
method: "PATCH",
|
|
125
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
126
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
127
|
-
payload: { name: "Acme Corp Updated" },
|
|
128
|
-
});
|
|
129
|
-
(0, vitest_1.expect)(response.statusCode).toBe(200);
|
|
130
|
-
(0, vitest_1.expect)(response.json().name).toBe("Acme Corp Updated");
|
|
131
|
-
(0, vitest_1.expect)(stratum.updateTenant).toHaveBeenCalledOnce();
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
// ── DELETE /api/v1/tenants/:id ──────────────────────────────────────
|
|
135
|
-
(0, vitest_1.describe)("DELETE /api/v1/tenants/:id", () => {
|
|
136
|
-
(0, vitest_1.it)("soft deletes and returns 204", async () => {
|
|
137
|
-
stratum.deleteTenant.mockResolvedValue(undefined);
|
|
138
|
-
const response = await app.inject({
|
|
139
|
-
method: "DELETE",
|
|
140
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
141
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
142
|
-
});
|
|
143
|
-
(0, vitest_1.expect)(response.statusCode).toBe(204);
|
|
144
|
-
(0, vitest_1.expect)(response.body).toBe("");
|
|
145
|
-
(0, vitest_1.expect)(stratum.deleteTenant).toHaveBeenCalledOnce();
|
|
146
|
-
(0, vitest_1.expect)(stratum.deleteTenant.mock.calls[0][0]).toBe(test_helpers_js_1.SAMPLE_TENANT.id);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
// ── GET /api/v1/tenants/:id/descendants ─────────────────────────────
|
|
150
|
-
(0, vitest_1.describe)("GET /api/v1/tenants/:id/descendants", () => {
|
|
151
|
-
(0, vitest_1.it)("returns the tenant subtree", async () => {
|
|
152
|
-
const descendants = [test_helpers_js_1.SAMPLE_CHILD_TENANT];
|
|
153
|
-
stratum.getDescendants.mockResolvedValue(descendants);
|
|
154
|
-
const response = await app.inject({
|
|
155
|
-
method: "GET",
|
|
156
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}/descendants`,
|
|
157
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
158
|
-
});
|
|
159
|
-
(0, vitest_1.expect)(response.statusCode).toBe(200);
|
|
160
|
-
const body = response.json();
|
|
161
|
-
(0, vitest_1.expect)(body).toHaveLength(1);
|
|
162
|
-
(0, vitest_1.expect)(body[0].id).toBe(test_helpers_js_1.SAMPLE_CHILD_TENANT.id);
|
|
163
|
-
(0, vitest_1.expect)(stratum.getDescendants).toHaveBeenCalledWith(test_helpers_js_1.SAMPLE_TENANT.id);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
// ── Authentication required ─────────────────────────────────────────
|
|
167
|
-
(0, vitest_1.describe)("Authentication required", () => {
|
|
168
|
-
(0, vitest_1.it)("returns 401 without an API key or Bearer token", async () => {
|
|
169
|
-
const response = await app.inject({
|
|
170
|
-
method: "GET",
|
|
171
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
172
|
-
// No auth headers
|
|
173
|
-
});
|
|
174
|
-
(0, vitest_1.expect)(response.statusCode).toBe(401);
|
|
175
|
-
const body = response.json();
|
|
176
|
-
(0, vitest_1.expect)(body.error.code).toBe("UNAUTHORIZED");
|
|
177
|
-
});
|
|
178
|
-
(0, vitest_1.it)("returns 401 with an invalid API key", async () => {
|
|
179
|
-
stratum.validateApiKey.mockResolvedValue(null);
|
|
180
|
-
const response = await app.inject({
|
|
181
|
-
method: "GET",
|
|
182
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
183
|
-
headers: { "x-api-key": "sk_test_invalid" },
|
|
184
|
-
});
|
|
185
|
-
(0, vitest_1.expect)(response.statusCode).toBe(401);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
// ── Authorization ───────────────────────────────────────────────────
|
|
189
|
-
(0, vitest_1.describe)("Authorization", () => {
|
|
190
|
-
(0, vitest_1.it)("read-scope key cannot POST (write endpoint)", async () => {
|
|
191
|
-
(0, test_helpers_js_1.setupReadOnlyApiKey)(stratum);
|
|
192
|
-
const response = await app.inject({
|
|
193
|
-
method: "POST",
|
|
194
|
-
url: "/api/v1/tenants",
|
|
195
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
196
|
-
payload: { slug: "test_tenant", name: "Test" },
|
|
197
|
-
});
|
|
198
|
-
(0, vitest_1.expect)(response.statusCode).toBe(403);
|
|
199
|
-
const body = response.json();
|
|
200
|
-
(0, vitest_1.expect)(body.error.code).toBe("FORBIDDEN");
|
|
201
|
-
});
|
|
202
|
-
(0, vitest_1.it)("read-scope key can GET (read endpoint)", async () => {
|
|
203
|
-
(0, test_helpers_js_1.setupReadOnlyApiKey)(stratum);
|
|
204
|
-
stratum.getTenant.mockResolvedValue(test_helpers_js_1.SAMPLE_TENANT);
|
|
205
|
-
const response = await app.inject({
|
|
206
|
-
method: "GET",
|
|
207
|
-
url: `/api/v1/tenants/${test_helpers_js_1.SAMPLE_TENANT.id}`,
|
|
208
|
-
headers: (0, test_helpers_js_1.authHeaders)(),
|
|
209
|
-
});
|
|
210
|
-
(0, vitest_1.expect)(response.statusCode).toBe(200);
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
//# sourceMappingURL=tenants.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.test.js","sourceRoot":"","sources":["../../src/__tests__/tenants.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { FastifyInstance } from "fastify";
|
|
2
|
-
import type { Stratum } from "@stratum-hq/lib";
|
|
3
|
-
export declare const TEST_JWT_SECRET = "test-jwt-secret-for-unit-tests";
|
|
4
|
-
/**
|
|
5
|
-
* Create a mock Stratum instance with all methods stubbed via vi.fn().
|
|
6
|
-
* Tests override individual method implementations as needed.
|
|
7
|
-
*/
|
|
8
|
-
export declare function createMockStratum(): Stratum;
|
|
9
|
-
/**
|
|
10
|
-
* Build a test Fastify app with routes registered and middleware wired up.
|
|
11
|
-
* Uses the provided mock Stratum instance.
|
|
12
|
-
*
|
|
13
|
-
* We skip OpenAPI/swagger, helmet, cors, and rate-limit plugins to keep tests fast
|
|
14
|
-
* and focused on the HTTP/route/middleware layer.
|
|
15
|
-
*/
|
|
16
|
-
export declare function buildTestApp(stratum: Stratum): Promise<FastifyInstance>;
|
|
17
|
-
/**
|
|
18
|
-
* Helper: returns headers object with a valid API key authentication.
|
|
19
|
-
* The mock stratum.validateApiKey must be configured to accept this key.
|
|
20
|
-
*/
|
|
21
|
-
export declare function authHeaders(apiKey?: string): Record<string, string>;
|
|
22
|
-
/**
|
|
23
|
-
* Helper: returns headers object with a valid JWT Bearer token.
|
|
24
|
-
*/
|
|
25
|
-
export declare function jwtHeaders(payload?: Record<string, unknown>, secret?: string): Record<string, string>;
|
|
26
|
-
/**
|
|
27
|
-
* Configure the mock stratum to accept the default test API key
|
|
28
|
-
* with admin scopes (read + write + admin). This is the common case.
|
|
29
|
-
*/
|
|
30
|
-
export declare function setupAdminApiKey(stratum: Stratum): void;
|
|
31
|
-
/**
|
|
32
|
-
* Configure the mock stratum to accept the default test API key
|
|
33
|
-
* with read-only scope.
|
|
34
|
-
*/
|
|
35
|
-
export declare function setupReadOnlyApiKey(stratum: Stratum): void;
|
|
36
|
-
/**
|
|
37
|
-
* Configure the mock stratum to accept the default test API key
|
|
38
|
-
* with write scope (read + write but not admin).
|
|
39
|
-
*/
|
|
40
|
-
export declare function setupWriteApiKey(stratum: Stratum): void;
|
|
41
|
-
/** A sample tenant object for test assertions */
|
|
42
|
-
export declare const SAMPLE_TENANT: {
|
|
43
|
-
id: string;
|
|
44
|
-
slug: string;
|
|
45
|
-
name: string;
|
|
46
|
-
parent_id: null;
|
|
47
|
-
ancestry_path: string;
|
|
48
|
-
depth: number;
|
|
49
|
-
metadata: {};
|
|
50
|
-
isolation_strategy: string;
|
|
51
|
-
region_id: null;
|
|
52
|
-
created_at: string;
|
|
53
|
-
updated_at: string;
|
|
54
|
-
deleted_at: null;
|
|
55
|
-
};
|
|
56
|
-
/** A second sample tenant (child) */
|
|
57
|
-
export declare const SAMPLE_CHILD_TENANT: {
|
|
58
|
-
id: string;
|
|
59
|
-
slug: string;
|
|
60
|
-
name: string;
|
|
61
|
-
parent_id: string;
|
|
62
|
-
ancestry_path: string;
|
|
63
|
-
depth: number;
|
|
64
|
-
metadata: {};
|
|
65
|
-
isolation_strategy: string;
|
|
66
|
-
region_id: null;
|
|
67
|
-
created_at: string;
|
|
68
|
-
updated_at: string;
|
|
69
|
-
deleted_at: null;
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=test-helpers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAanD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,eAAO,MAAM,eAAe,mCAAmC,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA8C3C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB7E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,MAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExF;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,MAAM,GAAE,MAAwB,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQvD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQvD;AAED,iDAAiD;AACjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;CAazB,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAa/B,CAAC"}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SAMPLE_CHILD_TENANT = exports.SAMPLE_TENANT = exports.TEST_JWT_SECRET = void 0;
|
|
7
|
-
exports.createMockStratum = createMockStratum;
|
|
8
|
-
exports.buildTestApp = buildTestApp;
|
|
9
|
-
exports.authHeaders = authHeaders;
|
|
10
|
-
exports.jwtHeaders = jwtHeaders;
|
|
11
|
-
exports.setupAdminApiKey = setupAdminApiKey;
|
|
12
|
-
exports.setupReadOnlyApiKey = setupReadOnlyApiKey;
|
|
13
|
-
exports.setupWriteApiKey = setupWriteApiKey;
|
|
14
|
-
const fastify_1 = __importDefault(require("fastify"));
|
|
15
|
-
const vitest_1 = require("vitest");
|
|
16
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
17
|
-
const error_handler_js_1 = require("../middleware/error-handler.js");
|
|
18
|
-
const auth_js_1 = require("../middleware/auth.js");
|
|
19
|
-
const authorize_js_1 = require("../middleware/authorize.js");
|
|
20
|
-
const tenant_scope_js_1 = require("../middleware/tenant-scope.js");
|
|
21
|
-
const health_js_1 = require("../routes/health.js");
|
|
22
|
-
const tenants_js_1 = require("../routes/tenants.js");
|
|
23
|
-
const config_js_1 = require("../routes/config.js");
|
|
24
|
-
const api_keys_js_1 = require("../routes/api-keys.js");
|
|
25
|
-
const config_diff_js_1 = require("../routes/config-diff.js");
|
|
26
|
-
const roles_js_1 = require("../routes/roles.js");
|
|
27
|
-
// Must match the JWT_SECRET env var set in vitest.config.ts
|
|
28
|
-
exports.TEST_JWT_SECRET = "test-jwt-secret-for-unit-tests";
|
|
29
|
-
/**
|
|
30
|
-
* Create a mock Stratum instance with all methods stubbed via vi.fn().
|
|
31
|
-
* Tests override individual method implementations as needed.
|
|
32
|
-
*/
|
|
33
|
-
function createMockStratum() {
|
|
34
|
-
return {
|
|
35
|
-
// Tenant methods
|
|
36
|
-
createTenant: vitest_1.vi.fn(),
|
|
37
|
-
getTenant: vitest_1.vi.fn(),
|
|
38
|
-
listTenants: vitest_1.vi.fn(),
|
|
39
|
-
updateTenant: vitest_1.vi.fn(),
|
|
40
|
-
deleteTenant: vitest_1.vi.fn(),
|
|
41
|
-
batchCreateTenants: vitest_1.vi.fn(),
|
|
42
|
-
moveTenant: vitest_1.vi.fn(),
|
|
43
|
-
getAncestors: vitest_1.vi.fn(),
|
|
44
|
-
getDescendants: vitest_1.vi.fn(),
|
|
45
|
-
getChildren: vitest_1.vi.fn(),
|
|
46
|
-
purgeTenant: vitest_1.vi.fn(),
|
|
47
|
-
exportTenantData: vitest_1.vi.fn(),
|
|
48
|
-
migrateRegion: vitest_1.vi.fn(),
|
|
49
|
-
// Config methods
|
|
50
|
-
resolveConfig: vitest_1.vi.fn(),
|
|
51
|
-
setConfig: vitest_1.vi.fn(),
|
|
52
|
-
deleteConfig: vitest_1.vi.fn(),
|
|
53
|
-
batchSetConfig: vitest_1.vi.fn(),
|
|
54
|
-
getConfigWithInheritance: vitest_1.vi.fn(),
|
|
55
|
-
diffConfig: vitest_1.vi.fn(),
|
|
56
|
-
// Permission methods
|
|
57
|
-
resolvePermissions: vitest_1.vi.fn(),
|
|
58
|
-
// API key methods
|
|
59
|
-
createApiKey: vitest_1.vi.fn(),
|
|
60
|
-
validateApiKey: vitest_1.vi.fn(),
|
|
61
|
-
revokeApiKey: vitest_1.vi.fn(),
|
|
62
|
-
rotateApiKey: vitest_1.vi.fn(),
|
|
63
|
-
listApiKeys: vitest_1.vi.fn(),
|
|
64
|
-
getApiKey: vitest_1.vi.fn(),
|
|
65
|
-
listDormantKeys: vitest_1.vi.fn(),
|
|
66
|
-
// Role methods
|
|
67
|
-
createRole: vitest_1.vi.fn(),
|
|
68
|
-
getRole: vitest_1.vi.fn(),
|
|
69
|
-
listRoles: vitest_1.vi.fn(),
|
|
70
|
-
updateRole: vitest_1.vi.fn(),
|
|
71
|
-
deleteRole: vitest_1.vi.fn(),
|
|
72
|
-
assignRoleToKey: vitest_1.vi.fn(),
|
|
73
|
-
removeRoleFromKey: vitest_1.vi.fn(),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Build a test Fastify app with routes registered and middleware wired up.
|
|
78
|
-
* Uses the provided mock Stratum instance.
|
|
79
|
-
*
|
|
80
|
-
* We skip OpenAPI/swagger, helmet, cors, and rate-limit plugins to keep tests fast
|
|
81
|
-
* and focused on the HTTP/route/middleware layer.
|
|
82
|
-
*/
|
|
83
|
-
async function buildTestApp(stratum) {
|
|
84
|
-
const app = (0, fastify_1.default)({ logger: false });
|
|
85
|
-
// Wire up the same middleware chain as the real app
|
|
86
|
-
app.addHook("preHandler", (0, auth_js_1.createAuthMiddleware)(stratum));
|
|
87
|
-
app.addHook("preHandler", (0, authorize_js_1.createAuthorizeMiddleware)());
|
|
88
|
-
app.addHook("preHandler", (0, tenant_scope_js_1.createTenantScopeEnforcer)(stratum));
|
|
89
|
-
app.setErrorHandler(error_handler_js_1.errorHandler);
|
|
90
|
-
// Register routes (pass a stub Redis health checker — Redis is not used in tests)
|
|
91
|
-
const noopRedisHealth = async () => "not_configured";
|
|
92
|
-
await app.register((0, health_js_1.healthRoutes)(noopRedisHealth));
|
|
93
|
-
await app.register((0, tenants_js_1.createTenantRoutes)(stratum), { prefix: "/api/v1/tenants" });
|
|
94
|
-
await app.register((0, config_js_1.createConfigRoutes)(stratum), { prefix: "/api/v1/tenants/:id/config" });
|
|
95
|
-
await app.register((0, api_keys_js_1.createApiKeyRoutes)(stratum), { prefix: "/api/v1/api-keys" });
|
|
96
|
-
await app.register((0, config_diff_js_1.createConfigDiffRoutes)(stratum), { prefix: "/api/v1/config" });
|
|
97
|
-
await app.register((0, roles_js_1.createRoleRoutes)(stratum), { prefix: "/api/v1/roles" });
|
|
98
|
-
await app.ready();
|
|
99
|
-
return app;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Helper: returns headers object with a valid API key authentication.
|
|
103
|
-
* The mock stratum.validateApiKey must be configured to accept this key.
|
|
104
|
-
*/
|
|
105
|
-
function authHeaders(apiKey = "sk_test_valid_key") {
|
|
106
|
-
return { "x-api-key": apiKey };
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Helper: returns headers object with a valid JWT Bearer token.
|
|
110
|
-
*/
|
|
111
|
-
function jwtHeaders(payload = {}, secret = exports.TEST_JWT_SECRET) {
|
|
112
|
-
const token = jsonwebtoken_1.default.sign({
|
|
113
|
-
sub: "test-user-id",
|
|
114
|
-
tenant_id: exports.SAMPLE_TENANT.id,
|
|
115
|
-
scopes: ["read", "write", "admin"],
|
|
116
|
-
...payload,
|
|
117
|
-
}, secret, { algorithm: "HS256", expiresIn: "1h" });
|
|
118
|
-
return { authorization: `Bearer ${token}` };
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Configure the mock stratum to accept the default test API key
|
|
122
|
-
* with admin scopes (read + write + admin). This is the common case.
|
|
123
|
-
*/
|
|
124
|
-
function setupAdminApiKey(stratum) {
|
|
125
|
-
stratum.validateApiKey.mockResolvedValue({
|
|
126
|
-
key_id: "test-key-id",
|
|
127
|
-
tenant_id: null,
|
|
128
|
-
scopes: ["read", "write", "admin"],
|
|
129
|
-
rate_limit_max: null,
|
|
130
|
-
rate_limit_window: null,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Configure the mock stratum to accept the default test API key
|
|
135
|
-
* with read-only scope.
|
|
136
|
-
*/
|
|
137
|
-
function setupReadOnlyApiKey(stratum) {
|
|
138
|
-
stratum.validateApiKey.mockResolvedValue({
|
|
139
|
-
key_id: "test-key-id-readonly",
|
|
140
|
-
tenant_id: null,
|
|
141
|
-
scopes: ["read"],
|
|
142
|
-
rate_limit_max: null,
|
|
143
|
-
rate_limit_window: null,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Configure the mock stratum to accept the default test API key
|
|
148
|
-
* with write scope (read + write but not admin).
|
|
149
|
-
*/
|
|
150
|
-
function setupWriteApiKey(stratum) {
|
|
151
|
-
stratum.validateApiKey.mockResolvedValue({
|
|
152
|
-
key_id: "test-key-id-write",
|
|
153
|
-
tenant_id: null,
|
|
154
|
-
scopes: ["read", "write"],
|
|
155
|
-
rate_limit_max: null,
|
|
156
|
-
rate_limit_window: null,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
/** A sample tenant object for test assertions */
|
|
160
|
-
exports.SAMPLE_TENANT = {
|
|
161
|
-
id: "550e8400-e29b-41d4-a716-446655440000",
|
|
162
|
-
slug: "acme_corp",
|
|
163
|
-
name: "Acme Corp",
|
|
164
|
-
parent_id: null,
|
|
165
|
-
ancestry_path: "/550e8400-e29b-41d4-a716-446655440000",
|
|
166
|
-
depth: 0,
|
|
167
|
-
metadata: {},
|
|
168
|
-
isolation_strategy: "SHARED_RLS",
|
|
169
|
-
region_id: null,
|
|
170
|
-
created_at: new Date("2025-01-01").toISOString(),
|
|
171
|
-
updated_at: new Date("2025-01-01").toISOString(),
|
|
172
|
-
deleted_at: null,
|
|
173
|
-
};
|
|
174
|
-
/** A second sample tenant (child) */
|
|
175
|
-
exports.SAMPLE_CHILD_TENANT = {
|
|
176
|
-
id: "550e8400-e29b-41d4-a716-446655440001",
|
|
177
|
-
slug: "acme_division",
|
|
178
|
-
name: "Acme Division",
|
|
179
|
-
parent_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
180
|
-
ancestry_path: "/550e8400-e29b-41d4-a716-446655440000/550e8400-e29b-41d4-a716-446655440001",
|
|
181
|
-
depth: 1,
|
|
182
|
-
metadata: {},
|
|
183
|
-
isolation_strategy: "SHARED_RLS",
|
|
184
|
-
region_id: null,
|
|
185
|
-
created_at: new Date("2025-01-02").toISOString(),
|
|
186
|
-
updated_at: new Date("2025-01-02").toISOString(),
|
|
187
|
-
deleted_at: null,
|
|
188
|
-
};
|
|
189
|
-
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
|