@way_marks/server 1.0.0 → 2.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.
@@ -1,519 +0,0 @@
1
- "use strict";
2
- /**
3
- * Escalation Manager Tests — Phase 3
4
- *
5
- * Comprehensive test suite for escalation logic:
6
- * - Stale approval detection
7
- * - Escalation request creation
8
- * - Escalation decision submission
9
- * - Status tracking and decision aggregation
10
- * - Scheduler functionality
11
- * - Integration with approval system
12
- */
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || (function () {
30
- var ownKeys = function(o) {
31
- ownKeys = Object.getOwnPropertyNames || function (o) {
32
- var ar = [];
33
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
- return ar;
35
- };
36
- return ownKeys(o);
37
- };
38
- return function (mod) {
39
- if (mod && mod.__esModule) return mod;
40
- var result = {};
41
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
- __setModuleDefault(result, mod);
43
- return result;
44
- };
45
- })();
46
- Object.defineProperty(exports, "__esModule", { value: true });
47
- const manager_1 = require("./manager");
48
- const db = __importStar(require("../db/database"));
49
- jest.mock('../db/database');
50
- describe('Escalation Manager', () => {
51
- beforeEach(() => {
52
- jest.clearAllMocks();
53
- });
54
- describe('checkAndEscalateStaleApprovals', () => {
55
- it('should detect stale approvals and create escalations', () => {
56
- const staleApprovals = [
57
- { approval_request_id: 'apr-1', session_id: 'sess-1' },
58
- { approval_request_id: 'apr-2', session_id: 'sess-2' },
59
- ];
60
- const rules = [
61
- {
62
- rule_id: 'rule-1',
63
- name: 'Default Rule',
64
- description: 'Escalate to all managers',
65
- timeout_hours: 2,
66
- escalation_targets: '["mgr-1", "mgr-2"]',
67
- created_at: new Date().toISOString(),
68
- created_by: 'admin',
69
- status: 'active',
70
- },
71
- ];
72
- db.getStaleApprovals.mockReturnValue(staleApprovals);
73
- db.getAllEscalationRules.mockReturnValue(rules);
74
- db.createEscalationRequest.mockReturnValue(undefined);
75
- const result = (0, manager_1.checkAndEscalateStaleApprovals)();
76
- expect(result.hasStaleApprovals).toBe(true);
77
- expect(result.staleApprovals).toEqual(staleApprovals);
78
- expect(result.escalationsCreated).toHaveLength(2);
79
- expect(db.createEscalationRequest).toHaveBeenCalledTimes(2);
80
- });
81
- it('should handle no stale approvals', () => {
82
- db.getStaleApprovals.mockReturnValue([]);
83
- db.getAllEscalationRules.mockReturnValue([]);
84
- const result = (0, manager_1.checkAndEscalateStaleApprovals)();
85
- expect(result.hasStaleApprovals).toBe(false);
86
- expect(result.escalationsCreated).toHaveLength(0);
87
- });
88
- it('should handle missing escalation rules gracefully', () => {
89
- const staleApprovals = [
90
- { approval_request_id: 'apr-1', session_id: 'sess-1' },
91
- ];
92
- db.getStaleApprovals.mockReturnValue(staleApprovals);
93
- db.getAllEscalationRules.mockReturnValue([]);
94
- const result = (0, manager_1.checkAndEscalateStaleApprovals)();
95
- expect(result.escalationsCreated).toHaveLength(0);
96
- expect(db.createEscalationRequest).not.toHaveBeenCalled();
97
- });
98
- it('should set correct escalation deadline based on rule timeout', () => {
99
- const staleApprovals = [
100
- { approval_request_id: 'apr-1', session_id: 'sess-1' },
101
- ];
102
- const rules = [
103
- {
104
- rule_id: 'rule-1',
105
- name: 'Quick Escalation',
106
- description: 'Fast escalation',
107
- timeout_hours: 4,
108
- escalation_targets: '["mgr-1"]',
109
- created_at: new Date().toISOString(),
110
- created_by: 'admin',
111
- status: 'active',
112
- },
113
- ];
114
- db.getStaleApprovals.mockReturnValue(staleApprovals);
115
- db.getAllEscalationRules.mockReturnValue(rules);
116
- db.createEscalationRequest.mockReturnValue(undefined);
117
- (0, manager_1.checkAndEscalateStaleApprovals)();
118
- const call = db.createEscalationRequest.mock.calls[0];
119
- expect(call).toHaveLength(5);
120
- // Verify deadline is roughly 4 hours from now
121
- const deadline = new Date(call[4]);
122
- const now = new Date();
123
- const diffHours = (deadline.getTime() - now.getTime()) / (1000 * 60 * 60);
124
- expect(diffHours).toBeGreaterThan(3.9);
125
- expect(diffHours).toBeLessThan(4.1);
126
- });
127
- });
128
- describe('determineEscalationTargets', () => {
129
- it('should return targets from first active rule', () => {
130
- const rules = [
131
- {
132
- rule_id: 'rule-1',
133
- name: 'Default',
134
- description: '',
135
- timeout_hours: 2,
136
- escalation_targets: '["mgr-1", "mgr-2", "lead-1"]',
137
- created_at: new Date().toISOString(),
138
- created_by: 'admin',
139
- status: 'active',
140
- },
141
- ];
142
- db.getAllEscalationRules.mockReturnValue(rules);
143
- const targets = (0, manager_1.determineEscalationTargets)('apr-1');
144
- expect(targets).toEqual(['mgr-1', 'mgr-2', 'lead-1']);
145
- });
146
- it('should return empty array if no rules exist', () => {
147
- db.getAllEscalationRules.mockReturnValue([]);
148
- const targets = (0, manager_1.determineEscalationTargets)('apr-1');
149
- expect(targets).toEqual([]);
150
- });
151
- it('should handle multiple rules by using first one', () => {
152
- const rules = [
153
- {
154
- rule_id: 'rule-1',
155
- name: 'First',
156
- description: '',
157
- timeout_hours: 2,
158
- escalation_targets: '["mgr-1"]',
159
- created_at: new Date().toISOString(),
160
- created_by: 'admin',
161
- status: 'active',
162
- },
163
- {
164
- rule_id: 'rule-2',
165
- name: 'Second',
166
- description: '',
167
- timeout_hours: 2,
168
- escalation_targets: '["mgr-2"]',
169
- created_at: new Date().toISOString(),
170
- created_by: 'admin',
171
- status: 'active',
172
- },
173
- ];
174
- db.getAllEscalationRules.mockReturnValue(rules);
175
- const targets = (0, manager_1.determineEscalationTargets)('apr-1');
176
- expect(targets).toEqual(['mgr-1']);
177
- });
178
- });
179
- describe('submitEscalationDecision', () => {
180
- const mockEscalation = {
181
- request_id: 'esc-1',
182
- approval_request_id: 'apr-1',
183
- session_id: 'sess-1',
184
- escalation_triggered_at: new Date().toISOString(),
185
- escalation_deadline: new Date(Date.now() + 7200000).toISOString(),
186
- escalation_targets: '["mgr-1", "mgr-2"]',
187
- status: 'pending',
188
- decided_at: null,
189
- decision: null,
190
- };
191
- it('should accept valid proceed decision', () => {
192
- db.getEscalationRequest.mockReturnValue(mockEscalation);
193
- db.getEscalationDecisions.mockReturnValue([]);
194
- db.submitEscalationDecision.mockReturnValue(undefined);
195
- const result = (0, manager_1.submitEscalationDecision)('esc-1', 'mgr-1', 'proceed', 'looks good');
196
- expect(db.submitEscalationDecision).toHaveBeenCalledWith(expect.any(String), 'esc-1', 'mgr-1', 'proceed', 'looks good');
197
- expect(result).toBeDefined();
198
- });
199
- it('should accept valid block decision', () => {
200
- db.getEscalationRequest.mockReturnValue(mockEscalation);
201
- db.getEscalationDecisions.mockReturnValue([]);
202
- db.submitEscalationDecision.mockReturnValue(undefined);
203
- const result = (0, manager_1.submitEscalationDecision)('esc-1', 'mgr-1', 'block', 'needs review');
204
- expect(db.submitEscalationDecision).toHaveBeenCalled();
205
- });
206
- it('should reject decision from unauthorized target', () => {
207
- db.getEscalationRequest.mockReturnValue(mockEscalation);
208
- expect(() => {
209
- (0, manager_1.submitEscalationDecision)('esc-1', 'unauthorized-user', 'proceed');
210
- }).toThrow('not authorized');
211
- });
212
- it('should reject duplicate decisions from same target', () => {
213
- db.getEscalationRequest.mockReturnValue(mockEscalation);
214
- db.getEscalationDecisions.mockReturnValue([
215
- { target_id: 'mgr-1', decision: 'proceed', reason: 'initial' },
216
- ]);
217
- expect(() => {
218
- (0, manager_1.submitEscalationDecision)('esc-1', 'mgr-1', 'block', 'changed mind');
219
- }).toThrow('already made a decision');
220
- });
221
- it('should throw error for non-existent escalation', () => {
222
- db.getEscalationRequest.mockReturnValue(null);
223
- expect(() => {
224
- (0, manager_1.submitEscalationDecision)('non-existent', 'mgr-1', 'proceed');
225
- }).toThrow('not found');
226
- });
227
- });
228
- describe('getEscalationStatus', () => {
229
- const mockEscalation = {
230
- request_id: 'esc-1',
231
- approval_request_id: 'apr-1',
232
- session_id: 'sess-1',
233
- escalation_triggered_at: new Date().toISOString(),
234
- escalation_deadline: new Date(Date.now() + 7200000).toISOString(),
235
- escalation_targets: '["mgr-1", "mgr-2"]',
236
- status: 'pending',
237
- decided_at: null,
238
- decision: null,
239
- };
240
- it('should return pending status with no decisions', () => {
241
- db.getEscalationRequest.mockReturnValue(mockEscalation);
242
- db.getEscalationDecisions.mockReturnValue([]);
243
- const status = (0, manager_1.getEscalationStatus)('esc-1');
244
- expect(status.status).toBe('pending');
245
- expect(status.can_proceed).toBe(false);
246
- expect(status.decisions_received).toBe(0);
247
- });
248
- it('should return blocked status with any block decision', () => {
249
- db.getEscalationRequest.mockReturnValue(mockEscalation);
250
- db.getEscalationDecisions.mockReturnValue([
251
- { target_id: 'mgr-1', decision: 'block', reason: 'risky' },
252
- { target_id: 'mgr-2', decision: 'proceed', reason: null },
253
- ]);
254
- const status = (0, manager_1.getEscalationStatus)('esc-1');
255
- expect(status.status).toBe('blocked');
256
- expect(status.can_proceed).toBe(false);
257
- expect(status.decisions_received).toBe(2);
258
- });
259
- it('should return proceeded status when all targets proceed', () => {
260
- db.getEscalationRequest.mockReturnValue(mockEscalation);
261
- db.getEscalationDecisions.mockReturnValue([
262
- { target_id: 'mgr-1', decision: 'proceed', reason: null },
263
- { target_id: 'mgr-2', decision: 'proceed', reason: 'approved' },
264
- ]);
265
- const status = (0, manager_1.getEscalationStatus)('esc-1');
266
- expect(status.status).toBe('proceeded');
267
- expect(status.can_proceed).toBe(true);
268
- expect(status.decisions_received).toBe(2);
269
- });
270
- it('should return pending status with partial decisions', () => {
271
- db.getEscalationRequest.mockReturnValue(mockEscalation);
272
- db.getEscalationDecisions.mockReturnValue([
273
- { target_id: 'mgr-1', decision: 'proceed', reason: null },
274
- ]);
275
- const status = (0, manager_1.getEscalationStatus)('esc-1');
276
- expect(status.status).toBe('pending');
277
- expect(status.can_proceed).toBe(false);
278
- });
279
- it('should throw error for non-existent escalation', () => {
280
- db.getEscalationRequest.mockReturnValue(null);
281
- expect(() => {
282
- (0, manager_1.getEscalationStatus)('non-existent');
283
- }).toThrow('not found');
284
- });
285
- });
286
- describe('canProceedWithRollbackAfterEscalation', () => {
287
- it('should allow rollback if no escalation exists', () => {
288
- db.getPendingEscalations.mockReturnValue([]);
289
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
290
- expect(canProceed).toBe(true);
291
- });
292
- it('should block rollback if escalation is blocked', () => {
293
- db.getPendingEscalations.mockReturnValue([
294
- { request_id: 'esc-1', approval_request_id: 'apr-1', session_id: 'sess-1' },
295
- ]);
296
- db.getEscalationRequest.mockReturnValue({
297
- request_id: 'esc-1',
298
- approval_request_id: 'apr-1',
299
- session_id: 'sess-1',
300
- escalation_targets: '["mgr-1"]',
301
- });
302
- db.getEscalationDecisions.mockReturnValue([
303
- { target_id: 'mgr-1', decision: 'block' },
304
- ]);
305
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
306
- expect(canProceed).toBe(false);
307
- });
308
- it('should allow rollback if escalation is proceeded', () => {
309
- db.getPendingEscalations.mockReturnValue([
310
- { request_id: 'esc-1', approval_request_id: 'apr-1', session_id: 'sess-1' },
311
- ]);
312
- db.getEscalationRequest.mockReturnValue({
313
- request_id: 'esc-1',
314
- approval_request_id: 'apr-1',
315
- session_id: 'sess-1',
316
- escalation_targets: '["mgr-1", "mgr-2"]',
317
- });
318
- db.getEscalationDecisions.mockReturnValue([
319
- { target_id: 'mgr-1', decision: 'proceed' },
320
- { target_id: 'mgr-2', decision: 'proceed' },
321
- ]);
322
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
323
- expect(canProceed).toBe(true);
324
- });
325
- it('should block rollback if escalation is still pending', () => {
326
- db.getPendingEscalations.mockReturnValue([
327
- { request_id: 'esc-1', approval_request_id: 'apr-1', session_id: 'sess-1' },
328
- ]);
329
- db.getEscalationRequest.mockReturnValue({
330
- request_id: 'esc-1',
331
- approval_request_id: 'apr-1',
332
- session_id: 'sess-1',
333
- escalation_targets: '["mgr-1", "mgr-2"]',
334
- });
335
- db.getEscalationDecisions.mockReturnValue([
336
- { target_id: 'mgr-1', decision: 'proceed' },
337
- ]);
338
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
339
- expect(canProceed).toBe(false);
340
- });
341
- it('should handle errors gracefully and block rollback', () => {
342
- db.getPendingEscalations.mockReturnValue([
343
- { request_id: 'esc-1', approval_request_id: 'apr-1', session_id: 'sess-1' },
344
- ]);
345
- db.getEscalationRequest.mockImplementation(() => {
346
- throw new Error('DB error');
347
- });
348
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
349
- expect(canProceed).toBe(false);
350
- });
351
- });
352
- describe('getEscalationHistoryForSession', () => {
353
- it('should return escalation history for session', () => {
354
- const history = [
355
- {
356
- request_id: 'esc-1',
357
- approval_request_id: 'apr-1',
358
- session_id: 'sess-1',
359
- escalation_triggered_at: new Date().toISOString(),
360
- escalation_deadline: new Date().toISOString(),
361
- escalation_targets: '["mgr-1"]',
362
- status: 'proceeded',
363
- decided_at: new Date().toISOString(),
364
- decision: 'proceed',
365
- },
366
- ];
367
- db.getEscalationHistory.mockReturnValue(history);
368
- const result = (0, manager_1.getEscalationHistoryForSession)('sess-1');
369
- expect(result).toEqual(history);
370
- expect(db.getEscalationHistory).toHaveBeenCalledWith('sess-1');
371
- });
372
- it('should return empty array if no history', () => {
373
- db.getEscalationHistory.mockReturnValue([]);
374
- const result = (0, manager_1.getEscalationHistoryForSession)('sess-1');
375
- expect(result).toEqual([]);
376
- });
377
- });
378
- describe('Escalation Scheduler', () => {
379
- beforeEach(() => {
380
- jest.useFakeTimers();
381
- (0, manager_1.stopEscalationScheduler)(); // Ensure scheduler is stopped before tests
382
- });
383
- afterEach(() => {
384
- jest.useRealTimers();
385
- (0, manager_1.stopEscalationScheduler)();
386
- });
387
- it('should start scheduler when enabled', () => {
388
- db.getStaleApprovals.mockReturnValue([]);
389
- db.getAllEscalationRules.mockReturnValue([]);
390
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: true });
391
- expect((0, manager_1.isSchedulerRunning)()).toBe(true);
392
- });
393
- it('should not start scheduler when disabled', () => {
394
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: false });
395
- expect((0, manager_1.isSchedulerRunning)()).toBe(false);
396
- });
397
- it('should stop scheduler', () => {
398
- db.getStaleApprovals.mockReturnValue([]);
399
- db.getAllEscalationRules.mockReturnValue([]);
400
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: true });
401
- expect((0, manager_1.isSchedulerRunning)()).toBe(true);
402
- (0, manager_1.stopEscalationScheduler)();
403
- expect((0, manager_1.isSchedulerRunning)()).toBe(false);
404
- });
405
- it('should check for stale approvals at regular intervals', () => {
406
- db.getStaleApprovals.mockReturnValue([]);
407
- db.getAllEscalationRules.mockReturnValue([]);
408
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: true });
409
- jest.advanceTimersByTime(60000);
410
- expect(db.getStaleApprovals).toHaveBeenCalled();
411
- jest.advanceTimersByTime(60000);
412
- expect(db.getStaleApprovals).toHaveBeenCalledTimes(2);
413
- (0, manager_1.stopEscalationScheduler)();
414
- });
415
- it('should prevent multiple scheduler instances', () => {
416
- db.getStaleApprovals.mockReturnValue([]);
417
- db.getAllEscalationRules.mockReturnValue([]);
418
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: true });
419
- const firstRunStatus = (0, manager_1.isSchedulerRunning)();
420
- (0, manager_1.startEscalationScheduler)({ interval_ms: 60000, enabled: true });
421
- expect((0, manager_1.isSchedulerRunning)()).toBe(firstRunStatus);
422
- (0, manager_1.stopEscalationScheduler)();
423
- });
424
- it('should handle scheduler errors gracefully', () => {
425
- db.getStaleApprovals.mockImplementation(() => {
426
- throw new Error('DB connection error');
427
- });
428
- const consoleSpy = jest.spyOn(console, 'error').mockImplementation();
429
- (0, manager_1.startEscalationScheduler)({ interval_ms: 1000, enabled: true });
430
- jest.advanceTimersByTime(1000);
431
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('[Escalation] Scheduler error'), expect.any(Error));
432
- (0, manager_1.stopEscalationScheduler)();
433
- consoleSpy.mockRestore();
434
- });
435
- });
436
- describe('Escalation Integration Scenarios', () => {
437
- it('should handle complete escalation flow: create -> decide -> allow rollback', () => {
438
- // Step 1: Create escalation request
439
- const staleApprovals = [
440
- { approval_request_id: 'apr-1', session_id: 'sess-1' },
441
- ];
442
- const rules = [
443
- {
444
- rule_id: 'rule-1',
445
- name: 'Default',
446
- description: '',
447
- timeout_hours: 2,
448
- escalation_targets: '["mgr-1", "mgr-2"]',
449
- created_at: new Date().toISOString(),
450
- created_by: 'admin',
451
- status: 'active',
452
- },
453
- ];
454
- db.getStaleApprovals.mockReturnValue(staleApprovals);
455
- db.getAllEscalationRules.mockReturnValue(rules);
456
- db.createEscalationRequest.mockReturnValue(undefined);
457
- const checkResult = (0, manager_1.checkAndEscalateStaleApprovals)();
458
- expect(checkResult.escalationsCreated).toHaveLength(1);
459
- // Step 2: Managers make decisions
460
- const escalationId = checkResult.escalationsCreated[0];
461
- const mockEscalation = {
462
- request_id: escalationId,
463
- approval_request_id: 'apr-1',
464
- session_id: 'sess-1',
465
- escalation_triggered_at: new Date().toISOString(),
466
- escalation_deadline: new Date(Date.now() + 7200000).toISOString(),
467
- escalation_targets: '["mgr-1", "mgr-2"]',
468
- status: 'pending',
469
- decided_at: null,
470
- decision: null,
471
- };
472
- db.getEscalationRequest.mockReturnValue(mockEscalation);
473
- db.getEscalationDecisions
474
- .mockReturnValueOnce([]) // First call (before any decisions)
475
- .mockReturnValueOnce([]) // Second call (before mgr-1's decision)
476
- .mockReturnValueOnce([
477
- // Third call (after both decisions)
478
- { target_id: 'mgr-1', decision: 'proceed' },
479
- { target_id: 'mgr-2', decision: 'proceed' },
480
- ]);
481
- db.submitEscalationDecision.mockReturnValue(undefined);
482
- (0, manager_1.submitEscalationDecision)(escalationId, 'mgr-1', 'proceed');
483
- (0, manager_1.submitEscalationDecision)(escalationId, 'mgr-2', 'proceed');
484
- // Step 3: Check if rollback can proceed
485
- db.getPendingEscalations.mockReturnValue([
486
- { request_id: escalationId, approval_request_id: 'apr-1', session_id: 'sess-1' },
487
- ]);
488
- const status = (0, manager_1.getEscalationStatus)(escalationId);
489
- expect(status.status).toBe('proceeded');
490
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
491
- expect(canProceed).toBe(true);
492
- });
493
- it('should block rollback when escalation is blocked', () => {
494
- const escalationId = 'esc-1';
495
- const mockEscalation = {
496
- request_id: escalationId,
497
- approval_request_id: 'apr-1',
498
- session_id: 'sess-1',
499
- escalation_triggered_at: new Date().toISOString(),
500
- escalation_deadline: new Date(Date.now() + 7200000).toISOString(),
501
- escalation_targets: '["mgr-1", "mgr-2"]',
502
- status: 'pending',
503
- decided_at: null,
504
- decision: null,
505
- };
506
- db.getEscalationRequest.mockReturnValue(mockEscalation);
507
- db.getEscalationDecisions.mockReturnValue([
508
- { target_id: 'mgr-1', decision: 'block', reason: 'needs more review' },
509
- ]);
510
- const status = (0, manager_1.getEscalationStatus)(escalationId);
511
- expect(status.status).toBe('blocked');
512
- db.getPendingEscalations.mockReturnValue([
513
- { request_id: escalationId, approval_request_id: 'apr-1', session_id: 'sess-1' },
514
- ]);
515
- const canProceed = (0, manager_1.canProceedWithRollbackAfterEscalation)('apr-1');
516
- expect(canProceed).toBe(false);
517
- });
518
- });
519
- });