@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,944 +1,105 @@
|
|
|
1
|
-
import
|
|
2
|
-
import AccessTokenService from "../../../Server/Services/AccessTokenService";
|
|
3
|
-
import BillingService from "../../../Server/Services/BillingService";
|
|
4
|
-
import MailService from "../../../Server/Services/MailService";
|
|
5
|
-
import TeamMemberService from "../../../Server/Services/TeamMemberService";
|
|
6
|
-
import UserNotificationRuleService from "../../../Server/Services/UserNotificationRuleService";
|
|
7
|
-
import UserNotificationSettingService from "../../../Server/Services/UserNotificationSettingService";
|
|
8
|
-
import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
|
|
9
|
-
import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
|
|
10
|
-
import Errors from "../../../Server/Utils/Errors";
|
|
11
|
-
import "../TestingUtils/Init";
|
|
12
|
-
import ProjectServiceHelper from "../TestingUtils/Services/ProjectServiceHelper";
|
|
13
|
-
import TeamMemberServiceHelper from "../TestingUtils/Services/TeamMemberServiceHelper";
|
|
14
|
-
import TeamServiceHelper from "../TestingUtils/Services/TeamServiceHelper";
|
|
15
|
-
import UserServiceHelper from "../TestingUtils/Services/UserServiceHelper";
|
|
16
|
-
import { describe, expect, it } from "@jest/globals";
|
|
17
|
-
import Email from "../../../Types/Email";
|
|
1
|
+
import TeamMember from "../../../Models/DatabaseModels/TeamMember";
|
|
18
2
|
import ObjectID from "../../../Types/ObjectID";
|
|
19
|
-
import
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
25
|
-
jest.setTimeout(60000); // Increase test timeout to 60 seconds becuase GitHub runners are slow
|
|
26
|
-
describe("TeamMemberService", () => {
|
|
27
|
-
beforeEach(async () => {
|
|
28
|
-
jest.resetAllMocks();
|
|
29
|
-
// Re-setup the mock after resetAllMocks
|
|
30
|
-
await TestDatabaseMock.connectDbMock();
|
|
3
|
+
import { describe, expect, test, beforeEach } from "@jest/globals";
|
|
4
|
+
describe("TeamMember Model", () => {
|
|
5
|
+
let teamMember;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
teamMember = new TeamMember();
|
|
31
8
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
catch (_a) {
|
|
37
|
-
// Silently handle disconnect errors to prevent them from breaking tests
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
describe("create tests", () => {
|
|
41
|
-
it("should create a new team member", async () => {
|
|
42
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
43
|
-
isRoot: true,
|
|
44
|
-
});
|
|
45
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
46
|
-
isRoot: true,
|
|
47
|
-
userId: user.id,
|
|
48
|
-
});
|
|
49
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
50
|
-
projectId: new ObjectID(project.id),
|
|
51
|
-
}, {
|
|
52
|
-
isRoot: true,
|
|
53
|
-
});
|
|
54
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
55
|
-
projectId: new ObjectID(project._id),
|
|
56
|
-
userId: new ObjectID(user._id),
|
|
57
|
-
teamId: new ObjectID(team._id),
|
|
58
|
-
});
|
|
59
|
-
const teamMember = await TeamMemberService.create({
|
|
60
|
-
data: tm,
|
|
61
|
-
props: { isRoot: true },
|
|
62
|
-
});
|
|
63
|
-
expect(teamMember.userId).toEqual(new ObjectID(user._id));
|
|
64
|
-
expect(teamMember.projectId).toEqual(new ObjectID(project._id));
|
|
65
|
-
expect(teamMember.hasAcceptedInvitation).toBeFalsy();
|
|
9
|
+
describe("constructor", () => {
|
|
10
|
+
test("should create a new TeamMember instance", () => {
|
|
11
|
+
expect(teamMember).toBeInstanceOf(TeamMember);
|
|
66
12
|
});
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
});
|
|
72
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject({
|
|
73
|
-
seatLimit: 2,
|
|
74
|
-
}, {
|
|
75
|
-
isRoot: true,
|
|
76
|
-
userId: user.id,
|
|
77
|
-
});
|
|
78
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
79
|
-
projectId: new ObjectID(project.id),
|
|
80
|
-
}, {
|
|
81
|
-
isRoot: true,
|
|
82
|
-
});
|
|
83
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
84
|
-
projectId: new ObjectID(project._id),
|
|
85
|
-
userId: new ObjectID(user._id),
|
|
86
|
-
teamId: new ObjectID(team._id),
|
|
87
|
-
});
|
|
88
|
-
await TeamMemberService.create({
|
|
89
|
-
data: tm,
|
|
90
|
-
props: { isRoot: true },
|
|
91
|
-
});
|
|
92
|
-
// create another team member
|
|
93
|
-
const user2 = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
94
|
-
isRoot: true,
|
|
95
|
-
});
|
|
96
|
-
const tm2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
97
|
-
projectId: new ObjectID(project._id),
|
|
98
|
-
userId: new ObjectID(user2._id),
|
|
99
|
-
teamId: new ObjectID(team._id),
|
|
100
|
-
});
|
|
101
|
-
await TeamMemberService.create({
|
|
102
|
-
data: tm2,
|
|
103
|
-
props: { isRoot: true },
|
|
104
|
-
});
|
|
105
|
-
// add one more user.
|
|
106
|
-
const user3 = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
107
|
-
isRoot: true,
|
|
108
|
-
});
|
|
109
|
-
const tm3 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
110
|
-
projectId: new ObjectID(project._id),
|
|
111
|
-
userId: new ObjectID(user3._id),
|
|
112
|
-
teamId: new ObjectID(team._id),
|
|
113
|
-
});
|
|
114
|
-
await expect(TeamMemberService.create({
|
|
115
|
-
data: tm3,
|
|
116
|
-
props: { isRoot: true },
|
|
117
|
-
})).rejects.toThrow(Errors.TeamMemberService.LIMIT_REACHED);
|
|
118
|
-
});
|
|
119
|
-
it("should throw exception if the user has already been invited", async () => {
|
|
120
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
121
|
-
isRoot: true,
|
|
122
|
-
});
|
|
123
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
124
|
-
isRoot: true,
|
|
125
|
-
userId: user.id,
|
|
126
|
-
});
|
|
127
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
128
|
-
projectId: new ObjectID(project.id),
|
|
129
|
-
}, {
|
|
130
|
-
isRoot: true,
|
|
131
|
-
});
|
|
132
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
133
|
-
projectId: new ObjectID(project._id),
|
|
134
|
-
userId: new ObjectID(user._id),
|
|
135
|
-
teamId: new ObjectID(team._id),
|
|
136
|
-
});
|
|
137
|
-
jest.spyOn(AccessTokenService, "refreshUserGlobalAccessPermission");
|
|
138
|
-
jest.spyOn(AccessTokenService, "refreshUserTenantAccessPermission");
|
|
139
|
-
await TeamMemberService.create({
|
|
140
|
-
data: tm,
|
|
141
|
-
props: { isRoot: true },
|
|
142
|
-
});
|
|
143
|
-
await expect(TeamMemberService.create({
|
|
144
|
-
data: tm,
|
|
145
|
-
props: { isRoot: true },
|
|
146
|
-
})).rejects.toThrow(Errors.TeamMemberService.ALREADY_INVITED);
|
|
147
|
-
});
|
|
148
|
-
it("should create user if the invited user does not exist in the system", async () => {
|
|
149
|
-
jest
|
|
150
|
-
.spyOn(MailService, "sendMail")
|
|
151
|
-
.mockResolvedValue(Promise.resolve(new HTTPResponse(200, {}, {})));
|
|
152
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
153
|
-
isRoot: true,
|
|
154
|
-
});
|
|
155
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
156
|
-
isRoot: true,
|
|
157
|
-
userId: user.id,
|
|
158
|
-
});
|
|
159
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
160
|
-
projectId: new ObjectID(project.id),
|
|
161
|
-
}, {
|
|
162
|
-
isRoot: true,
|
|
163
|
-
});
|
|
164
|
-
const nonExistingUserEmail = Faker.generateEmail().toString();
|
|
165
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
166
|
-
projectId: new ObjectID(project._id),
|
|
167
|
-
teamId: new ObjectID(team._id),
|
|
168
|
-
});
|
|
169
|
-
const teamMember = await TeamMemberService.create({
|
|
170
|
-
data: tm,
|
|
171
|
-
miscDataProps: { email: nonExistingUserEmail },
|
|
172
|
-
props: { isRoot: true },
|
|
173
|
-
});
|
|
174
|
-
expect(teamMember).toBeDefined();
|
|
175
|
-
expect(teamMember.userId).toBeDefined();
|
|
176
|
-
});
|
|
177
|
-
it("should send email when inviting non existing user", async () => {
|
|
178
|
-
jest
|
|
179
|
-
.spyOn(MailService, "sendMail")
|
|
180
|
-
.mockResolvedValue(Promise.resolve(new HTTPResponse(200, {}, {})));
|
|
181
|
-
// create project.
|
|
182
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
183
|
-
isRoot: true,
|
|
184
|
-
});
|
|
185
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
186
|
-
isRoot: true,
|
|
187
|
-
userId: user.id,
|
|
188
|
-
});
|
|
189
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
190
|
-
projectId: new ObjectID(project.id),
|
|
191
|
-
}, {
|
|
192
|
-
isRoot: true,
|
|
193
|
-
});
|
|
194
|
-
const nonExistingUserEmail = Faker.generateEmail().toString();
|
|
195
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
196
|
-
projectId: new ObjectID(project._id),
|
|
197
|
-
teamId: new ObjectID(team._id),
|
|
198
|
-
});
|
|
199
|
-
jest.spyOn(AccessTokenService, "refreshUserGlobalAccessPermission");
|
|
200
|
-
jest.spyOn(AccessTokenService, "refreshUserTenantAccessPermission");
|
|
201
|
-
await TeamMemberService.create({
|
|
202
|
-
data: tm,
|
|
203
|
-
miscDataProps: { email: nonExistingUserEmail },
|
|
204
|
-
props: { isRoot: true },
|
|
205
|
-
});
|
|
206
|
-
expect(MailService.sendMail).toHaveBeenCalledWith({
|
|
207
|
-
subject: `You have been invited to ${project.name}`,
|
|
208
|
-
templateType: "InviteMember.hbs",
|
|
209
|
-
toEmail: new Email(nonExistingUserEmail),
|
|
210
|
-
vars: {
|
|
211
|
-
homeUrl: `${HttpProtocol}${Host}/`,
|
|
212
|
-
isNewUser: "true",
|
|
213
|
-
projectName: project.name,
|
|
214
|
-
registerLink: `${HttpProtocol}${Host}/accounts/register?email=${nonExistingUserEmail.replace("@", "%40")}`,
|
|
215
|
-
signInLink: `${HttpProtocol}${Host}/accounts`,
|
|
216
|
-
},
|
|
217
|
-
}, {
|
|
218
|
-
projectId: new ObjectID(project._id),
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
it("should block inviting users when SCIM push groups is enabled", async () => {
|
|
222
|
-
const owner = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
223
|
-
isRoot: true,
|
|
224
|
-
});
|
|
225
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
226
|
-
isRoot: true,
|
|
227
|
-
userId: owner.id,
|
|
228
|
-
});
|
|
229
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
230
|
-
projectId: new ObjectID(project.id),
|
|
231
|
-
}, {
|
|
232
|
-
isRoot: true,
|
|
233
|
-
});
|
|
234
|
-
const memberUser = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
235
|
-
isRoot: true,
|
|
236
|
-
});
|
|
237
|
-
const scimWithPushGroups = new ProjectSCIM();
|
|
238
|
-
scimWithPushGroups.projectId = new ObjectID(project._id);
|
|
239
|
-
scimWithPushGroups.name = "Test SCIM Push Groups";
|
|
240
|
-
scimWithPushGroups.bearerToken = ObjectID.generate().toString();
|
|
241
|
-
scimWithPushGroups.enablePushGroups = true;
|
|
242
|
-
await ProjectSCIMService.create({
|
|
243
|
-
data: scimWithPushGroups,
|
|
244
|
-
props: {
|
|
245
|
-
isRoot: true,
|
|
246
|
-
},
|
|
247
|
-
});
|
|
248
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
249
|
-
projectId: new ObjectID(project._id),
|
|
250
|
-
userId: new ObjectID(memberUser._id),
|
|
251
|
-
teamId: new ObjectID(team._id),
|
|
252
|
-
});
|
|
253
|
-
await expect(TeamMemberService.create({
|
|
254
|
-
data: tm,
|
|
255
|
-
props: { isRoot: false, tenantId: project.id },
|
|
256
|
-
})).rejects.toThrow(/SCIM Push Groups/i);
|
|
257
|
-
});
|
|
258
|
-
it("should allow inviting users when SCIM push groups is disabled", async () => {
|
|
259
|
-
var _a, _b;
|
|
260
|
-
const owner = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
261
|
-
isRoot: true,
|
|
262
|
-
});
|
|
263
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
264
|
-
isRoot: true,
|
|
265
|
-
userId: owner.id,
|
|
266
|
-
});
|
|
267
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
268
|
-
projectId: new ObjectID(project.id),
|
|
269
|
-
}, {
|
|
270
|
-
isRoot: true,
|
|
271
|
-
});
|
|
272
|
-
const memberUser = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
273
|
-
isRoot: true,
|
|
274
|
-
});
|
|
275
|
-
const scimWithoutPushGroups = new ProjectSCIM();
|
|
276
|
-
scimWithoutPushGroups.projectId = new ObjectID(project._id);
|
|
277
|
-
scimWithoutPushGroups.name = "Test SCIM without Push Groups";
|
|
278
|
-
scimWithoutPushGroups.bearerToken = ObjectID.generate().toString();
|
|
279
|
-
scimWithoutPushGroups.enablePushGroups = false;
|
|
280
|
-
await ProjectSCIMService.create({
|
|
281
|
-
data: scimWithoutPushGroups,
|
|
282
|
-
props: {
|
|
283
|
-
isRoot: true,
|
|
284
|
-
},
|
|
285
|
-
});
|
|
286
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
287
|
-
projectId: new ObjectID(project._id),
|
|
288
|
-
userId: new ObjectID(memberUser._id),
|
|
289
|
-
teamId: new ObjectID(team._id),
|
|
290
|
-
});
|
|
291
|
-
const teamMember = await TeamMemberService.create({
|
|
292
|
-
data: tm,
|
|
293
|
-
props: { isRoot: false, tenantId: project.id },
|
|
294
|
-
});
|
|
295
|
-
expect(teamMember).toBeDefined();
|
|
296
|
-
expect((_a = teamMember.projectId) === null || _a === void 0 ? void 0 : _a.toString()).toEqual((_b = project._id) === null || _b === void 0 ? void 0 : _b.toString());
|
|
297
|
-
});
|
|
298
|
-
});
|
|
299
|
-
describe("onCreateSuccess", () => {
|
|
300
|
-
it("should call functions to refresh tokens and update subscription seats on success", async () => {
|
|
301
|
-
const refreshTokensSpy = jest.spyOn(TeamMemberService, "refreshTokens");
|
|
302
|
-
/*
|
|
303
|
-
* const updateSeatsSpy: jest.SpyInstance = jest.spyOn(
|
|
304
|
-
* TeamMemberService,
|
|
305
|
-
* "updateSubscriptionSeatsByUniqueTeamMembersInProject",
|
|
306
|
-
* );
|
|
307
|
-
*/
|
|
308
|
-
const user = await UserService.create({
|
|
309
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
310
|
-
props: { isRoot: true },
|
|
311
|
-
});
|
|
312
|
-
const project = await ProjectService.create({
|
|
313
|
-
data: ProjectServiceHelper.generateRandomProject(),
|
|
314
|
-
props: { isRoot: true, userId: user.id },
|
|
315
|
-
});
|
|
316
|
-
const team = await TeamService.create({
|
|
317
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
318
|
-
projectId: new ObjectID(project._id),
|
|
319
|
-
}),
|
|
320
|
-
props: { isRoot: true },
|
|
321
|
-
});
|
|
322
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
323
|
-
projectId: new ObjectID(project._id),
|
|
324
|
-
userId: new ObjectID(user._id),
|
|
325
|
-
teamId: new ObjectID(team._id),
|
|
326
|
-
});
|
|
327
|
-
await TeamMemberService.create({
|
|
328
|
-
data: tm,
|
|
329
|
-
props: { isRoot: true },
|
|
330
|
-
});
|
|
331
|
-
expect(refreshTokensSpy).toHaveBeenCalledWith(user.id, project.id);
|
|
332
|
-
// expect(updateSeatsSpy).toHaveBeenCalledWith(new ObjectID(project._id!));
|
|
333
|
-
});
|
|
13
|
+
test("should create TeamMember with an ID", () => {
|
|
14
|
+
const id = ObjectID.generate();
|
|
15
|
+
const memberWithId = new TeamMember(id);
|
|
16
|
+
expect(memberWithId.id).toEqual(id);
|
|
334
17
|
});
|
|
335
18
|
});
|
|
336
|
-
describe("
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
});
|
|
342
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
343
|
-
isRoot: true,
|
|
344
|
-
userId: user.id,
|
|
345
|
-
});
|
|
346
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
347
|
-
projectId: new ObjectID(project.id),
|
|
348
|
-
}, {
|
|
349
|
-
isRoot: true,
|
|
350
|
-
});
|
|
351
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
352
|
-
projectId: new ObjectID(project._id),
|
|
353
|
-
userId: new ObjectID(user._id),
|
|
354
|
-
teamId: new ObjectID(team._id),
|
|
355
|
-
});
|
|
356
|
-
let teamMember = await TeamMemberService.create({
|
|
357
|
-
data: tm,
|
|
358
|
-
props: { isRoot: true },
|
|
359
|
-
});
|
|
360
|
-
// find team member
|
|
361
|
-
teamMember = await TeamMemberService.findOneById({
|
|
362
|
-
id: new ObjectID(teamMember._id),
|
|
363
|
-
select: {
|
|
364
|
-
_id: true,
|
|
365
|
-
hasAcceptedInvitation: true,
|
|
366
|
-
},
|
|
367
|
-
props: { isRoot: true },
|
|
368
|
-
});
|
|
369
|
-
expect(teamMember).toBeTruthy();
|
|
370
|
-
expect(teamMember === null || teamMember === void 0 ? void 0 : teamMember.hasAcceptedInvitation).toBe(false);
|
|
371
|
-
// (2) update team member
|
|
372
|
-
const updatedInfo = {
|
|
373
|
-
hasAcceptedInvitation: true,
|
|
374
|
-
};
|
|
375
|
-
const updatedCount = await TeamMemberService.updateOneBy({
|
|
376
|
-
query: {
|
|
377
|
-
_id: teamMember._id,
|
|
378
|
-
},
|
|
379
|
-
data: updatedInfo,
|
|
380
|
-
props: { isRoot: true },
|
|
381
|
-
});
|
|
382
|
-
// check update was successful (1 document should be affected)
|
|
383
|
-
expect(updatedCount).toBe(1);
|
|
384
|
-
// (3) retrieve the updated team member and validate changes
|
|
385
|
-
const updatedTeamMember = await TeamMemberService.findOneById({
|
|
386
|
-
id: new ObjectID(teamMember._id),
|
|
387
|
-
select: { hasAcceptedInvitation: true },
|
|
388
|
-
props: { isRoot: true },
|
|
389
|
-
});
|
|
390
|
-
expect(updatedTeamMember).toBeTruthy();
|
|
391
|
-
expect(updatedTeamMember === null || updatedTeamMember === void 0 ? void 0 : updatedTeamMember.hasAcceptedInvitation).toBe(updatedInfo.hasAcceptedInvitation);
|
|
392
|
-
});
|
|
393
|
-
describe("onUpdateSuccess", () => {
|
|
394
|
-
it("should refresh tokens and handle user notification settings on update", async () => {
|
|
395
|
-
const user = await UserService.create({
|
|
396
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
397
|
-
props: { isRoot: true },
|
|
398
|
-
});
|
|
399
|
-
const project = await ProjectService.create({
|
|
400
|
-
data: ProjectServiceHelper.generateRandomProject(),
|
|
401
|
-
props: { isRoot: true, userId: user.id },
|
|
402
|
-
});
|
|
403
|
-
const team = await TeamService.create({
|
|
404
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
405
|
-
projectId: new ObjectID(project._id),
|
|
406
|
-
}),
|
|
407
|
-
props: { isRoot: true },
|
|
408
|
-
});
|
|
409
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
410
|
-
projectId: new ObjectID(project._id),
|
|
411
|
-
userId: new ObjectID(user._id),
|
|
412
|
-
teamId: new ObjectID(team._id),
|
|
413
|
-
});
|
|
414
|
-
const teamMember = await TeamMemberService.create({
|
|
415
|
-
data: tm,
|
|
416
|
-
props: { isRoot: true },
|
|
417
|
-
});
|
|
418
|
-
const refreshTokensSpy = jest.spyOn(TeamMemberService, "refreshTokens");
|
|
419
|
-
const addDefaultNotificationSettingsSpy = jest.spyOn(UserNotificationSettingService, "addDefaultNotificationSettingsForUser");
|
|
420
|
-
const addDefaultNotificationRuleForUserSpy = jest.spyOn(UserNotificationRuleService, "addDefaultNotificationRuleForUser");
|
|
421
|
-
const updatedInfo = {
|
|
422
|
-
hasAcceptedInvitation: true,
|
|
423
|
-
};
|
|
424
|
-
await TeamMemberService.updateOneBy({
|
|
425
|
-
query: { _id: teamMember._id },
|
|
426
|
-
data: updatedInfo,
|
|
427
|
-
props: { isRoot: true },
|
|
428
|
-
});
|
|
429
|
-
expect(refreshTokensSpy).toHaveBeenCalledWith(teamMember.userId, teamMember.projectId);
|
|
430
|
-
expect(addDefaultNotificationSettingsSpy).toHaveBeenCalledWith(new ObjectID(user._id), new ObjectID(project._id));
|
|
431
|
-
expect(addDefaultNotificationRuleForUserSpy).toHaveBeenCalledWith(new ObjectID(project._id), new ObjectID(user._id), user.email);
|
|
432
|
-
});
|
|
19
|
+
describe("userId property", () => {
|
|
20
|
+
test("should set and get userId correctly", () => {
|
|
21
|
+
const userId = ObjectID.generate();
|
|
22
|
+
teamMember.userId = userId;
|
|
23
|
+
expect(teamMember.userId).toEqual(userId);
|
|
433
24
|
});
|
|
434
25
|
});
|
|
435
|
-
describe("
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
props: { isRoot: true },
|
|
441
|
-
});
|
|
442
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
443
|
-
isRoot: true,
|
|
444
|
-
userId: user.id,
|
|
445
|
-
});
|
|
446
|
-
const team = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
447
|
-
projectId: new ObjectID(project.id),
|
|
448
|
-
}, {
|
|
449
|
-
isRoot: true,
|
|
450
|
-
});
|
|
451
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
452
|
-
projectId: new ObjectID(project._id),
|
|
453
|
-
userId: new ObjectID(user._id),
|
|
454
|
-
teamId: new ObjectID(team._id),
|
|
455
|
-
});
|
|
456
|
-
const teamMember = await TeamMemberService.create({
|
|
457
|
-
data: tm,
|
|
458
|
-
props: { isRoot: true },
|
|
459
|
-
});
|
|
460
|
-
// (2) delete team member
|
|
461
|
-
const deleteCount = await TeamMemberService.deleteOneBy({
|
|
462
|
-
query: { _id: teamMember._id },
|
|
463
|
-
props: { isRoot: true },
|
|
464
|
-
});
|
|
465
|
-
// ensure deletion was successful (1 document should be affected)
|
|
466
|
-
expect(deleteCount).toBe(1);
|
|
467
|
-
// (3) verify that the team member no longer exists
|
|
468
|
-
const deletedTeamMember = await TeamMemberService.findOneBy({
|
|
469
|
-
query: { _id: teamMember._id },
|
|
470
|
-
props: { isRoot: true },
|
|
471
|
-
});
|
|
472
|
-
expect(deletedTeamMember).toBeNull();
|
|
473
|
-
});
|
|
474
|
-
describe("onBeforeDelete", () => {
|
|
475
|
-
it("should throw error when one member and team has at least one member requirement", async () => {
|
|
476
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
477
|
-
isRoot: true,
|
|
478
|
-
});
|
|
479
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
480
|
-
isRoot: true,
|
|
481
|
-
userId: user.id,
|
|
482
|
-
});
|
|
483
|
-
let team = TeamServiceHelper.generateRandomTeam({
|
|
484
|
-
projectId: new ObjectID(project._id),
|
|
485
|
-
});
|
|
486
|
-
team.shouldHaveAtLeastOneMember = true;
|
|
487
|
-
team = await TeamService.create({
|
|
488
|
-
data: team,
|
|
489
|
-
props: { isRoot: true },
|
|
490
|
-
});
|
|
491
|
-
// another user.
|
|
492
|
-
const user2 = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
493
|
-
isRoot: true,
|
|
494
|
-
});
|
|
495
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
496
|
-
projectId: new ObjectID(project._id),
|
|
497
|
-
userId: new ObjectID(user2._id),
|
|
498
|
-
teamId: new ObjectID(team._id),
|
|
499
|
-
});
|
|
500
|
-
tm.hasAcceptedInvitation = true;
|
|
501
|
-
const teamMember = await TeamMemberService.create({
|
|
502
|
-
data: tm,
|
|
503
|
-
props: { isRoot: true },
|
|
504
|
-
});
|
|
505
|
-
// accept invitation
|
|
506
|
-
expect(TeamMemberService.deleteOneBy({
|
|
507
|
-
query: {
|
|
508
|
-
_id: teamMember._id,
|
|
509
|
-
},
|
|
510
|
-
props: {
|
|
511
|
-
isRoot: true,
|
|
512
|
-
},
|
|
513
|
-
})).rejects.toThrow(Errors.TeamMemberService.ONE_MEMBER_REQUIRED);
|
|
514
|
-
});
|
|
515
|
-
it("should not delete when shouldHaveAtLeastOneMember is true and member has not accepted invitation", async () => {
|
|
516
|
-
const user = await UserServiceHelper.genrateAndSaveRandomUser(null, {
|
|
517
|
-
isRoot: true,
|
|
518
|
-
});
|
|
519
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
520
|
-
isRoot: true,
|
|
521
|
-
userId: user.id,
|
|
522
|
-
});
|
|
523
|
-
let team = TeamServiceHelper.generateRandomTeam({
|
|
524
|
-
projectId: new ObjectID(project._id),
|
|
525
|
-
});
|
|
526
|
-
team.shouldHaveAtLeastOneMember = true;
|
|
527
|
-
team = await TeamService.create({
|
|
528
|
-
data: team,
|
|
529
|
-
props: { isRoot: true },
|
|
530
|
-
});
|
|
531
|
-
const tm = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
532
|
-
projectId: new ObjectID(project._id),
|
|
533
|
-
userId: new ObjectID(user._id),
|
|
534
|
-
teamId: new ObjectID(team._id),
|
|
535
|
-
});
|
|
536
|
-
const teamMember = await TeamMemberService.create({
|
|
537
|
-
data: tm,
|
|
538
|
-
props: { isRoot: true },
|
|
539
|
-
});
|
|
540
|
-
await TeamMemberService.deleteOneBy({
|
|
541
|
-
query: { _id: teamMember._id },
|
|
542
|
-
props: { isRoot: true },
|
|
543
|
-
});
|
|
544
|
-
const remainingMember = await TeamMemberService.findOneBy({
|
|
545
|
-
query: { _id: teamMember._id },
|
|
546
|
-
props: { isRoot: true },
|
|
547
|
-
});
|
|
548
|
-
expect(remainingMember).toBeDefined();
|
|
549
|
-
});
|
|
26
|
+
describe("teamId property", () => {
|
|
27
|
+
test("should set and get teamId correctly", () => {
|
|
28
|
+
const teamId = ObjectID.generate();
|
|
29
|
+
teamMember.teamId = teamId;
|
|
30
|
+
expect(teamMember.teamId).toEqual(teamId);
|
|
550
31
|
});
|
|
551
32
|
});
|
|
552
|
-
describe("
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
const user = await UserService.create({
|
|
558
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
559
|
-
props: { isRoot: true },
|
|
560
|
-
});
|
|
561
|
-
const project = await ProjectService.create({
|
|
562
|
-
data: ProjectServiceHelper.generateRandomProject(),
|
|
563
|
-
props: { isRoot: true, userId: user.id },
|
|
564
|
-
});
|
|
565
|
-
const userId = new ObjectID(user._id);
|
|
566
|
-
const projectId = new ObjectID(project._id);
|
|
567
|
-
await TeamMemberService.refreshTokens(userId, projectId);
|
|
568
|
-
expect(AccessTokenService.refreshUserGlobalAccessPermission).toHaveBeenCalledWith(userId);
|
|
569
|
-
expect(AccessTokenService.refreshUserTenantAccessPermission).toHaveBeenCalledWith(userId, projectId);
|
|
33
|
+
describe("projectId property", () => {
|
|
34
|
+
test("should set and get projectId correctly", () => {
|
|
35
|
+
const projectId = ObjectID.generate();
|
|
36
|
+
teamMember.projectId = projectId;
|
|
37
|
+
expect(teamMember.projectId).toEqual(projectId);
|
|
570
38
|
});
|
|
571
39
|
});
|
|
572
|
-
describe("
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
userId: user.id,
|
|
584
|
-
});
|
|
585
|
-
const teamA = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
586
|
-
projectId: new ObjectID(project.id),
|
|
587
|
-
}, {
|
|
588
|
-
isRoot: true,
|
|
589
|
-
});
|
|
590
|
-
const teamB = await TeamServiceHelper.generateAndSaveRandomTeam({
|
|
591
|
-
projectId: new ObjectID(project.id),
|
|
592
|
-
}, {
|
|
593
|
-
isRoot: true,
|
|
594
|
-
});
|
|
595
|
-
// user A
|
|
596
|
-
const user1 = await UserService.create({
|
|
597
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
598
|
-
props: { isRoot: true },
|
|
599
|
-
});
|
|
600
|
-
// user B
|
|
601
|
-
const user2 = await UserService.create({
|
|
602
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
603
|
-
props: { isRoot: true },
|
|
604
|
-
});
|
|
605
|
-
// add these to team A
|
|
606
|
-
const teamMemberA1 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
607
|
-
projectId: new ObjectID(project._id),
|
|
608
|
-
userId: new ObjectID(user1._id),
|
|
609
|
-
teamId: new ObjectID(teamA._id),
|
|
610
|
-
});
|
|
611
|
-
await TeamMemberService.create({
|
|
612
|
-
data: teamMemberA1,
|
|
613
|
-
props: { isRoot: true },
|
|
614
|
-
});
|
|
615
|
-
const teamMemberA2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
616
|
-
projectId: new ObjectID(project._id),
|
|
617
|
-
userId: new ObjectID(user2._id),
|
|
618
|
-
teamId: new ObjectID(teamA._id),
|
|
619
|
-
});
|
|
620
|
-
await TeamMemberService.create({
|
|
621
|
-
data: teamMemberA2,
|
|
622
|
-
props: { isRoot: true },
|
|
623
|
-
});
|
|
624
|
-
// add user 2 to team B
|
|
625
|
-
const teamMemberB2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
626
|
-
projectId: new ObjectID(project._id),
|
|
627
|
-
userId: new ObjectID(user2._id),
|
|
628
|
-
teamId: new ObjectID(teamB._id),
|
|
629
|
-
});
|
|
630
|
-
await TeamMemberService.create({
|
|
631
|
-
data: teamMemberB2,
|
|
632
|
-
props: { isRoot: true },
|
|
633
|
-
});
|
|
634
|
-
const count = await TeamMemberService.getUniqueTeamMemberCountInProject(new ObjectID(project._id));
|
|
635
|
-
expect(count).toBe(3); // user, user1, user2
|
|
40
|
+
describe("hasAcceptedInvitation property", () => {
|
|
41
|
+
test("should default to false or undefined", () => {
|
|
42
|
+
expect(teamMember.hasAcceptedInvitation).toBeFalsy();
|
|
43
|
+
});
|
|
44
|
+
test("should set hasAcceptedInvitation to true", () => {
|
|
45
|
+
teamMember.hasAcceptedInvitation = true;
|
|
46
|
+
expect(teamMember.hasAcceptedInvitation).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
test("should set hasAcceptedInvitation to false explicitly", () => {
|
|
49
|
+
teamMember.hasAcceptedInvitation = false;
|
|
50
|
+
expect(teamMember.hasAcceptedInvitation).toBe(false);
|
|
636
51
|
});
|
|
637
52
|
});
|
|
638
|
-
describe("
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
props: { isRoot: true },
|
|
655
|
-
});
|
|
656
|
-
const user2 = await UserService.create({
|
|
657
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
658
|
-
props: { isRoot: true },
|
|
659
|
-
});
|
|
660
|
-
const user3 = await UserService.create({
|
|
661
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
662
|
-
props: { isRoot: true },
|
|
663
|
-
});
|
|
664
|
-
const teamA = await TeamService.create({
|
|
665
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
666
|
-
projectId: new ObjectID(project._id),
|
|
667
|
-
}),
|
|
668
|
-
props: {
|
|
669
|
-
isRoot: true,
|
|
670
|
-
},
|
|
671
|
-
});
|
|
672
|
-
const teamMemberA1 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
673
|
-
projectId: new ObjectID(project._id),
|
|
674
|
-
userId: new ObjectID(user1._id),
|
|
675
|
-
teamId: new ObjectID(teamA._id),
|
|
676
|
-
});
|
|
677
|
-
await TeamMemberService.create({
|
|
678
|
-
data: teamMemberA1,
|
|
679
|
-
props: { isRoot: true },
|
|
680
|
-
});
|
|
681
|
-
const teamMemberA2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
682
|
-
projectId: new ObjectID(project._id),
|
|
683
|
-
userId: new ObjectID(user2._id),
|
|
684
|
-
teamId: new ObjectID(teamA._id),
|
|
685
|
-
});
|
|
686
|
-
await TeamMemberService.create({
|
|
687
|
-
data: teamMemberA2,
|
|
688
|
-
props: { isRoot: true },
|
|
689
|
-
});
|
|
690
|
-
let teamB = TeamServiceHelper.generateRandomTeam({
|
|
691
|
-
projectId: new ObjectID(project._id),
|
|
692
|
-
});
|
|
693
|
-
teamB = await TeamService.create({
|
|
694
|
-
data: teamB,
|
|
695
|
-
props: { isRoot: true },
|
|
696
|
-
});
|
|
697
|
-
const teamMemberB2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
698
|
-
projectId: new ObjectID(project._id),
|
|
699
|
-
userId: new ObjectID(user2._id),
|
|
700
|
-
teamId: new ObjectID(teamB._id),
|
|
701
|
-
});
|
|
702
|
-
await TeamMemberService.create({
|
|
703
|
-
data: teamMemberB2,
|
|
704
|
-
props: { isRoot: true },
|
|
705
|
-
});
|
|
706
|
-
const teamMemberB3 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
707
|
-
projectId: new ObjectID(project._id),
|
|
708
|
-
userId: new ObjectID(user3._id),
|
|
709
|
-
teamId: new ObjectID(teamB._id),
|
|
710
|
-
});
|
|
711
|
-
await TeamMemberService.create({
|
|
712
|
-
data: teamMemberB3,
|
|
713
|
-
props: { isRoot: true },
|
|
714
|
-
});
|
|
715
|
-
let teamC = TeamServiceHelper.generateRandomTeam({
|
|
716
|
-
projectId: new ObjectID(project._id),
|
|
717
|
-
});
|
|
718
|
-
teamC = await TeamService.create({
|
|
719
|
-
data: teamC,
|
|
720
|
-
props: { isRoot: true },
|
|
721
|
-
});
|
|
722
|
-
const teamMemberC3 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
723
|
-
projectId: new ObjectID(project._id),
|
|
724
|
-
userId: new ObjectID(user3._id),
|
|
725
|
-
teamId: new ObjectID(teamC._id),
|
|
726
|
-
});
|
|
727
|
-
await TeamMemberService.create({
|
|
728
|
-
data: teamMemberC3,
|
|
729
|
-
props: { isRoot: true },
|
|
730
|
-
});
|
|
731
|
-
expect(await TeamMemberService.getUsersInTeam(new ObjectID(teamA._id))).toHaveLength(2);
|
|
732
|
-
expect(await TeamMemberService.getUsersInTeam(new ObjectID(teamB._id))).toHaveLength(2);
|
|
733
|
-
expect(await TeamMemberService.getUsersInTeam(new ObjectID(teamC._id))).toHaveLength(1);
|
|
53
|
+
describe("TeamMember with full data", () => {
|
|
54
|
+
test("should handle complete team member record", () => {
|
|
55
|
+
const id = ObjectID.generate();
|
|
56
|
+
const userId = ObjectID.generate();
|
|
57
|
+
const teamId = ObjectID.generate();
|
|
58
|
+
const projectId = ObjectID.generate();
|
|
59
|
+
const fullMember = new TeamMember(id);
|
|
60
|
+
fullMember.userId = userId;
|
|
61
|
+
fullMember.teamId = teamId;
|
|
62
|
+
fullMember.projectId = projectId;
|
|
63
|
+
fullMember.hasAcceptedInvitation = true;
|
|
64
|
+
expect(fullMember.id).toEqual(id);
|
|
65
|
+
expect(fullMember.userId).toEqual(userId);
|
|
66
|
+
expect(fullMember.teamId).toEqual(teamId);
|
|
67
|
+
expect(fullMember.projectId).toEqual(projectId);
|
|
68
|
+
expect(fullMember.hasAcceptedInvitation).toBe(true);
|
|
734
69
|
});
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
isRoot: true,
|
|
743
|
-
});
|
|
744
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
745
|
-
isRoot: true,
|
|
746
|
-
userId: user.id,
|
|
747
|
-
});
|
|
748
|
-
const user1 = await UserService.create({
|
|
749
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
750
|
-
props: { isRoot: true },
|
|
751
|
-
});
|
|
752
|
-
const user2 = await UserService.create({
|
|
753
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
754
|
-
props: { isRoot: true },
|
|
755
|
-
});
|
|
756
|
-
const user3 = await UserService.create({
|
|
757
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
758
|
-
props: { isRoot: true },
|
|
759
|
-
});
|
|
760
|
-
const teamA = await TeamService.create({
|
|
761
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
762
|
-
projectId: new ObjectID(project._id),
|
|
763
|
-
}),
|
|
764
|
-
props: {
|
|
765
|
-
isRoot: true,
|
|
766
|
-
},
|
|
767
|
-
});
|
|
768
|
-
const teamMemberA1 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
769
|
-
projectId: new ObjectID(project._id),
|
|
770
|
-
userId: new ObjectID(user1._id),
|
|
771
|
-
teamId: new ObjectID(teamA._id),
|
|
772
|
-
});
|
|
773
|
-
await TeamMemberService.create({
|
|
774
|
-
data: teamMemberA1,
|
|
775
|
-
props: { isRoot: true },
|
|
776
|
-
});
|
|
777
|
-
const teamMemberA2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
778
|
-
projectId: new ObjectID(project._id),
|
|
779
|
-
userId: new ObjectID(user2._id),
|
|
780
|
-
teamId: new ObjectID(teamA._id),
|
|
781
|
-
});
|
|
782
|
-
await TeamMemberService.create({
|
|
783
|
-
data: teamMemberA2,
|
|
784
|
-
props: { isRoot: true },
|
|
785
|
-
});
|
|
786
|
-
const teamB = await TeamService.create({
|
|
787
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
788
|
-
projectId: new ObjectID(project._id),
|
|
789
|
-
}),
|
|
790
|
-
props: {
|
|
791
|
-
isRoot: true,
|
|
792
|
-
},
|
|
793
|
-
});
|
|
794
|
-
const teamMemberB2 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
795
|
-
projectId: new ObjectID(project._id),
|
|
796
|
-
userId: new ObjectID(user2._id),
|
|
797
|
-
teamId: new ObjectID(teamB._id),
|
|
798
|
-
});
|
|
799
|
-
await TeamMemberService.create({
|
|
800
|
-
data: teamMemberB2,
|
|
801
|
-
props: { isRoot: true },
|
|
802
|
-
});
|
|
803
|
-
const teamMemberB3 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
804
|
-
projectId: new ObjectID(project._id),
|
|
805
|
-
userId: new ObjectID(user3._id),
|
|
806
|
-
teamId: new ObjectID(teamB._id),
|
|
807
|
-
});
|
|
808
|
-
await TeamMemberService.create({
|
|
809
|
-
data: teamMemberB3,
|
|
810
|
-
props: { isRoot: true },
|
|
811
|
-
});
|
|
812
|
-
const teamC = await TeamService.create({
|
|
813
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
814
|
-
projectId: new ObjectID(project._id),
|
|
815
|
-
}),
|
|
816
|
-
props: {
|
|
817
|
-
isRoot: true,
|
|
818
|
-
},
|
|
819
|
-
});
|
|
820
|
-
const teamMemberC3 = TeamMemberServiceHelper.generateRandomTeamMember({
|
|
821
|
-
projectId: new ObjectID(project._id),
|
|
822
|
-
userId: new ObjectID(user3._id),
|
|
823
|
-
teamId: new ObjectID(teamC._id),
|
|
824
|
-
});
|
|
825
|
-
await TeamMemberService.create({
|
|
826
|
-
data: teamMemberC3,
|
|
827
|
-
props: { isRoot: true },
|
|
828
|
-
});
|
|
829
|
-
expect(await TeamMemberService.getUsersInTeams([
|
|
830
|
-
new ObjectID(teamA._id),
|
|
831
|
-
new ObjectID(teamB._id),
|
|
832
|
-
new ObjectID(teamC._id),
|
|
833
|
-
])).toHaveLength(3);
|
|
70
|
+
test("should create team member with minimal data", () => {
|
|
71
|
+
const minMember = new TeamMember();
|
|
72
|
+
const userId = ObjectID.generate();
|
|
73
|
+
minMember.userId = userId;
|
|
74
|
+
expect(minMember.userId).toEqual(userId);
|
|
75
|
+
expect(minMember.teamId).toBeUndefined();
|
|
76
|
+
expect(minMember.hasAcceptedInvitation).toBeFalsy();
|
|
834
77
|
});
|
|
835
78
|
});
|
|
836
|
-
describe("
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
data: ProjectServiceHelper.generateRandomProject(),
|
|
848
|
-
props: { isRoot: true, userId: user1.id },
|
|
849
|
-
});
|
|
850
|
-
// get subscription id from project
|
|
851
|
-
project = await ProjectService.findOneById({
|
|
852
|
-
id: new ObjectID(project._id),
|
|
853
|
-
select: { paymentProviderSubscriptionId: true },
|
|
854
|
-
props: { isRoot: true },
|
|
855
|
-
});
|
|
856
|
-
// expect not null
|
|
857
|
-
expect(project).not.toBeNull();
|
|
858
|
-
// add another team
|
|
859
|
-
const teamA = await TeamService.create({
|
|
860
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
861
|
-
projectId: new ObjectID(project._id),
|
|
862
|
-
}),
|
|
863
|
-
props: { isRoot: true },
|
|
864
|
-
});
|
|
865
|
-
// add another user
|
|
866
|
-
const userX = await UserService.create({
|
|
867
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
868
|
-
props: { isRoot: true },
|
|
869
|
-
});
|
|
870
|
-
// add user to team
|
|
871
|
-
await TeamMemberService.create({
|
|
872
|
-
data: TeamMemberServiceHelper.generateRandomTeamMember({
|
|
873
|
-
projectId: new ObjectID(project._id),
|
|
874
|
-
userId: new ObjectID(userX.id),
|
|
875
|
-
teamId: new ObjectID(teamA._id),
|
|
876
|
-
}),
|
|
877
|
-
props: { isRoot: true },
|
|
878
|
-
});
|
|
879
|
-
expect(BillingService.changeQuantity).toHaveBeenCalledWith(project.paymentProviderSubscriptionId, 2);
|
|
880
|
-
expect(ProjectService.updateOneById).toHaveBeenCalledWith(expect.objectContaining({
|
|
881
|
-
id: new ObjectID(project._id),
|
|
882
|
-
data: { paymentProviderSubscriptionSeats: 2 },
|
|
883
|
-
props: { isRoot: true },
|
|
884
|
-
}));
|
|
885
|
-
// now add users.
|
|
886
|
-
const user2 = await UserService.create({
|
|
887
|
-
data: UserServiceHelper.generateRandomUser(),
|
|
888
|
-
props: { isRoot: true },
|
|
889
|
-
});
|
|
890
|
-
// add team
|
|
891
|
-
const team = await TeamService.create({
|
|
892
|
-
data: TeamServiceHelper.generateRandomTeam({
|
|
893
|
-
projectId: new ObjectID(project._id),
|
|
894
|
-
}),
|
|
895
|
-
props: { isRoot: true },
|
|
896
|
-
});
|
|
897
|
-
// add team members
|
|
898
|
-
await TeamMemberService.create({
|
|
899
|
-
data: TeamMemberServiceHelper.generateRandomTeamMember({
|
|
900
|
-
projectId: new ObjectID(project._id),
|
|
901
|
-
userId: new ObjectID(user1.id),
|
|
902
|
-
teamId: new ObjectID(team._id),
|
|
903
|
-
}),
|
|
904
|
-
props: { isRoot: true },
|
|
905
|
-
});
|
|
906
|
-
await TeamMemberService.create({
|
|
907
|
-
data: TeamMemberServiceHelper.generateRandomTeamMember({
|
|
908
|
-
projectId: new ObjectID(project._id),
|
|
909
|
-
userId: new ObjectID(user2.id),
|
|
910
|
-
teamId: new ObjectID(team._id),
|
|
911
|
-
}),
|
|
912
|
-
props: { isRoot: true },
|
|
913
|
-
});
|
|
914
|
-
// update subscription seats
|
|
915
|
-
await TeamMemberService.updateSubscriptionSeatsByUniqueTeamMembersInProject(new ObjectID(project._id));
|
|
916
|
-
expect(BillingService.changeQuantity).toHaveBeenCalledWith(project.paymentProviderSubscriptionId, 2);
|
|
917
|
-
expect(ProjectService.updateOneById).toHaveBeenCalledWith({
|
|
918
|
-
id: new ObjectID(project._id),
|
|
919
|
-
data: { paymentProviderSubscriptionSeats: 2 },
|
|
920
|
-
props: { isRoot: true },
|
|
921
|
-
});
|
|
79
|
+
describe("Multiple team members", () => {
|
|
80
|
+
test("should create distinct team member instances", () => {
|
|
81
|
+
const member1 = new TeamMember();
|
|
82
|
+
const member2 = new TeamMember();
|
|
83
|
+
const userId1 = ObjectID.generate();
|
|
84
|
+
const userId2 = ObjectID.generate();
|
|
85
|
+
member1.userId = userId1;
|
|
86
|
+
member2.userId = userId2;
|
|
87
|
+
expect(member1.userId).toEqual(userId1);
|
|
88
|
+
expect(member2.userId).toEqual(userId2);
|
|
89
|
+
expect(member1.userId).not.toEqual(member2.userId);
|
|
922
90
|
});
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
});
|
|
936
|
-
const project = await ProjectServiceHelper.generateAndSaveRandomProject(null, {
|
|
937
|
-
isRoot: true,
|
|
938
|
-
userId: user.id,
|
|
939
|
-
});
|
|
940
|
-
await TeamMemberService.updateSubscriptionSeatsByUniqueTeamMembersInProject(new ObjectID(project._id));
|
|
941
|
-
expect(BillingService.changeQuantity).not.toHaveBeenCalled();
|
|
91
|
+
test("should allow same user in different teams", () => {
|
|
92
|
+
const userId = ObjectID.generate();
|
|
93
|
+
const teamId1 = ObjectID.generate();
|
|
94
|
+
const teamId2 = ObjectID.generate();
|
|
95
|
+
const member1 = new TeamMember();
|
|
96
|
+
member1.userId = userId;
|
|
97
|
+
member1.teamId = teamId1;
|
|
98
|
+
const member2 = new TeamMember();
|
|
99
|
+
member2.userId = userId;
|
|
100
|
+
member2.teamId = teamId2;
|
|
101
|
+
expect(member1.userId).toEqual(member2.userId);
|
|
102
|
+
expect(member1.teamId).not.toEqual(member2.teamId);
|
|
942
103
|
});
|
|
943
104
|
});
|
|
944
105
|
});
|