Skip to content

Commit b7e2332

Browse files
authored
Add 'toBeBetween', 'toBeAfterOrEqualTo' and 'toBeBeforeOrEqualTo' matchers. (#229)
1 parent a2904bd commit b7e2332

18 files changed

+388
-0
lines changed

README.md

+39
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ If you've come here to help contribute - Thanks! Take a look at the [contributin
6464
- [.toBeValidDate()](#tobevaliddate)
6565
- [.toBeAfter(date)](#tobeafterdate)
6666
- [.toBeBefore(date)](#tobebeforedate)
67+
- [.toBeAfterOrEqualTo(date)](#tobeafterorequaltodate)
68+
- [.toBeBeforeOrEqualTo(date)](#tobebeforeorequaltodate)
69+
- [.toBeBetween(startDate, endDate)](#tobebetweenstartdate-enddate)
6770
- Further proposals in [#117](https://github.com/jest-community/jest-extended/issues/117) PRs welcome
6871
- [Function](#function)
6972
- [.toBeFunction()](#tobefunction)
@@ -462,6 +465,42 @@ test('passes when input is before date', () => {
462465
});
463466
```
464467

468+
### .toBeAfterOrEqualTo(date)
469+
470+
Use `.toBeAfterOrEqualTo` when checking if a date equals to or occurs after `date`.
471+
472+
```js
473+
test('passes when input is equal to or after date', () => {
474+
expect(new Date('01/01/2019')).toBeAfterOrEqualTo(new Date('01/01/2018'));
475+
expect(new Date('01/01/2019')).toBeAfterOrEqualTo(new Date('01/01/2019'));
476+
expect('01/01/2018').not.toBeAfterOrEqualTo(new Date('01/01/2019'));
477+
});
478+
```
479+
480+
### .toBeBeforeOrEqualTo(date)
481+
482+
Use `.toBeBeforeOrEqualTo` when checking if a date equals to or occurs before `date`.
483+
484+
```js
485+
test('passes when input is equal to or before date', () => {
486+
expect(new Date('01/01/2018')).toBeBeforeOrEqualTo(new Date('01/01/2019'));
487+
expect(new Date('01/01/2018')).toBeBeforeOrEqualTo(new Date('01/01/2018'));
488+
expect('01/01/2019').not.toBeBeforeOrEqualTo(new Date('01/01/2018'));
489+
});
490+
```
491+
492+
### .toBeBetween(startDate, endDate)
493+
494+
Use `.toBeBetween` when checking if a date equals or occurs after `startDate` and equals or occurs before `endDate`.
495+
496+
```js
497+
test('passes when input is in given date range', () => {
498+
expect(new Date('05/01/2019')).toBeBetween(new Date('01/01/2019'), new Date('10/01/2019');
499+
expect(new Date('05/01/2019')).toBeBetween(new Date('05/01/2019'), new Date('10/01/2019');
500+
expect(new Date('01/01/2019')).not.toBeBetween(new Date('05/01/2019'), new Date('10/01/2019'));
501+
});
502+
```
503+
465504
### Function
466505
467506
#### .toBeFunction()

src/matchers/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
export { fail } from './fail';
22
export { pass } from './pass';
33
export { toBeAfter } from './toBeAfter';
4+
export { toBeAfterOrEqualTo } from './toBeAfterOrEqualTo';
45
export { toBeArray } from './toBeArray';
56
export { toBeArrayOfSize } from './toBeArrayOfSize';
67
export { toBeBefore } from './toBeBefore';
8+
export { toBeBeforeOrEqualTo } from './toBeBeforeOrEqualTo';
9+
export { toBeBetween } from './toBeBetween';
710
export { toBeBoolean } from './toBeBoolean';
811
export { toBeDate } from './toBeDate';
912
export { toBeDateString } from './toBeDateString';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`.not.toBeAfterOrEqualTo fails when given a later date 1`] = `
4+
"<dim>expect(</><red>received</><dim>).not.toBeAfterOrEqualTo()</>
5+
6+
Expected date to be after or equal to <red>2019-09-01T22:00:00.000Z</> but received:
7+
<red>2019-09-10T22:00:00.000Z</>"
8+
`;
9+
10+
exports[`.not.toBeAfterOrEqualTo fails when given an equal date 1`] = `
11+
"<dim>expect(</><red>received</><dim>).not.toBeAfterOrEqualTo()</>
12+
13+
Expected date to be after or equal to <red>2019-09-01T22:00:00.000Z</> but received:
14+
<red>2019-09-01T22:00:00.000Z</>"
15+
`;
16+
17+
exports[`.toBeAfterOrEqualTo fails when given an earlier date 1`] = `
18+
"<dim>expect(</><red>received</><dim>).toBeAfterOrEqualTo()</>
19+
20+
Expected date to be after or equal to <red>2019-09-10T22:00:00.000Z</> but received:
21+
<red>2019-09-01T22:00:00.000Z</>"
22+
`;
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { matcherHint, printReceived } from 'jest-matcher-utils';
2+
3+
import predicate from './predicate';
4+
5+
const passMessage = (received, before) => () =>
6+
matcherHint('.not.toBeAfterOrEqualTo', 'received', '') +
7+
'\n\n' +
8+
`Expected date to be after or equal to ${printReceived(before)} but received:\n` +
9+
` ${printReceived(received)}`;
10+
11+
const failMessage = (received, before) => () =>
12+
matcherHint('.toBeAfterOrEqualTo', 'received', '') +
13+
'\n\n' +
14+
`Expected date to be after or equal to ${printReceived(before)} but received:\n` +
15+
` ${printReceived(received)}`;
16+
17+
export function toBeAfterOrEqualTo(date, after) {
18+
const pass = predicate(date, after);
19+
if (pass) {
20+
return { pass: true, message: passMessage(date, after) };
21+
}
22+
23+
return { pass: false, message: failMessage(date, after) };
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as matcher from './';
2+
3+
expect.extend(matcher);
4+
5+
const EARLIER = new Date('2019-09-01T22:00:00.000Z');
6+
const LATER = new Date('2019-09-10T22:00:00.000Z');
7+
8+
describe('.toBeAfterOrEqualTo', () => {
9+
test('passes when given a later date', () => {
10+
expect(LATER).toBeAfterOrEqualTo(EARLIER);
11+
});
12+
13+
test('passes when given an equal date', () => {
14+
expect(EARLIER).toBeAfterOrEqualTo(EARLIER);
15+
});
16+
17+
test('fails when given an earlier date', () => {
18+
expect(() => {
19+
expect(EARLIER).toBeAfterOrEqualTo(LATER);
20+
}).toThrowErrorMatchingSnapshot();
21+
});
22+
});
23+
24+
describe('.not.toBeAfterOrEqualTo', () => {
25+
test('passes when given an earlier date', () => {
26+
expect(EARLIER).not.toBeAfterOrEqualTo(LATER);
27+
});
28+
29+
test('fails when given a later date', () => {
30+
expect(() => {
31+
expect(LATER).not.toBeAfterOrEqualTo(EARLIER);
32+
}).toThrowErrorMatchingSnapshot();
33+
});
34+
35+
test('fails when given an equal date', () => {
36+
expect(() => {
37+
expect(EARLIER).not.toBeAfterOrEqualTo(EARLIER);
38+
}).toThrowErrorMatchingSnapshot();
39+
});
40+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function toBeAfterOrEqualTo(date, after) {
2+
return date >= after;
3+
}
4+
5+
export default (date, after) => toBeAfterOrEqualTo(date, after);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import predicate from './predicate';
2+
3+
const EARLIER = new Date('01/09/2019');
4+
const LATER = new Date('07/09/2019');
5+
6+
describe('toBeAfterOrEqualTo Predicate', () => {
7+
test('returns true when given an earlier date', () => {
8+
expect(predicate(LATER, EARLIER)).toBe(true);
9+
});
10+
11+
test('returns true when given an equal date', () => {
12+
expect(predicate(EARLIER, EARLIER)).toBe(true);
13+
});
14+
15+
test('returns false when given a later date', () => {
16+
expect(predicate(EARLIER, LATER)).toBe(false);
17+
});
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`.not.toBeBeforeOrEqualTo fails when given an earlier date 1`] = `
4+
"<dim>expect(</><red>received</><dim>).not.toBeBeforeOrEqualTo()</>
5+
6+
Expected date to be before or equal to <red>2019-09-10T22:00:00.000Z</> but received:
7+
<red>2019-09-01T22:00:00.000Z</>"
8+
`;
9+
10+
exports[`.not.toBeBeforeOrEqualTo fails when given an equal date 1`] = `
11+
"<dim>expect(</><red>received</><dim>).not.toBeBeforeOrEqualTo()</>
12+
13+
Expected date to be before or equal to <red>2019-09-01T22:00:00.000Z</> but received:
14+
<red>2019-09-01T22:00:00.000Z</>"
15+
`;
16+
17+
exports[`.toBeBeforeOrEqualTo fails when given a later date 1`] = `
18+
"<dim>expect(</><red>received</><dim>).toBeBeforeOrEqualTo()</>
19+
20+
Expected date to be before or equal to <red>2019-09-01T22:00:00.000Z</> but received:
21+
<red>2019-09-10T22:00:00.000Z</>"
22+
`;
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { matcherHint, printReceived } from 'jest-matcher-utils';
2+
3+
import predicate from './predicate';
4+
5+
const passMessage = (received, before) => () =>
6+
matcherHint('.not.toBeBeforeOrEqualTo', 'received', '') +
7+
'\n\n' +
8+
`Expected date to be before or equal to ${printReceived(before)} but received:\n` +
9+
` ${printReceived(received)}`;
10+
11+
const failMessage = (received, before) => () =>
12+
matcherHint('.toBeBeforeOrEqualTo', 'received', '') +
13+
'\n\n' +
14+
`Expected date to be before or equal to ${printReceived(before)} but received:\n` +
15+
` ${printReceived(received)}`;
16+
17+
export function toBeBeforeOrEqualTo(date, before) {
18+
const pass = predicate(date, before);
19+
if (pass) {
20+
return { pass: true, message: passMessage(date, before) };
21+
}
22+
23+
return { pass: false, message: failMessage(date, before) };
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as matcher from './';
2+
3+
expect.extend(matcher);
4+
5+
const EARLIER = new Date('2019-09-01T22:00:00.000Z');
6+
const LATER = new Date('2019-09-10T22:00:00.000Z');
7+
8+
describe('.toBeBeforeOrEqualTo', () => {
9+
test('passes when given an earlier date', () => {
10+
expect(EARLIER).toBeBeforeOrEqualTo(LATER);
11+
});
12+
13+
test('passes when given an equal date', () => {
14+
expect(EARLIER).toBeBeforeOrEqualTo(EARLIER);
15+
});
16+
17+
test('fails when given a later date', () => {
18+
expect(() => {
19+
expect(LATER).toBeBeforeOrEqualTo(EARLIER);
20+
}).toThrowErrorMatchingSnapshot();
21+
});
22+
});
23+
24+
describe('.not.toBeBeforeOrEqualTo', () => {
25+
test('passes when given an earlier date', () => {
26+
expect(LATER).not.toBeBeforeOrEqualTo(EARLIER);
27+
});
28+
29+
test('fails when given an earlier date', () => {
30+
expect(() => {
31+
expect(EARLIER).not.toBeBeforeOrEqualTo(LATER);
32+
}).toThrowErrorMatchingSnapshot();
33+
});
34+
35+
test('fails when given an equal date', () => {
36+
expect(() => {
37+
expect(EARLIER).not.toBeBeforeOrEqualTo(EARLIER);
38+
}).toThrowErrorMatchingSnapshot();
39+
});
40+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function toBeBeforeOrEqualTo(date, before) {
2+
return date <= before;
3+
}
4+
5+
export default (date, before) => toBeBeforeOrEqualTo(date, before);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import predicate from './predicate';
2+
3+
const EARLIER = new Date('01/09/2019');
4+
const LATER = new Date('07/09/2019');
5+
6+
describe('toBeBeforeOrEqualTo Predicate', () => {
7+
test('returns true when given a later date', () => {
8+
expect(predicate(EARLIER, LATER)).toBe(true);
9+
});
10+
11+
test('returns true when given an equal date', () => {
12+
expect(predicate(EARLIER, EARLIER)).toBe(true);
13+
});
14+
15+
test('returns false when given an earlier date', () => {
16+
expect(predicate(LATER, EARLIER)).toBe(false);
17+
});
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`.not.toBeBefore fails when date is in given range 1`] = `
4+
"<dim>expect(</><red>received</><dim>).not.toBeBetween()</>
5+
6+
Expected date to be between <red>2019-09-01T22:00:00.000Z</> and <red>2019-09-10T22:00:00.000Z</> but received:
7+
<red>2019-09-03T22:00:00.000Z</>"
8+
`;
9+
10+
exports[`.toBeBetween fails when date is not in given range 1`] = `
11+
"<dim>expect(</><red>received</><dim>).toBeBetween()</>
12+
13+
Expected date to be between <red>2019-09-03T22:00:00.000Z</> and <red>2019-09-10T22:00:00.000Z</> but received:
14+
<red>2019-09-01T22:00:00.000Z</>"
15+
`;

src/matchers/toBeBetween/index.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { matcherHint, printReceived } from 'jest-matcher-utils';
2+
3+
import predicate from './predicate';
4+
5+
const passMessage = (received, startDate, endDate) => () =>
6+
matcherHint('.not.toBeBetween', 'received', '') +
7+
'\n\n' +
8+
`Expected date to be between ${printReceived(startDate)} and ${printReceived(endDate)} but received:\n` +
9+
` ${printReceived(received)}`;
10+
11+
const failMessage = (received, startDate, endDate) => () =>
12+
matcherHint('.toBeBetween', 'received', '') +
13+
'\n\n' +
14+
`Expected date to be between ${printReceived(startDate)} and ${printReceived(endDate)} but received:\n` +
15+
` ${printReceived(received)}`;
16+
17+
export function toBeBetween(date, startDate, endDate) {
18+
const pass = predicate(date, startDate, endDate);
19+
if (pass) {
20+
return { pass: true, message: passMessage(date, startDate, endDate) };
21+
}
22+
23+
return { pass: false, message: failMessage(date, startDate, endDate) };
24+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import * as matcher from './';
2+
3+
expect.extend(matcher);
4+
5+
const TESTDATE1 = new Date('2019-09-01T22:00:00.000Z');
6+
const TESTDATE2 = new Date('2019-09-10T22:00:00.000Z');
7+
const TESTDATE3 = new Date('2019-09-03T22:00:00.000Z');
8+
9+
describe('.toBeBetween', () => {
10+
test('passes when date is in given range', () => {
11+
expect(TESTDATE3).toBeBetween(TESTDATE1, TESTDATE2);
12+
});
13+
14+
test('fails when date is not in given range', () => {
15+
expect(() => {
16+
expect(TESTDATE1).toBeBetween(TESTDATE3, TESTDATE2);
17+
}).toThrowErrorMatchingSnapshot();
18+
});
19+
});
20+
21+
describe('.not.toBeBefore', () => {
22+
test('passes when date is not in given range', () => {
23+
expect(TESTDATE1).not.toBeBetween(TESTDATE3, TESTDATE2);
24+
});
25+
26+
test('fails when date is in given range', () => {
27+
expect(() => {
28+
expect(TESTDATE3).not.toBeBetween(TESTDATE1, TESTDATE2);
29+
}).toThrowErrorMatchingSnapshot();
30+
});
31+
});

src/matchers/toBeBetween/predicate.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function toBeBetween(date, startDate, endDate) {
2+
return date >= startDate && date <= endDate;
3+
}
4+
5+
export default (date, startDate, endDate) => toBeBetween(date, startDate, endDate);
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import predicate from './predicate';
2+
3+
const TESTDATE1 = new Date('01/09/2019');
4+
const TESTDATE2 = new Date('10/09/2019');
5+
const TESTDATE3 = new Date('03/09/2019');
6+
7+
describe('toBeBetween Predicate', () => {
8+
test('returns true when date is in given range', () => {
9+
expect(predicate(TESTDATE3, TESTDATE1, TESTDATE2)).toBe(true);
10+
});
11+
12+
test('returns false when date is not in given range', () => {
13+
expect(predicate(TESTDATE1, TESTDATE3, TESTDATE2)).toBe(false);
14+
});
15+
});

0 commit comments

Comments
 (0)