Mirror of https://github.com/roostorg/coop
github.com/roostorg/coop
1import { uid } from 'uid';
2
3import getBottle, { type Dependencies } from '../../iocContainer/index.js';
4import { type UserStrikeService } from './index.js';
5
6describe('Item Investigation Service', () => {
7 let container: Dependencies;
8 let userStrikeService: UserStrikeService;
9
10 beforeAll(async () => {
11 // The mutation should be ok here since this is initial setup in a
12 // beforeAll; it doesn't involve reset state for each test in the suite
13 /* eslint-disable better-mutation/no-mutation */
14 ({ container } = await getBottle());
15 userStrikeService = container.UserStrikeService;
16 /* eslint-enable better-mutation/no-mutation */
17 });
18 afterAll(async () => {
19 await container.closeSharedResourcesForShutdown();
20 });
21
22 test('Should properly calculate strike counts for a given user', async () => {
23 const fakeUserId = { id: uid(), typeId: uid() };
24 const fakeOrgId = uid();
25 await userStrikeService.applyUserStrike(
26 fakeOrgId,
27 fakeUserId,
28 'fakePolicyId',
29 1,
30 );
31 const strikeCount1 = await userStrikeService.getUserStrikeValue(
32 fakeOrgId,
33 fakeUserId,
34 );
35 expect(strikeCount1).toEqual(1);
36 await userStrikeService.applyUserStrike(
37 fakeOrgId,
38 fakeUserId,
39 'fakePolicyId1',
40 1,
41 );
42 const strikeCount2 = await userStrikeService.getUserStrikeValue(
43 fakeOrgId,
44 fakeUserId,
45 );
46 expect(strikeCount2).toEqual(2);
47 await userStrikeService.applyUserStrike(
48 fakeOrgId,
49 fakeUserId,
50 'fakePolicyId2',
51 10,
52 );
53 const strikeCount3 = await userStrikeService.getUserStrikeValue(
54 fakeOrgId,
55 fakeUserId,
56 );
57 expect(strikeCount3).toEqual(12);
58 });
59
60 test('Should only apply strike for most severe policy violation', async () => {
61 const testActions = [
62 {
63 orgId: 'fakeOrgId',
64 action: {
65 id: 'fakeActionId1',
66 name: 'testAction1',
67 applyUserStrikes: true,
68 orgId: 'fakeOrgId',
69 callbackUrl: 'fakeCallbackUrl1',
70 callbackUrlHeaders: null,
71 callbackUrlBody: null,
72 customMrtApiParams: null,
73 actionType: 'CUSTOM_ACTION' as const,
74 },
75 targetItem: { itemId: 'fakeItemId1', itemType: 'fakeItemType1' },
76 matchingRules: undefined,
77 ruleEnvironment: undefined,
78 policies: [
79 {
80 id: 'fakePolicyId1',
81 name: 'testPolicy1',
82 userStrikeCount: 1,
83 penalty: 'LOW' as const,
84 },
85 {
86 id: 'severePolicyId',
87 name: 'testPolicy2',
88 userStrikeCount: 2,
89 penalty: 'LOW' as const,
90 },
91 ],
92 },
93 ];
94 const mostSeverePolicyViolation =
95 userStrikeService.findMostSeverePolicyViolationFromActions(testActions);
96 if (mostSeverePolicyViolation === undefined) {
97 throw new Error('mostSeverePolicyViolation is undefined');
98 }
99 expect(mostSeverePolicyViolation.id).toEqual('severePolicyId');
100 });
101 test('findMostSeverePolicyViolationFromActions should return undefined if no actions apply user strikes', async () => {
102 const testActions = [
103 {
104 orgId: 'fakeOrgId',
105 action: {
106 id: 'fakeActionId1',
107 name: 'testAction1',
108 applyUserStrikes: false,
109 orgId: 'fakeOrgId',
110 callbackUrl: 'fakeCallbackUrl1',
111 callbackUrlHeaders: null,
112 callbackUrlBody: null,
113 customMrtApiParams: null,
114 actionType: 'CUSTOM_ACTION' as const,
115 },
116 targetItem: { itemId: 'fakeItemId1', itemType: 'fakeItemType1' },
117 matchingRules: undefined,
118 ruleEnvironment: undefined,
119 policies: [
120 {
121 id: 'fakePolicyId1',
122 name: 'testPolicy1',
123 userStrikeCount: 1,
124 penalty: 'LOW' as const,
125 },
126 {
127 id: 'severePolicyId',
128 name: 'testPolicy2',
129 userStrikeCount: 2,
130 penalty: 'LOW' as const,
131 },
132 ],
133 },
134 {
135 orgId: 'fakeOrgId',
136 action: {
137 id: 'fakeActionId1',
138 name: 'testAction1',
139 applyUserStrikes: false,
140 orgId: 'fakeOrgId',
141 callbackUrl: 'fakeCallbackUrl1',
142 callbackUrlHeaders: null,
143 callbackUrlBody: null,
144 customMrtApiParams: null,
145 actionType: 'CUSTOM_ACTION' as const,
146 },
147 targetItem: { itemId: 'fakeItemId1', itemType: 'fakeItemType1' },
148 matchingRules: undefined,
149 ruleEnvironment: undefined,
150 policies: [
151 {
152 id: 'fakePolicyId1',
153 name: 'testPolicy1',
154 userStrikeCount: 1,
155 penalty: 'LOW' as const,
156 },
157 {
158 id: 'severePolicyId',
159 name: 'testPolicy2',
160 userStrikeCount: 2,
161 penalty: 'LOW' as const,
162 },
163 ],
164 },
165 ];
166 const mostSeverePolicyViolation =
167 userStrikeService.findMostSeverePolicyViolationFromActions(testActions);
168 expect(mostSeverePolicyViolation).toBeUndefined();
169 });
170
171 test('Should properly calculate strike values using getAllUserStrikeCountsForOrg', async () => {
172 const fakeTypeId = uid();
173 const fakeUserId1 = { id: uid(), typeId: fakeTypeId };
174 const fakeUserId2 = { id: uid(), typeId: fakeTypeId };
175 const fakeUserId3 = { id: uid(), typeId: fakeTypeId };
176 const fakeOrgId = uid();
177 // 1 strike for user 1
178 await userStrikeService.applyUserStrike(
179 fakeOrgId,
180 fakeUserId1,
181 'fakePolicyId',
182 1,
183 );
184 // 2 strikes for user 2
185 await userStrikeService.applyUserStrike(
186 fakeOrgId,
187 fakeUserId2,
188 'fakePolicyId',
189 1,
190 );
191 await userStrikeService.applyUserStrike(
192 fakeOrgId,
193 fakeUserId2,
194 'fakePolicyId1',
195 1,
196 );
197 // 3 strikes for user 3
198 await userStrikeService.applyUserStrike(
199 fakeOrgId,
200 fakeUserId3,
201 'fakePolicyId1',
202 1,
203 );
204 await userStrikeService.applyUserStrike(
205 fakeOrgId,
206 fakeUserId3,
207 'fakePolicyId2',
208 1,
209 );
210 await userStrikeService.applyUserStrike(
211 fakeOrgId,
212 fakeUserId3,
213 'fakePolicyId3',
214 1,
215 );
216
217 const userStrikesForOrg =
218 await userStrikeService.getAllUserStrikeCountsForOrg(fakeOrgId);
219 const user1 = userStrikesForOrg.find(
220 (it) => it.user_identifier.id === fakeUserId1.id,
221 );
222 expect(user1?.strike_count).toEqual(1);
223 const user2 = userStrikesForOrg.find(
224 (it) => it.user_identifier.id === fakeUserId2.id,
225 );
226 expect(user2?.strike_count).toEqual(2);
227 const user3 = userStrikesForOrg.find(
228 (it) => it.user_identifier.id === fakeUserId3.id,
229 );
230 expect(user3?.strike_count).toEqual(3);
231 });
232});