@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
package/package.json
CHANGED
|
@@ -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
|
-
}
|