Skip to content

Commit 3156647

Browse files
authored
test: Add jest custom matcher toEqualMoment() (#1980)
* test: Add toBeSameMoment() custom matcher * test: Rework tests to use toBeSameMoment() custom matcher To give meaningful output upon test failure * test: Rework tests to use toBeSameMoment() custom matcher To give meaningful output upon test failure * test: .not.toBeSameMoment() now gives meaningful message * test: Extract variables in toBeSameMoment() before adding support for received being null * test: toBeSameMoment() is now useful if received "date" is null * test: Simplify moment test, now that toBeSameMoment() handles nulls * test: Rename toBeSameMoment() to toEqualMoment()
1 parent f3e4760 commit 3156647

File tree

5 files changed

+62
-42
lines changed

5 files changed

+62
-42
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type moment from 'moment';
2+
import { diff } from 'jest-diff';
3+
4+
declare global {
5+
namespace jest {
6+
interface Matchers<R> {
7+
toEqualMoment(expected: moment.Moment): CustomMatcherResult;
8+
}
9+
}
10+
}
11+
12+
// Based on https://stackoverflow.com/a/60229956/104370
13+
export function toEqualMoment(received: moment.Moment | null, expected: moment.Moment): jest.CustomMatcherResult {
14+
const pass: boolean = expected.isSame(received);
15+
const expectedAsText = expected.toISOString();
16+
const receivedAsText = received ? received.toISOString() : 'null';
17+
const message: () => string = () =>
18+
pass
19+
? `Received moment should not be ${expectedAsText}`
20+
: `Received moment is not the same as expected: ${diff(expectedAsText, receivedAsText)}`;
21+
22+
return {
23+
message,
24+
pass,
25+
};
26+
}

tests/CustomMatchers/jest.custom_matchers.setup.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
// ---------------------------------------------------------------------
2+
// CustomMatchersForDates
3+
// ---------------------------------------------------------------------
4+
import { toEqualMoment } from './CustomMatchersForDates';
5+
expect.extend({
6+
toEqualMoment,
7+
});
8+
19
// ---------------------------------------------------------------------
210
// CustomMatchersForFilters
311
// ---------------------------------------------------------------------

tests/DateFallback.test.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ describe('extract date from filename', () => {
172172

173173
// Assert
174174
if (testCase.expectedDate !== null) {
175-
expect(parsedDate).not.toBeNull();
176-
expect(parsedDate!.isSame(date(testCase.expectedDate))).toStrictEqual(true);
175+
expect(parsedDate).toEqualMoment(moment(testCase.expectedDate));
177176
} else {
178177
expect(parsedDate).toBeNull();
179178
}
@@ -208,8 +207,7 @@ describe('parse task with date fallback', () => {
208207
const task = constructTaskFromLine(line, '2022-10-22');
209208

210209
// Assert
211-
expect(task!.scheduledDate).not.toBeNull();
212-
expect(task!.scheduledDate!.isSame(date('2022-10-22'))).toStrictEqual(true);
210+
expect(task!.scheduledDate).toEqualMoment(moment('2022-10-22'));
213211
expect(task!.scheduledDateIsInferred).toBe(true);
214212
});
215213

@@ -245,8 +243,7 @@ describe('parse task with date fallback', () => {
245243
const task = constructTaskFromLine(line, '2022-10-22');
246244

247245
// Assert
248-
expect(task!.scheduledDate).not.toBeNull();
249-
expect(task!.scheduledDate!.isSame(date('2022-11-22'))).toStrictEqual(true);
246+
expect(task!.scheduledDate).toEqualMoment(moment('2022-11-22'));
250247
expect(task!.scheduledDateIsInferred).toBe(false);
251248
});
252249

@@ -258,8 +255,7 @@ describe('parse task with date fallback', () => {
258255
const task = constructTaskFromLine(line, '2022-10-22');
259256

260257
// Assert
261-
expect(task!.scheduledDate).not.toBeNull();
262-
expect(task!.scheduledDate!.isSame(date('2022-10-22'))).toStrictEqual(true);
258+
expect(task!.scheduledDate).toEqualMoment(moment('2022-10-22'));
263259
expect(task!.scheduledDateIsInferred).toBe(true);
264260
});
265261

@@ -285,8 +281,7 @@ describe('parse task with date fallback', () => {
285281

286282
// Assert
287283
expect(toggled.scheduledDateIsInferred).toBe(true);
288-
expect(toggled.scheduledDate).not.toBeNull();
289-
expect(toggled.scheduledDate!.isSame(date('2022-10-22'))).toStrictEqual(true);
284+
expect(toggled.scheduledDate).toEqualMoment(moment('2022-10-22'));
290285
expect(toggled.toFileLineString()).toBe('- [ ] this is a task');
291286
});
292287
});
@@ -376,7 +371,8 @@ describe('update fallback date when path is changed', () => {
376371
if (expectedScheduledDate === null) {
377372
expect(updatedTask.scheduledDate).toBeNull();
378373
} else {
379-
expect(updatedTask.scheduledDate!.isSame(expectedScheduledDate)).toStrictEqual(true);
374+
expect(updatedTask.scheduledDate).toEqualMoment(expectedScheduledDate);
375+
true;
380376
}
381377

382378
expect(updatedTask.scheduledDateIsInferred).toBe(expectedIsInferred);

tests/Recurrence.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe('Recurrence', () => {
4444
// Assert
4545
expect(next!.startDate).toBeNull();
4646
expect(next!.scheduledDate).toBeNull();
47-
expect(next!.dueDate!.isSame(moment('2022-02-28'))).toStrictEqual(true);
47+
expect(next!.dueDate).toEqualMoment(moment('2022-02-28'));
4848
});
4949

5050
it('creates a recurrence 3 months in', () => {
@@ -62,7 +62,7 @@ describe('Recurrence', () => {
6262
// Assert
6363
expect(next!.startDate).toBeNull();
6464
expect(next!.scheduledDate).toBeNull();
65-
expect(next!.dueDate!.isSame(moment('2022-04-30'))).toStrictEqual(true);
65+
expect(next!.dueDate).toEqualMoment(moment('2022-04-30'));
6666
});
6767

6868
it('creates a recurrence the next month, even across years', () => {
@@ -80,7 +80,7 @@ describe('Recurrence', () => {
8080
// Assert
8181
expect(next!.startDate).toBeNull();
8282
expect(next!.scheduledDate).toBeNull();
83-
expect(next!.dueDate!.isSame(moment('2024-02-29'))).toStrictEqual(true);
83+
expect(next!.dueDate).toEqualMoment(moment('2024-02-29'));
8484
});
8585

8686
it('creates a recurrence in 2 years, even on Feb 29th', () => {
@@ -98,7 +98,7 @@ describe('Recurrence', () => {
9898
// Assert
9999
expect(next!.startDate).toBeNull();
100100
expect(next!.scheduledDate).toBeNull();
101-
expect(next!.dueDate!.isSame(moment('2026-02-28'))).toStrictEqual(true);
101+
expect(next!.dueDate).toEqualMoment(moment('2026-02-28'));
102102
});
103103

104104
it('creates a recurrence in 11 months, even on March 31', () => {
@@ -116,7 +116,7 @@ describe('Recurrence', () => {
116116
// Assert
117117
expect(next!.startDate).toBeNull();
118118
expect(next!.scheduledDate).toBeNull();
119-
expect(next!.dueDate!.isSame(moment('2021-02-28'))).toStrictEqual(true);
119+
expect(next!.dueDate).toEqualMoment(moment('2021-02-28'));
120120
});
121121

122122
it('creates a recurrence in 13 months, even on Jan 31', () => {
@@ -134,7 +134,7 @@ describe('Recurrence', () => {
134134
// Assert
135135
expect(next!.startDate).toBeNull();
136136
expect(next!.scheduledDate).toBeNull();
137-
expect(next!.dueDate!.isSame(moment('2021-02-28'))).toStrictEqual(true);
137+
expect(next!.dueDate).toEqualMoment(moment('2021-02-28'));
138138
});
139139
});
140140

@@ -178,8 +178,8 @@ describe('Recurrence - with invalid dates in tasks', () => {
178178
// The original scheduled date was an illegal/invalid date.
179179
// So it is simply given the new value of the same date as the reference date,
180180
// which here is the due date.
181-
expect(next!.scheduledDate!.isSame(moment('2022-02-28'))).toStrictEqual(true); // date was invalid, so is given the value of highst oriority supplied date
182-
expect(next!.dueDate!.isSame(moment('2022-02-28'))).toStrictEqual(true);
181+
expect(next!.scheduledDate).toEqualMoment(moment('2022-02-28')); // date was invalid, so is given the value of highest priority supplied date
182+
expect(next!.dueDate).toEqualMoment(moment('2022-02-28'));
183183
});
184184
});
185185

tests/Task.test.ts

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,9 @@ describe('parsing', () => {
3131
expect(task!.listMarker).toEqual('-');
3232
expect(task!.description).toEqual('this is a done task');
3333
expect(task!.status).toStrictEqual(Status.DONE);
34-
expect(task!.createdDate).not.toBeNull();
35-
expect(task!.createdDate!.isSame(moment('2023-03-07', 'YYYY-MM-DD'))).toStrictEqual(true);
36-
expect(task!.dueDate).not.toBeNull();
37-
expect(task!.dueDate!.isSame(moment('2021-09-12', 'YYYY-MM-DD'))).toStrictEqual(true);
38-
expect(task!.doneDate).not.toBeNull();
39-
expect(task!.doneDate!.isSame(moment('2021-06-20', 'YYYY-MM-DD'))).toStrictEqual(true);
34+
expect(task!.createdDate).toEqualMoment(moment('2023-03-07'));
35+
expect(task!.dueDate).toEqualMoment(moment('2021-09-12'));
36+
expect(task!.doneDate).toEqualMoment(moment('2021-06-20'));
4037
expect(task!.originalMarkdown).toStrictEqual(line);
4138
expect(task!.lineNumber).toEqual(0);
4239
});
@@ -132,10 +129,8 @@ describe('parsing', () => {
132129
expect(task).not.toBeNull();
133130
expect(task!.description).toEqual('this is a ✅ done task');
134131
expect(task!.status).toStrictEqual(Status.DONE);
135-
expect(task!.dueDate).not.toBeNull();
136-
expect(task!.dueDate!.isSame(moment('2021-09-12', 'YYYY-MM-DD'))).toStrictEqual(true);
137-
expect(task!.doneDate).not.toBeNull();
138-
expect(task!.doneDate!.isSame(moment('2021-06-20', 'YYYY-MM-DD'))).toStrictEqual(true);
132+
expect(task!.dueDate).toEqualMoment(moment('2021-09-12'));
133+
expect(task!.doneDate).toEqualMoment(moment('2021-06-20'));
139134
});
140135
// end-snippet
141136

@@ -152,10 +147,8 @@ describe('parsing', () => {
152147
expect(task).not.toBeNull();
153148
expect(task!.description).toEqual('this is a ✅ done task');
154149
expect(task!.status).toStrictEqual(Status.DONE);
155-
expect(task!.dueDate).not.toBeNull();
156-
expect(task!.dueDate!.isSame(moment('2021-09-12', 'YYYY-MM-DD'))).toStrictEqual(true);
157-
expect(task!.doneDate).not.toBeNull();
158-
expect(task!.doneDate!.isSame(moment('2021-06-20', 'YYYY-MM-DD'))).toStrictEqual(true);
150+
expect(task!.dueDate).toEqualMoment(moment('2021-09-12'));
151+
expect(task!.doneDate).toEqualMoment(moment('2021-06-20'));
159152
expect(task!.blockLink).toEqual(' ^my-precious');
160153
});
161154

@@ -172,8 +165,7 @@ describe('parsing', () => {
172165
expect(task).not.toBeNull();
173166
expect(task!.description).toEqual('this is a task due #inside_tag #some/tags_with_underscore');
174167
expect(task!.tags).toEqual(['#inside_tag', '#some/tags_with_underscore']);
175-
expect(task!.dueDate).not.toBeNull();
176-
expect(task!.dueDate!.isSame(moment('2021-09-12', 'YYYY-MM-DD'))).toEqual(true);
168+
expect(task!.dueDate).toEqualMoment(moment('2021-09-12'));
177169
expect(task!.priority).toEqual(Priority.High);
178170
});
179171

@@ -190,10 +182,10 @@ describe('parsing', () => {
190182
// Assert
191183
expect(task).not.toBeNull();
192184
expect(task!.description).toEqual('Wobble #tag1 #tag2 #tag3 #tag4 #tag5 #tag6 #tag7 #tag8 #tag9 #tag10');
193-
expect(task!.dueDate!.isSame(moment('2022-07-02', 'YYYY-MM-DD'))).toEqual(true);
194-
expect(task!.doneDate!.isSame(moment('2022-07-02', 'YYYY-MM-DD'))).toEqual(true);
195-
expect(task!.startDate!.isSame(moment('2022-07-02', 'YYYY-MM-DD'))).toEqual(true);
196-
expect(task!.scheduledDate!.isSame(moment('2022-07-02', 'YYYY-MM-DD'))).toEqual(true);
185+
expect(task!.dueDate).toEqualMoment(moment('2022-07-02'));
186+
expect(task!.doneDate).toEqualMoment(moment('2022-07-02'));
187+
expect(task!.startDate).toEqualMoment(moment('2022-07-02'));
188+
expect(task!.scheduledDate).toEqualMoment(moment('2022-07-02'));
197189
expect(task!.priority).toEqual(Priority.High);
198190
expect(task!.tags).toStrictEqual([
199191
'#tag1',
@@ -594,7 +586,6 @@ describe('toggle done', () => {
594586
// Assert
595587
expect(toggled).not.toBeNull();
596588
expect(toggled!.status).toStrictEqual(Status.DONE);
597-
expect(toggled!.doneDate).not.toBeNull();
598589
expect(toggled!.status.symbol).toStrictEqual('x');
599590
expect(toggled!.blockLink).toEqual(' ^my-precious');
600591
});
@@ -1000,8 +991,7 @@ describe('toggle done', () => {
1000991

1001992
// Assert
1002993
expect(task).not.toBeNull();
1003-
expect(task!.dueDate).not.toBeNull();
1004-
expect(task!.dueDate!.isSame(moment('2021-09-12', 'YYYY-MM-DD'))).toStrictEqual(true);
994+
expect(task!.dueDate).toEqualMoment(moment('2021-09-12'));
1005995

1006996
const tasks = task!.toggle();
1007997
expect(tasks.length).toEqual(2);

0 commit comments

Comments
 (0)