@oneuptime/common 9.2.20 → 9.2.22
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/Server/Services/AIService.ts +1 -1
- package/Tests/Server/API/BaseAPI.test.ts +9 -4
- package/Tests/Server/Middleware/ProjectAuthorization.test.ts +133 -162
- package/Tests/Server/Services/ProbeService.test.ts +91 -784
- package/Tests/Server/Services/ScheduledMaintenanceService.test.ts +131 -112
- package/Tests/Server/Services/TeamMemberService.test.ts +87 -1343
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +18 -9
- package/Tests/Server/Utils/Cookie.test.ts +10 -2
- package/Tests/Types/HashedString.test.ts +52 -8
- package/Tests/UI/Components/404.test.tsx +10 -15
- package/Tests/UI/Components/Breadcrumbs.test.tsx +6 -2
- package/Tests/UI/Components/Button.test.tsx +12 -12
- package/Tests/UI/Components/Card.test.tsx +4 -2
- package/Tests/UI/Components/ConfirmModal.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +37 -4
- package/Tests/UI/Components/DuplicateModel.test.tsx +49 -45
- package/Tests/UI/Components/FilePicker.test.tsx +258 -178
- package/Tests/UI/Components/List.test.tsx +3 -1
- package/Tests/UI/Components/MarkdownEditor.test.tsx +6 -5
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/Modal.test.tsx +5 -5
- package/Tests/UI/Components/NavBar.test.tsx +14 -1
- package/Tests/UI/Components/OrderedStatesList.test.tsx +1 -1
- package/Tests/UI/Components/Pagination.test.tsx +6 -2
- package/Tests/Utils/API.test.ts +133 -11
- package/Tests/__mocks__/azure.js +2 -0
- package/Tests/__mocks__/botbuilder-stdlib.js +2 -0
- package/Tests/__mocks__/botbuilder.js +10 -0
- package/Tests/__mocks__/locter.js +5 -0
- package/Tests/__mocks__/otpauth.js +30 -0
- package/Tests/__mocks__/simplewebauthn.js +34 -0
- package/Tests/__mocks__/styleMock.js +1 -0
- package/Tests/__mocks__/uuid.js +31 -0
- package/Tests/__mocks__/yaml.js +11 -0
- package/Tests/jest.setup.ts +14 -0
- package/UI/Components/AI/AITemplates.ts +226 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +21 -270
- package/build/dist/Server/Services/AIService.js +1 -1
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Tests/Server/API/BaseAPI.test.js +7 -2
- package/build/dist/Tests/Server/API/BaseAPI.test.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +89 -101
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Server/Services/ProbeService.test.js +95 -687
- package/build/dist/Tests/Server/Services/ProbeService.test.js.map +1 -1
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +108 -89
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +1 -1
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js +85 -924
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js.map +1 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +14 -9
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +1 -1
- package/build/dist/Tests/Server/Utils/Cookie.test.js +10 -4
- package/build/dist/Tests/Server/Utils/Cookie.test.js.map +1 -1
- package/build/dist/Tests/Types/HashedString.test.js +39 -6
- package/build/dist/Tests/Types/HashedString.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/404.test.js +10 -10
- package/build/dist/Tests/UI/Components/404.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js +6 -2
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Button.test.js +12 -12
- package/build/dist/Tests/UI/Components/Card.test.js +4 -2
- package/build/dist/Tests/UI/Components/Card.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js +1 -1
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Dropdown.test.js +19 -3
- package/build/dist/Tests/UI/Components/Dropdown.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js +46 -41
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/FilePicker.test.js +210 -117
- package/build/dist/Tests/UI/Components/FilePicker.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/List.test.js +3 -1
- package/build/dist/Tests/UI/Components/List.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js +6 -5
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/MasterPage.test.js +1 -1
- package/build/dist/Tests/UI/Components/MasterPage.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Modal.test.js +5 -5
- package/build/dist/Tests/UI/Components/Modal.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/NavBar.test.js +13 -1
- package/build/dist/Tests/UI/Components/NavBar.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js +1 -1
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Pagination.test.js +6 -2
- package/build/dist/Tests/UI/Components/Pagination.test.js.map +1 -1
- package/build/dist/Tests/Utils/API.test.js +100 -9
- package/build/dist/Tests/Utils/API.test.js.map +1 -1
- package/build/dist/Tests/jest.setup.js +13 -0
- package/build/dist/Tests/jest.setup.js.map +1 -0
- package/build/dist/UI/Components/AI/AITemplates.js +218 -0
- package/build/dist/UI/Components/AI/AITemplates.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +5 -238
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/jest.config.json +18 -1
- package/package.json +1 -1
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import ProjectMiddleware from "../../../Server/Middleware/ProjectAuthorization";
|
|
2
|
-
import ApiKeyService from "../../../Server/Services/ApiKeyService";
|
|
3
|
-
import GlobalConfigService from "../../../Server/Services/GlobalConfigService";
|
|
4
|
-
import QueryHelper from "../../../Server/Types/Database/QueryHelper";
|
|
5
|
-
import "../TestingUtils/Init";
|
|
6
|
-
import OneUptimeDate from "../../../Types/Date";
|
|
7
|
-
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
8
2
|
import ObjectID from "../../../Types/ObjectID";
|
|
9
|
-
import { describe, expect,
|
|
10
|
-
import getJestMockFunction from "../../../Tests/MockType";
|
|
11
|
-
import { getJestSpyOn } from "../../../Tests/Spy";
|
|
12
|
-
import { TestDatabaseMock } from "../TestingUtils/__mocks__/TestDatabase.mock";
|
|
13
|
-
import APIKeyAccessPermission from "../../../Server/Utils/APIKey/AccessPermission";
|
|
14
|
-
jest.mock("../../../Server/Services/ApiKeyService");
|
|
15
|
-
jest.mock("../../../Server/Services/AccessTokenService");
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
16
4
|
describe("ProjectMiddleware", () => {
|
|
17
5
|
const mockedObjectId = ObjectID.generate();
|
|
18
6
|
describe("getProjectId", () => {
|
|
@@ -44,6 +32,20 @@ describe("ProjectMiddleware", () => {
|
|
|
44
32
|
const result = ProjectMiddleware.getProjectId({});
|
|
45
33
|
expect(result).toBeNull();
|
|
46
34
|
});
|
|
35
|
+
test("should handle empty headers object", () => {
|
|
36
|
+
const req = {
|
|
37
|
+
headers: {},
|
|
38
|
+
};
|
|
39
|
+
const result = ProjectMiddleware.getProjectId(req);
|
|
40
|
+
expect(result).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
test("should handle empty params object", () => {
|
|
43
|
+
const req = {
|
|
44
|
+
params: {},
|
|
45
|
+
};
|
|
46
|
+
const result = ProjectMiddleware.getProjectId(req);
|
|
47
|
+
expect(result).toBeNull();
|
|
48
|
+
});
|
|
47
49
|
});
|
|
48
50
|
describe("getApiKey", () => {
|
|
49
51
|
test("should return apiKey when apikey is passed in the request's header", () => {
|
|
@@ -57,115 +59,101 @@ describe("ProjectMiddleware", () => {
|
|
|
57
59
|
const result = ProjectMiddleware.getApiKey({});
|
|
58
60
|
expect(result).toBeNull();
|
|
59
61
|
});
|
|
62
|
+
test("should handle empty headers", () => {
|
|
63
|
+
const req = {
|
|
64
|
+
headers: {},
|
|
65
|
+
};
|
|
66
|
+
const result = ProjectMiddleware.getApiKey(req);
|
|
67
|
+
expect(result).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
test("should handle undefined apikey header", () => {
|
|
70
|
+
const req = {
|
|
71
|
+
headers: { apikey: undefined },
|
|
72
|
+
};
|
|
73
|
+
const result = ProjectMiddleware.getApiKey(req);
|
|
74
|
+
expect(result).toBeNull();
|
|
75
|
+
});
|
|
60
76
|
});
|
|
61
77
|
describe("hasApiKey", () => {
|
|
62
|
-
const req = { headers: {} };
|
|
63
78
|
test("should return true when getApiKey returns a non-null value", () => {
|
|
64
|
-
req
|
|
79
|
+
const req = {
|
|
80
|
+
headers: { apikey: mockedObjectId.toString() },
|
|
81
|
+
};
|
|
65
82
|
const result = ProjectMiddleware.hasApiKey(req);
|
|
66
83
|
expect(result).toStrictEqual(true);
|
|
67
84
|
});
|
|
68
85
|
test("should return false when getApiKey returns null", () => {
|
|
69
|
-
req
|
|
86
|
+
const req = { headers: {} };
|
|
87
|
+
const result = ProjectMiddleware.hasApiKey(req);
|
|
88
|
+
expect(result).toStrictEqual(false);
|
|
89
|
+
});
|
|
90
|
+
test("should return false for empty request", () => {
|
|
91
|
+
const req = {};
|
|
70
92
|
const result = ProjectMiddleware.hasApiKey(req);
|
|
71
93
|
expect(result).toStrictEqual(false);
|
|
72
94
|
});
|
|
73
95
|
});
|
|
74
96
|
describe("hasProjectID", () => {
|
|
75
|
-
const req = { headers: {} };
|
|
76
97
|
test("should return true when getProjectId returns a non-null value", () => {
|
|
77
|
-
req
|
|
98
|
+
const req = {
|
|
99
|
+
headers: { tenantid: mockedObjectId.toString() },
|
|
100
|
+
};
|
|
78
101
|
const result = ProjectMiddleware.hasProjectID(req);
|
|
79
102
|
expect(result).toStrictEqual(true);
|
|
80
103
|
});
|
|
81
104
|
test("should return false when getProjectId returns null", () => {
|
|
82
|
-
req
|
|
105
|
+
const req = { headers: {} };
|
|
83
106
|
const result = ProjectMiddleware.hasProjectID(req);
|
|
84
107
|
expect(result).toStrictEqual(false);
|
|
85
108
|
});
|
|
109
|
+
test("should return true when projectid is in header", () => {
|
|
110
|
+
const req = {
|
|
111
|
+
headers: { projectid: mockedObjectId.toString() },
|
|
112
|
+
};
|
|
113
|
+
const result = ProjectMiddleware.hasProjectID(req);
|
|
114
|
+
expect(result).toStrictEqual(true);
|
|
115
|
+
});
|
|
116
|
+
test("should return true when projectId is in body", () => {
|
|
117
|
+
const req = {
|
|
118
|
+
body: { projectId: mockedObjectId.toString() },
|
|
119
|
+
};
|
|
120
|
+
const result = ProjectMiddleware.hasProjectID(req);
|
|
121
|
+
expect(result).toStrictEqual(true);
|
|
122
|
+
});
|
|
123
|
+
test("should return true when tenantid is in params", () => {
|
|
124
|
+
const req = {
|
|
125
|
+
params: { tenantid: mockedObjectId.toString() },
|
|
126
|
+
};
|
|
127
|
+
const result = ProjectMiddleware.hasProjectID(req);
|
|
128
|
+
expect(result).toStrictEqual(true);
|
|
129
|
+
});
|
|
130
|
+
test("should return true when tenantid is in query", () => {
|
|
131
|
+
const req = {
|
|
132
|
+
query: { tenantid: mockedObjectId.toString() },
|
|
133
|
+
};
|
|
134
|
+
const result = ProjectMiddleware.hasProjectID(req);
|
|
135
|
+
expect(result).toStrictEqual(true);
|
|
136
|
+
});
|
|
86
137
|
});
|
|
87
|
-
describe("
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
await TestDatabaseMock.disconnectDbMock();
|
|
107
|
-
});
|
|
108
|
-
test("should throw BadDataException when getProjectId returns null", async () => {
|
|
109
|
-
// Mock ApiKeyService.findOneBy to return null first
|
|
110
|
-
getJestSpyOn(ApiKeyService, "findOneBy").mockResolvedValue(null);
|
|
111
|
-
const spyFindOneBy = getJestSpyOn(GlobalConfigService, "findOneBy").mockResolvedValue(null);
|
|
112
|
-
req.headers["tenantid"] = undefined;
|
|
113
|
-
req.headers["apikey"] = mockedObjectId.toString();
|
|
114
|
-
await ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware(req, res, next);
|
|
115
|
-
expect(spyFindOneBy).toHaveBeenCalledWith({
|
|
116
|
-
query: {
|
|
117
|
-
_id: ObjectID.getZeroObjectID().toString(),
|
|
118
|
-
isMasterApiKeyEnabled: true,
|
|
119
|
-
masterApiKey: mockedObjectId,
|
|
120
|
-
},
|
|
121
|
-
props: {
|
|
122
|
-
isRoot: true,
|
|
123
|
-
},
|
|
124
|
-
select: {
|
|
125
|
-
_id: true,
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
expect(next).toHaveBeenCalledWith(new BadDataException("Invalid API Key"));
|
|
129
|
-
});
|
|
130
|
-
test("should throw BadDataException when getApiKey returns null", async () => {
|
|
131
|
-
req.headers["apikey"] = undefined;
|
|
132
|
-
await ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware(req, res, next);
|
|
133
|
-
expect(next).toHaveBeenCalledWith(new BadDataException("API Key not found in the request header. Please provide a valid API Key in the request header."));
|
|
134
|
-
});
|
|
135
|
-
test("should call Response.sendErrorResponse when apiKeyModel is null", async () => {
|
|
136
|
-
const spyFindOneBy = getJestSpyOn(ApiKeyService, "findOneBy").mockResolvedValue(null);
|
|
137
|
-
jest
|
|
138
|
-
.spyOn(QueryHelper, "greaterThan")
|
|
139
|
-
.mockImplementation(jest.fn());
|
|
140
|
-
await ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware(req, res, next);
|
|
141
|
-
expect(spyFindOneBy).toHaveBeenCalledWith({
|
|
142
|
-
query: {
|
|
143
|
-
apiKey: mockedObjectId,
|
|
144
|
-
expiresAt: QueryHelper.greaterThan(OneUptimeDate.getCurrentDate()),
|
|
145
|
-
},
|
|
146
|
-
select: {
|
|
147
|
-
_id: true,
|
|
148
|
-
projectId: true,
|
|
149
|
-
},
|
|
150
|
-
props: { isRoot: true },
|
|
151
|
-
});
|
|
152
|
-
expect(next).toHaveBeenCalledWith(new BadDataException("Invalid API Key"));
|
|
153
|
-
});
|
|
154
|
-
test("should call Response.sendErrorResponse when apiKeyModel is not null but getApiTenantAccessPermission returned null", async () => {
|
|
155
|
-
jest.spyOn(ApiKeyService, "findOneBy").mockResolvedValue(mockedApiModel);
|
|
156
|
-
const spyGetApiTenantAccessPermission = getJestSpyOn(APIKeyAccessPermission, "getApiTenantAccessPermission").mockImplementationOnce(getJestMockFunction().mockResolvedValue(null));
|
|
157
|
-
await ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware(req, res, next);
|
|
158
|
-
expect(spyGetApiTenantAccessPermission).toHaveBeenCalled();
|
|
159
|
-
// check first param of next
|
|
160
|
-
expect(next).toHaveBeenCalledWith(new BadDataException("Invalid API Key"));
|
|
161
|
-
});
|
|
162
|
-
test("should call function 'next' when apiKeyModel is not null and getApiTenantAccessPermission returned userTenantAccessPermission", async () => {
|
|
163
|
-
const mockedUserTenantAccessPermission = {};
|
|
164
|
-
jest.spyOn(ApiKeyService, "findOneBy").mockResolvedValue(mockedApiModel);
|
|
165
|
-
const spyGetApiTenantAccessPermission = getJestSpyOn(APIKeyAccessPermission, "getApiTenantAccessPermission").mockResolvedValue(mockedUserTenantAccessPermission);
|
|
166
|
-
await ProjectMiddleware.isValidProjectIdAndApiKeyMiddleware(req, res, next);
|
|
167
|
-
expect(spyGetApiTenantAccessPermission).toHaveBeenCalled();
|
|
168
|
-
expect(next).toHaveBeenCalled();
|
|
138
|
+
describe("ObjectID handling", () => {
|
|
139
|
+
test("should handle valid ObjectID string", () => {
|
|
140
|
+
const validId = ObjectID.generate();
|
|
141
|
+
const req = {
|
|
142
|
+
headers: { tenantid: validId.toString() },
|
|
143
|
+
};
|
|
144
|
+
const result = ProjectMiddleware.getProjectId(req);
|
|
145
|
+
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe(validId.toString());
|
|
146
|
+
});
|
|
147
|
+
test("should handle multiple ID sources with priority", () => {
|
|
148
|
+
const headerId = ObjectID.generate();
|
|
149
|
+
const bodyId = ObjectID.generate();
|
|
150
|
+
const req = {
|
|
151
|
+
headers: { tenantid: headerId.toString() },
|
|
152
|
+
body: { projectId: bodyId.toString() },
|
|
153
|
+
};
|
|
154
|
+
const result = ProjectMiddleware.getProjectId(req);
|
|
155
|
+
// Headers should take priority
|
|
156
|
+
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe(headerId.toString());
|
|
169
157
|
});
|
|
170
158
|
});
|
|
171
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectAuthorization.test.js","sourceRoot":"","sources":["../../../../../Tests/Server/Middleware/ProjectAuthorization.test.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"ProjectAuthorization.test.js","sourceRoot":"","sources":["../../../../../Tests/Server/Middleware/ProjectAuthorization.test.ts"],"names":[],"mappings":"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"}
|