@aneuhold/core-ts-db-lib 2.0.73 → 2.0.75

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) [2024] [Anton G Neuhold Jr]
3
+ Copyright (c) [2025] [Anton G Neuhold Jr]
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@aneuhold/core-ts-db-lib",
3
3
  "author": "Anton G. Neuhold Jr.",
4
4
  "license": "MIT",
5
- "version": "2.0.73",
5
+ "version": "2.0.75",
6
6
  "description": "A core database library used for personal projects",
7
7
  "packageManager": "pnpm@10.11.1",
8
8
  "type": "module",
@@ -1,75 +0,0 @@
1
- import { beforeEach, describe, expect, it } from 'vitest';
2
- import Validate from './ValidateUtil.js';
3
-
4
- describe('Validate', () => {
5
- let errorsArray: string[];
6
- let parentObject: {
7
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
- testField?: any;
9
- };
10
-
11
- beforeEach(() => {
12
- errorsArray = [];
13
- parentObject = {};
14
- });
15
-
16
- it('should validate optional string', () => {
17
- const validate = new Validate(parentObject, errorsArray);
18
- parentObject.testField = 123;
19
- validate.optionalString('testField');
20
- expect(errorsArray).toContain('testField must be a string or undefined');
21
- errorsArray = [];
22
-
23
- parentObject.testField = 'test';
24
- validate.optionalString('testField');
25
- expect(errorsArray.length).toBe(0);
26
- });
27
-
28
- it('should validate optional number', () => {
29
- const validate = new Validate(parentObject, errorsArray);
30
- parentObject.testField = true;
31
- validate.optionalNumber('testField');
32
- expect(errorsArray).toContain('testField must be a number or undefined');
33
- errorsArray = [];
34
-
35
- parentObject.testField = 123;
36
- validate.optionalNumber('testField');
37
- expect(errorsArray.length).toBe(0);
38
- });
39
-
40
- it('should validate optional boolean', () => {
41
- const validate = new Validate(parentObject, errorsArray);
42
- parentObject.testField = 123;
43
- validate.optionalBoolean('testField');
44
- expect(errorsArray).toContain('testField must be a boolean or undefined');
45
- errorsArray = [];
46
-
47
- parentObject.testField = true;
48
- validate.optionalBoolean('testField');
49
- expect(errorsArray.length).toBe(0);
50
- });
51
-
52
- it('should validate optional array', () => {
53
- const validate = new Validate(parentObject, errorsArray);
54
- parentObject.testField = 123;
55
- validate.optionalArray('testField');
56
- expect(errorsArray).toContain('testField must be an array or undefined');
57
- errorsArray = [];
58
-
59
- parentObject.testField = [];
60
- validate.optionalArray('testField');
61
- expect(errorsArray.length).toBe(0);
62
- });
63
-
64
- it('should validate required object', () => {
65
- const validate = new Validate(parentObject, errorsArray);
66
- parentObject.testField = [];
67
- validate.object('testField', {});
68
- expect(errorsArray).toContain('testField must be an object');
69
- errorsArray = [];
70
-
71
- parentObject.testField = {};
72
- validate.object('testField', {});
73
- expect(errorsArray.length).toBe(0);
74
- });
75
- });
@@ -1,28 +0,0 @@
1
- import { ObjectId } from 'bson';
2
- import { describe, expect, it } from 'vitest';
3
- import DocumentService from './DocumentService.js';
4
-
5
- describe('DocumentService', () => {
6
- describe('deepCopy', () => {
7
- it('should return a deep copy of the object', () => {
8
- const obj = {
9
- id: new ObjectId(),
10
- a: 1,
11
- b: {
12
- c: 2
13
- }
14
- };
15
- const result = DocumentService.deepCopy(obj);
16
- expect(result).toEqual(obj);
17
- expect(typeof result.id === 'object').toBeTruthy();
18
- expect(result.id.toString()).toEqual(obj.id.toString());
19
- expect(result).not.toBe(obj);
20
- expect(result.b).toEqual(obj.b);
21
- expect(result.b).not.toBe(obj.b);
22
-
23
- // Change the original object and make sure the copy is not affected
24
- obj.b.c = 3;
25
- expect(result.b.c).toEqual(2);
26
- });
27
- });
28
- });
@@ -1,684 +0,0 @@
1
- import { ObjectId } from 'bson';
2
- import { describe, expect, it } from 'vitest';
3
- import DashboardTask from '../../../documents/dashboard/Task.js';
4
- import { DashboardTaskListFilterSettings } from '../../../embedded-types/dashboard/task/FilterSettings.js';
5
- import {
6
- RecurrenceBasis,
7
- RecurrenceEffect,
8
- RecurrenceFrequency,
9
- RecurrenceFrequencyType
10
- } from '../../../embedded-types/dashboard/task/RecurrenceInfo.js';
11
- import {
12
- DashboardTaskListSortSettings,
13
- DashboardTaskSortBy,
14
- DashboardTaskSortDirection
15
- } from '../../../embedded-types/dashboard/task/SortSettings.js';
16
- import { DashboardTagSettings } from '../../../embedded-types/dashboard/userConfig/Tags.js';
17
- import DashboardTaskService from './TaskService.js';
18
-
19
- describe('DashboardTaskService', () => {
20
- describe('getNextFrequencyDate', () => {
21
- it('should return a valid date for lastDayOfMonth', () => {
22
- const basisDate = new Date(2024, 0, 1);
23
- const frequency: RecurrenceFrequency = {
24
- type: RecurrenceFrequencyType.lastDayOfMonth
25
- };
26
- const result = DashboardTaskService.getNextFrequencyDate(
27
- basisDate,
28
- frequency
29
- );
30
- expect(result).toEqual(new Date(2024, 0, 31));
31
- });
32
-
33
- describe('every X time unit', () => {
34
- it('should return a valid date for every X Day', () => {
35
- const basisDate = new Date(2024, 0, 1);
36
- const frequency: RecurrenceFrequency = {
37
- type: RecurrenceFrequencyType.everyXTimeUnit,
38
- everyXTimeUnit: {
39
- timeUnit: 'day',
40
- x: 2
41
- }
42
- };
43
- const result = DashboardTaskService.getNextFrequencyDate(
44
- basisDate,
45
- frequency
46
- );
47
- expect(result).toEqual(new Date(2024, 0, 3));
48
- });
49
-
50
- it('should return a valid date for every X Week', () => {
51
- const basisDate = new Date(2024, 0, 1);
52
- const frequency: RecurrenceFrequency = {
53
- type: RecurrenceFrequencyType.everyXTimeUnit,
54
- everyXTimeUnit: {
55
- timeUnit: 'week',
56
- x: 2
57
- }
58
- };
59
- const result = DashboardTaskService.getNextFrequencyDate(
60
- basisDate,
61
- frequency
62
- );
63
- expect(result).toEqual(new Date(2024, 0, 15));
64
- });
65
-
66
- it('should return a valid date for every X Month', () => {
67
- const basisDate = new Date(2024, 0, 1);
68
- const frequency: RecurrenceFrequency = {
69
- type: RecurrenceFrequencyType.everyXTimeUnit,
70
- everyXTimeUnit: {
71
- timeUnit: 'month',
72
- x: 2
73
- }
74
- };
75
- const result = DashboardTaskService.getNextFrequencyDate(
76
- basisDate,
77
- frequency
78
- );
79
- expect(result).toEqual(new Date(2024, 2, 1));
80
- });
81
- });
82
-
83
- it('should return a valid date for weekDaySet', () => {
84
- const basisDate = new Date(2024, 0, 1);
85
- const frequency: RecurrenceFrequency = {
86
- type: RecurrenceFrequencyType.weekDaySet,
87
- weekDaySet: [0, 6]
88
- };
89
- const result = DashboardTaskService.getNextFrequencyDate(
90
- basisDate,
91
- frequency
92
- );
93
- expect(result).toEqual(new Date(2024, 0, 6));
94
- });
95
-
96
- describe('Every X Weekday of Month', () => {
97
- it('should return a valid date for every 2nd Sunday of Month', () => {
98
- const basisDate = new Date(2024, 0, 1);
99
- // Every second sunday
100
- const frequency: RecurrenceFrequency = {
101
- type: RecurrenceFrequencyType.everyXWeekdayOfMonth,
102
- everyXWeekdayOfMonth: {
103
- weekDay: 0,
104
- weekOfMonth: 2
105
- }
106
- };
107
- const result = DashboardTaskService.getNextFrequencyDate(
108
- basisDate,
109
- frequency
110
- );
111
- expect(result).toEqual(new Date(2024, 0, 14));
112
- });
113
-
114
- it('should return a valid date across year change', () => {
115
- const basisDate = new Date(2023, 11, 30);
116
- // Every 1st Saturday
117
- const frequency: RecurrenceFrequency = {
118
- type: RecurrenceFrequencyType.everyXWeekdayOfMonth,
119
- everyXWeekdayOfMonth: {
120
- weekDay: 6,
121
- weekOfMonth: 1
122
- }
123
- };
124
- const result = DashboardTaskService.getNextFrequencyDate(
125
- basisDate,
126
- frequency
127
- );
128
- expect(result).toEqual(new Date(2024, 0, 6));
129
- });
130
-
131
- it('should return a valid next date when the basis is the same as the recurrence', () => {
132
- const basisDate = new Date(2024, 0, 14);
133
- // Every second sunday
134
- const frequency: RecurrenceFrequency = {
135
- type: RecurrenceFrequencyType.everyXWeekdayOfMonth,
136
- everyXWeekdayOfMonth: {
137
- weekDay: 0,
138
- weekOfMonth: 2
139
- }
140
- };
141
- const result = DashboardTaskService.getNextFrequencyDate(
142
- basisDate,
143
- frequency
144
- );
145
- expect(result).toEqual(new Date(2024, 1, 11));
146
- });
147
- });
148
- });
149
-
150
- describe('updateDatesForRecurrence', () => {
151
- describe('Start date basis', () => {
152
- it('should update the start date correctly for a daily recurrence', () => {
153
- const task = new DashboardTask(new ObjectId());
154
- task.startDate = new Date(2024, 0, 1);
155
- task.recurrenceInfo = {
156
- frequency: {
157
- type: RecurrenceFrequencyType.everyXTimeUnit,
158
- everyXTimeUnit: {
159
- timeUnit: 'day',
160
- x: 1
161
- }
162
- },
163
- recurrenceBasis: RecurrenceBasis.startDate,
164
- recurrenceEffect: RecurrenceEffect.rollOnBasis
165
- };
166
- DashboardTaskService.updateDatesForRecurrence(task);
167
- expect(task.startDate).toEqual(new Date(2024, 0, 2));
168
- });
169
-
170
- it('should update the start date correctly for daily recurrence on subtask', () => {
171
- const task = new DashboardTask(new ObjectId());
172
- task.startDate = new Date(2024, 0, 8);
173
- task.dueDate = new Date(2024, 0, 13);
174
- task.recurrenceInfo = {
175
- frequency: {
176
- type: RecurrenceFrequencyType.everyXTimeUnit,
177
- everyXTimeUnit: {
178
- timeUnit: 'day',
179
- x: 1
180
- }
181
- },
182
- recurrenceBasis: RecurrenceBasis.startDate,
183
- recurrenceEffect: RecurrenceEffect.rollOnBasis
184
- };
185
- task.parentRecurringTaskInfo = {
186
- taskId: new ObjectId(),
187
- startDate: new Date(2024, 0, 1)
188
- };
189
- DashboardTaskService.updateDatesForRecurrence(task);
190
- expect(task.startDate).toEqual(new Date(2024, 0, 9));
191
- expect(task.dueDate).toEqual(new Date(2024, 0, 14));
192
- });
193
-
194
- it('should update the start date correctly for a weekly recurrence', () => {
195
- const task = new DashboardTask(new ObjectId());
196
- task.startDate = new Date(2024, 0, 1);
197
- task.recurrenceInfo = {
198
- frequency: {
199
- type: RecurrenceFrequencyType.everyXTimeUnit,
200
- everyXTimeUnit: {
201
- timeUnit: 'week',
202
- x: 1
203
- }
204
- },
205
- recurrenceBasis: RecurrenceBasis.startDate,
206
- recurrenceEffect: RecurrenceEffect.rollOnBasis
207
- };
208
- DashboardTaskService.updateDatesForRecurrence(task);
209
- expect(task.startDate).toEqual(new Date(2024, 0, 8));
210
- });
211
-
212
- it('should update the start and due date correctly for a weekDaySet reccurence', () => {
213
- const task = new DashboardTask(new ObjectId());
214
- task.startDate = new Date(2024, 0, 1, 11);
215
- task.dueDate = new Date(2024, 0, 4, 23, 59);
216
- task.recurrenceInfo = {
217
- frequency: {
218
- type: RecurrenceFrequencyType.weekDaySet,
219
- weekDaySet: [0, 5]
220
- },
221
- recurrenceBasis: RecurrenceBasis.startDate,
222
- recurrenceEffect: RecurrenceEffect.rollOnBasis
223
- };
224
- DashboardTaskService.updateDatesForRecurrence(task);
225
- expect(task.startDate).toEqual(new Date(2024, 0, 5, 11));
226
- expect(task.dueDate).toEqual(new Date(2024, 0, 8, 23, 59));
227
- });
228
-
229
- it('should update the start and due date correctly for a everyXWeekdayOfMonth reccurence', () => {
230
- const task = new DashboardTask(new ObjectId());
231
- task.startDate = new Date(2024, 0, 1, 11);
232
- task.dueDate = new Date(2024, 0, 4, 23, 59);
233
- task.recurrenceInfo = {
234
- frequency: {
235
- type: RecurrenceFrequencyType.everyXWeekdayOfMonth,
236
- everyXWeekdayOfMonth: {
237
- weekDay: 0,
238
- weekOfMonth: 1
239
- }
240
- },
241
- recurrenceBasis: RecurrenceBasis.startDate,
242
- recurrenceEffect: RecurrenceEffect.rollOnBasis
243
- };
244
- DashboardTaskService.updateDatesForRecurrence(task);
245
- expect(task.startDate).toEqual(new Date(2024, 0, 7, 11));
246
- expect(task.dueDate).toEqual(new Date(2024, 0, 10, 23, 59));
247
- });
248
- });
249
- });
250
-
251
- describe('getFilteredAndSortedTaskIds', () => {
252
- it('should return a list of tasks for a category', () => {
253
- // Setup
254
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
255
- setupSortAndFilterTest();
256
- tasksList[0].category = 'somethingelse';
257
-
258
- // Call
259
- const { filteredAndSortedIds: result } =
260
- DashboardTaskService.getFilteredAndSortedTaskIds(
261
- taskMap,
262
- 'default',
263
- filterSettings,
264
- sortSettings,
265
- tagSettings
266
- );
267
-
268
- // Assert
269
- expect(result.length).toBe(4);
270
- result.forEach((taskId) => {
271
- expect(taskMap[taskId].category).toBe('default');
272
- });
273
- });
274
-
275
- it('should return a sorted list of tasks by start date', () => {
276
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
277
- setupSortAndFilterTest();
278
- sortSettings.sortList.push({
279
- sortBy: DashboardTaskSortBy.startDate,
280
- sortDirection: DashboardTaskSortDirection.descending
281
- });
282
- const startDate1 = new Date(2024, 0, 3);
283
- const startDate2 = new Date(2024, 0, 2);
284
- const startDate3 = new Date(2024, 0, 1);
285
- tasksList[4].startDate = startDate1;
286
- tasksList[1].startDate = startDate2;
287
- tasksList[2].startDate = startDate3;
288
-
289
- const { filteredAndSortedIds: result } =
290
- DashboardTaskService.getFilteredAndSortedTaskIds(
291
- taskMap,
292
- 'default',
293
- filterSettings,
294
- sortSettings,
295
- tagSettings
296
- );
297
-
298
- expect(result.length).toBe(5);
299
- expect(taskMap[result[0]].startDate?.getTime()).toBe(
300
- startDate1.getTime()
301
- );
302
- expect(taskMap[result[1]].startDate?.getTime()).toBe(
303
- startDate2.getTime()
304
- );
305
- expect(taskMap[result[2]].startDate?.getTime()).toBe(
306
- startDate3.getTime()
307
- );
308
- });
309
-
310
- it('should return a sorted list of tasks by tags, when settings are provided', () => {
311
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
312
- setupSortAndFilterTest();
313
- sortSettings.sortList.push({
314
- sortBy: DashboardTaskSortBy.tags,
315
- sortDirection: DashboardTaskSortDirection.descending
316
- });
317
- tagSettings['tag1'] = {
318
- priority: 1
319
- };
320
- tagSettings['tag2'] = {
321
- priority: 2
322
- };
323
- tagSettings['tag3'] = {
324
- priority: 3
325
- };
326
- tasksList[4].tags = {
327
- [sortSettings.userId]: ['tag1', 'tag2']
328
- };
329
- tasksList[1].tags = {
330
- [sortSettings.userId]: ['tagWithoutPriority']
331
- };
332
- tasksList[2].tags = {
333
- [sortSettings.userId]: ['tag1', 'tag3']
334
- };
335
- tasksList[3].tags = {
336
- [sortSettings.userId]: ['tag1']
337
- };
338
-
339
- const { filteredAndSortedIds: result } =
340
- DashboardTaskService.getFilteredAndSortedTaskIds(
341
- taskMap,
342
- 'default',
343
- filterSettings,
344
- sortSettings,
345
- tagSettings
346
- );
347
-
348
- expect(result.length).toBe(5);
349
- expect(taskMap[result[0]].tags[sortSettings.userId]).toEqual([
350
- 'tag1',
351
- 'tag3'
352
- ]);
353
- expect(taskMap[result[1]].tags[sortSettings.userId]).toEqual([
354
- 'tag1',
355
- 'tag2'
356
- ]);
357
- expect(taskMap[result[2]].tags[sortSettings.userId]).toEqual(['tag1']);
358
- });
359
-
360
- it('should return a correct tag header map when sorting tags descending', () => {
361
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
362
- setupSortAndFilterTest(10);
363
- sortSettings.sortList.push({
364
- sortBy: DashboardTaskSortBy.tags,
365
- sortDirection: DashboardTaskSortDirection.descending
366
- });
367
- sortSettings.sortList.push({
368
- sortBy: DashboardTaskSortBy.title,
369
- sortDirection: DashboardTaskSortDirection.ascending
370
- });
371
- tagSettings.tag1 = {
372
- priority: 1
373
- };
374
- tagSettings.tag2 = {
375
- priority: 2
376
- };
377
- tagSettings.tag3 = {
378
- priority: 3
379
- };
380
- const task1 = tasksList[4];
381
- const task2 = tasksList[0];
382
- const task3 = tasksList[1];
383
- const task4 = tasksList[2];
384
- const task5 = tasksList[3];
385
- const task6 = tasksList[5];
386
- task1.tags = {
387
- [sortSettings.userId]: ['tag1', 'tag3']
388
- };
389
- task1.title = 'a';
390
- task2.tags = {
391
- [sortSettings.userId]: ['tag3']
392
- };
393
- task2.title = 'b';
394
- task3.tags = {
395
- [sortSettings.userId]: ['tag2', 'tag1']
396
- };
397
- task4.tags = {
398
- [sortSettings.userId]: ['tag1']
399
- };
400
- task5.tags = {
401
- [sortSettings.userId]: ['tagWithoutPriority']
402
- };
403
- task6.tags = {
404
- [sortSettings.userId]: ['tagWithoutPriority']
405
- };
406
-
407
- const { filteredAndSortedIds: sortedTaskIds } =
408
- DashboardTaskService.getFilteredAndSortedTaskIds(
409
- taskMap,
410
- 'default',
411
- filterSettings,
412
- sortSettings,
413
- tagSettings
414
- );
415
-
416
- expect(sortedTaskIds.length).toBe(10);
417
- expect(sortedTaskIds[0]).toBe(task1._id.toString());
418
- expect(sortedTaskIds[1]).toBe(task2._id.toString());
419
- expect(sortedTaskIds[2]).toBe(task3._id.toString());
420
- expect(sortedTaskIds[3]).toBe(task4._id.toString());
421
- expect(sortedTaskIds[4]).toBe(task5._id.toString());
422
-
423
- const result = DashboardTaskService.getTagHeaderMap(
424
- taskMap,
425
- sortedTaskIds,
426
- sortSettings.userId,
427
- tagSettings,
428
- 'No Priority',
429
- DashboardTaskSortDirection.descending
430
- );
431
-
432
- expect(Object.keys(result).length).toBe(4);
433
- expect(result[task1._id.toString()]).toBe('tag3');
434
- expect(result[task3._id.toString()]).toBe('tag2');
435
- expect(result[task4._id.toString()]).toBe('tag1');
436
- expect(result[task5._id.toString()]).toBe('No Priority');
437
- });
438
-
439
- it('should return a correct tag header map when sorting tags ascending', () => {
440
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
441
- setupSortAndFilterTest();
442
- sortSettings.sortList.push({
443
- sortBy: DashboardTaskSortBy.tags,
444
- sortDirection: DashboardTaskSortDirection.ascending
445
- });
446
- tagSettings.tag1 = {
447
- priority: 1
448
- };
449
- tagSettings.tag2 = {
450
- priority: 2
451
- };
452
- tagSettings.tag3 = {
453
- priority: 3
454
- };
455
- tagSettings.tag4 = {
456
- priority: 4
457
- };
458
- const task1 = tasksList[4];
459
- const task2 = tasksList[0];
460
- const task3 = tasksList[1];
461
- const task4 = tasksList[2];
462
- const task5 = tasksList[3];
463
- task1.tags = {
464
- [sortSettings.userId]: ['tagWithoutPriority', 'tag3']
465
- };
466
- task2.tags = {
467
- [sortSettings.userId]: ['tag3', 'tag4', 'tag1']
468
- };
469
- task3.tags = {
470
- [sortSettings.userId]: ['tag2']
471
- };
472
- task4.tags = {
473
- [sortSettings.userId]: ['tag3', 'tag4']
474
- };
475
- task5.tags = {
476
- [sortSettings.userId]: ['tag4']
477
- };
478
-
479
- const { filteredAndSortedIds: sortedTaskIds } =
480
- DashboardTaskService.getFilteredAndSortedTaskIds(
481
- taskMap,
482
- 'default',
483
- filterSettings,
484
- sortSettings,
485
- tagSettings
486
- );
487
-
488
- expect(sortedTaskIds.length).toBe(5);
489
- expect(sortedTaskIds[0]).toBe(task1._id.toString());
490
- expect(sortedTaskIds[1]).toBe(task2._id.toString());
491
- expect(sortedTaskIds[2]).toBe(task3._id.toString());
492
- expect(sortedTaskIds[3]).toBe(task4._id.toString());
493
- expect(sortedTaskIds[4]).toBe(task5._id.toString());
494
-
495
- const result = DashboardTaskService.getTagHeaderMap(
496
- taskMap,
497
- sortedTaskIds,
498
- sortSettings.userId,
499
- tagSettings,
500
- 'No Priority',
501
- DashboardTaskSortDirection.ascending
502
- );
503
-
504
- expect(Object.keys(result).length).toBe(5);
505
- expect(result[task1._id.toString()]).toBe('No Priority');
506
- expect(result[task2._id.toString()]).toBe('tag1');
507
- expect(result[task3._id.toString()]).toBe('tag2');
508
- expect(result[task4._id.toString()]).toBe('tag3');
509
- expect(result[task5._id.toString()]).toBe('tag4');
510
- });
511
-
512
- it('should return a sorted list of tasks by tags, start date, and title', () => {
513
- const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } =
514
- setupSortAndFilterTest(10);
515
- sortSettings.sortList.push(
516
- {
517
- sortBy: DashboardTaskSortBy.tags,
518
- sortDirection: DashboardTaskSortDirection.descending
519
- },
520
- {
521
- sortBy: DashboardTaskSortBy.startDate,
522
- sortDirection: DashboardTaskSortDirection.ascending
523
- },
524
- {
525
- sortBy: DashboardTaskSortBy.title,
526
- sortDirection: DashboardTaskSortDirection.ascending
527
- }
528
- );
529
- tagSettings.tag1 = {
530
- priority: 1
531
- };
532
- tagSettings.tag2 = {
533
- priority: 2
534
- };
535
-
536
- // Each task below should end up being sorted in that order.
537
- const task1 = tasksList[4];
538
- const task2 = tasksList[7];
539
- const task3 = tasksList[1];
540
- const task4 = tasksList[2];
541
- const task5 = tasksList[3];
542
- const task6 = tasksList[5];
543
-
544
- task1.tags = {
545
- [sortSettings.userId]: ['tag1', 'tag2']
546
- };
547
- task2.tags = {
548
- [sortSettings.userId]: ['tag1', 'tag2']
549
- };
550
- task3.tags = {
551
- [sortSettings.userId]: ['tag1']
552
- };
553
- task4.tags = {
554
- [sortSettings.userId]: ['tag1']
555
- };
556
- task5.tags = {
557
- [sortSettings.userId]: ['tag1']
558
- };
559
- task6.tags = {
560
- [sortSettings.userId]: ['tag1']
561
- };
562
- task1.startDate = new Date(2024, 0, 1);
563
- task2.startDate = new Date(2024, 0, 2);
564
- task3.startDate = new Date(2023, 0, 1);
565
- task4.startDate = new Date(2023, 0, 2);
566
- task5.startDate = new Date(2023, 0, 2);
567
- task6.startDate = new Date(2023, 0, 2);
568
- // The title shouldn't matter for the first two tasks, because the start
569
- // date should take precedence.
570
- task1.title = 'b';
571
- task2.title = 'a';
572
- task3.title = 'c';
573
- // Title only matters for the last 3 tasks
574
- task4.title = 'a';
575
- task5.title = 'b';
576
- task6.title = 'c';
577
-
578
- const { filteredAndSortedIds: result } =
579
- DashboardTaskService.getFilteredAndSortedTaskIds(
580
- taskMap,
581
- 'default',
582
- filterSettings,
583
- sortSettings,
584
- tagSettings
585
- );
586
-
587
- expect(result.length).toBe(10);
588
- expect(result[0]).toBe(task1._id.toString());
589
- expect(result[1]).toBe(task2._id.toString());
590
- expect(result[2]).toBe(task3._id.toString());
591
- expect(result[3]).toBe(task4._id.toString());
592
- expect(result[4]).toBe(task5._id.toString());
593
- expect(result[5]).toBe(task6._id.toString());
594
- });
595
- });
596
- });
597
-
598
- /**
599
- * Sets up the test environment for sorting and filtering tasks.
600
- *
601
- * @param numTasks - The number of tasks to create for the test.
602
- * @returns An object containing tasksList, taskMap, taskIds, filterSettings, sortSettings, and tagSettings.
603
- */
604
- function setupSortAndFilterTest(numTasks = 5) {
605
- const userId = new ObjectId();
606
- const tasksList = createTasksList(numTasks, userId);
607
- const taskMap = createTaskMapFromList(tasksList);
608
- const filterSettings = getFilterSettings(userId);
609
- const sortSettings = getSortSettings(userId);
610
- const tagSettings = {} as DashboardTagSettings;
611
- const taskIds = Object.keys(taskMap);
612
- return {
613
- tasksList,
614
- taskMap,
615
- taskIds,
616
- filterSettings,
617
- sortSettings,
618
- tagSettings
619
- };
620
- }
621
-
622
- /**
623
- * Creates a list of tasks for the given user.
624
- *
625
- * @param numTasks - The number of tasks to create.
626
- * @param userId - The ID of the user for whom the tasks are created.
627
- * @returns An array of DashboardTask objects.
628
- */
629
- function createTasksList(numTasks: number, userId: ObjectId): DashboardTask[] {
630
- const tasks: DashboardTask[] = [];
631
- for (let i = 0; i < numTasks; i += 1) {
632
- const task = new DashboardTask(userId);
633
- tasks.push(task);
634
- }
635
- return tasks;
636
- }
637
-
638
- /**
639
- * Creates a map of tasks from a list of tasks.
640
- *
641
- * @param tasks - The list of tasks to convert into a map.
642
- * @returns A map where the keys are task IDs and the values are DashboardTask objects.
643
- */
644
- function createTaskMapFromList(tasks: DashboardTask[]) {
645
- return tasks.reduce<Record<string, DashboardTask>>((acc, task) => {
646
- acc[task._id.toString()] = task;
647
- return acc;
648
- }, {});
649
- }
650
-
651
- /**
652
- * Gets the filter settings for the given user.
653
- *
654
- * @param userId - The ID of the user for whom the filter settings are retrieved.
655
- * @returns The filter settings for the user.
656
- */
657
- function getFilterSettings(userId: ObjectId): DashboardTaskListFilterSettings {
658
- return {
659
- userId: userId.toString(),
660
- completed: {
661
- show: true
662
- },
663
- grandChildrenTasks: {
664
- show: false
665
- },
666
- startDate: {
667
- showFutureTasks: true
668
- },
669
- tags: {}
670
- };
671
- }
672
-
673
- /**
674
- * Gets the sort settings for the given user.
675
- *
676
- * @param userId - The ID of the user for whom the sort settings are retrieved.
677
- * @returns The sort settings for the user.
678
- */
679
- function getSortSettings(userId: ObjectId): DashboardTaskListSortSettings {
680
- return {
681
- userId: userId.toString(),
682
- sortList: []
683
- };
684
- }