Skip to content

Commit 24e9099

Browse files
committed
Add toBeValidDate matcher
Issue: jest-community#117
1 parent aee660b commit 24e9099

File tree

10 files changed

+148
-17
lines changed

10 files changed

+148
-17
lines changed

.all-contributorsrc

+3-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,9 @@
277277
"avatar_url": "https://avatars2.githubusercontent.com/u/980783?v=4",
278278
"profile": "http://foss-geek.blogspot.com/",
279279
"contributions": [
280-
"code"
280+
"code",
281+
"test",
282+
"doc"
281283
]
282284
},
283285
{

README.md

+15
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ If you've come here to help contribute - Thanks! Take a look at the [contributin
5353
* [.toBeFalse()](#tobefalse)
5454
* [Date](#date)
5555
* [.toBeDate()](#tobedate)
56+
* [.toBeValidDate()](#tobevaliddate)
5657
* Further proposals in [#117](https://github.com/jest-community/jest-extended/issues/117) PRs welcome
5758
* [Function](#function)
5859
* [.toBeFunction()](#tobefunction)
@@ -332,6 +333,20 @@ test('passes when value is a date', () => {
332333
});
333334
```
334335
336+
### .toBeValidDate()
337+
338+
Use `.toBeValidDate` when checking if a given `Date` object is valid.
339+
340+
```
341+
test('passes when Date is valid', () => {
342+
expect(new Date()).toBeValidDate();
343+
expect('01/01/2018').not.toBeValidDate();
344+
expect(new Date('01/01/2018').toBeValidDate();
345+
expect(new Date('01/90/2018').not.toBeValidDate();
346+
expect(undefined).not.toBeValidDate();
347+
});
348+
```
349+
335350
### Function
336351
337352
#### .toBeFunction()

src/matchers/index.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import toBeEmpty from './toBeEmpty';
4343
import toBeSealed from './toBeSealed';
4444
import toIncludeRepeated from './toIncludeRepeated';
4545
import toHaveBeenCalledBefore from './toHaveBeenCalledBefore';
46+
import toBeValidDate from './toBeValidDate';
4647

4748
export default [
4849
toBeEven,
@@ -89,5 +90,6 @@ export default [
8990
toBeSealed,
9091
toSatisfy,
9192
toIncludeRepeated,
92-
toHaveBeenCalledBefore
93+
toHaveBeenCalledBefore,
94+
toBeValidDate
9395
].reduce((acc, matcher) => ({ ...acc, ...matcher }), {});

src/matchers/toBeDate/index.test.js

+6-13
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,12 @@ describe('.toBeDate', () => {
1515
});
1616

1717
describe('.not.toBeDate', () => {
18-
each([
19-
[false],
20-
[true],
21-
[0],
22-
[''],
23-
[{}],
24-
[() => {}],
25-
[undefined],
26-
[null],
27-
[NaN]
28-
]).test('passes when not given a date: %s', given => {
29-
expect(given).not.toBeDate();
30-
});
18+
each([[false], [true], [0], [''], [{}], [() => {}], [undefined], [null], [NaN]]).test(
19+
'passes when not given a date: %s',
20+
given => {
21+
expect(given).not.toBeDate();
22+
}
23+
);
3124

3225
test('fails when given a date', () => {
3326
expect(() => expect(new Date('2018-01-01T13:00:00.000Z')).not.toBeDate()).toThrowErrorMatchingSnapshot();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`.not.toBeValidDate fails when not given a valid date value 1`] = `
4+
"<dim>expect(</><red>received</><dim>).not.toBeValidDate(</><dim>)</>
5+
6+
Expected value to not be a valid date received:
7+
<red>2017-12-31T18:30:00.000Z</>"
8+
`;
9+
10+
exports[`.toBeValidDate fails when given an invalid date 1`] = `"Invalid time value"`;
11+
12+
exports[`.toBeValidDate fails when not given non-date values 1`] = `
13+
"<dim>expect(</><red>received</><dim>).toBeValidDate(</><dim>)</>
14+
15+
Expected value to be a valid date received:
16+
<red>1</>"
17+
`;

src/matchers/toBeValidDate/index.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { matcherHint, printReceived } from 'jest-matcher-utils';
2+
3+
import predicate from './predicate';
4+
5+
const passMessage = received => () =>
6+
matcherHint('.not.toBeValidDate', 'received', '') +
7+
'\n\n' +
8+
'Expected value to not be a valid date received:\n' +
9+
` ${printReceived(received)}`;
10+
11+
const failMessage = received => () =>
12+
matcherHint('.toBeValidDate', 'received', '') +
13+
'\n\n' +
14+
'Expected value to be a valid date received:\n' +
15+
` ${printReceived(received)}`;
16+
17+
export default {
18+
toBeValidDate: expected => {
19+
const pass = predicate(expected);
20+
if (pass) {
21+
return { pass: true, message: passMessage(expected) };
22+
}
23+
24+
return { pass: false, message: failMessage(expected) };
25+
}
26+
};
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import each from 'jest-each';
2+
3+
import matcher from './';
4+
5+
expect.extend(matcher);
6+
7+
describe('.toBeValidDate', () => {
8+
test('passes when given a valid date', () => {
9+
expect(new Date()).toBeValidDate();
10+
});
11+
12+
test('fails when given an invalid date', () => {
13+
expect(() => expect(new Date('01/90/2017')).toBeValidDate()).toThrowErrorMatchingSnapshot();
14+
});
15+
16+
test('fails when not given non-date values', () => {
17+
expect(() => expect(1).toBeValidDate()).toThrowErrorMatchingSnapshot();
18+
});
19+
});
20+
21+
describe('.not.toBeValidDate', () => {
22+
each([
23+
[new Date('01/90/2018')],
24+
[new Date('32/01/2018')],
25+
[false],
26+
[true],
27+
[0],
28+
[''],
29+
[{}],
30+
[() => {}],
31+
[undefined],
32+
[null],
33+
[NaN]
34+
]).test('passes when not given a date: %s', given => {
35+
expect(given).not.toBeValidDate();
36+
});
37+
38+
test('fails when not given a valid date value', () => {
39+
expect(() => expect(new Date('2018-01-01T13:00:00.000Z')).not.toBeValidDate()).toThrowErrorMatchingSnapshot();
40+
});
41+
});
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
let is = type => value => Object.prototype.toString.call(value) === `[object ${type}]`;
2+
3+
let hasDateType = is('Date');
4+
5+
let isValidDate = value => hasDateType(value) && !isNaN(value) && !isNaN(value.getTime());
6+
7+
export default expected => isValidDate(expected);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import each from 'jest-each';
2+
import predicate from './predicate';
3+
4+
describe('toBeDate Predicate', () => {
5+
test('returns true when given a valid date', () => {
6+
expect(predicate(new Date('12/25/2017'))).toBe(true);
7+
});
8+
9+
each([
10+
[new Date('01/90/2018')],
11+
[new Date('32/01/2018')],
12+
[true],
13+
[false],
14+
[''],
15+
[0],
16+
[{}],
17+
[() => {}],
18+
[undefined],
19+
[null],
20+
[NaN]
21+
]).test('returns false when given: %s', given => {
22+
expect(predicate(given)).toBe(false);
23+
});
24+
});

types/index.d.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,15 @@ declare namespace jest {
8686
toBeFalse(): R;
8787

8888
/**
89-
* Use .toBeDate when checking if a value is a Date.
89+
* Use `.toBeDate` when checking if a value is a `Date`.
9090
*/
9191
toBeDate(): R;
9292

93+
/**
94+
* Use `.toBeValidDate` when checking if a value is a `valid Date`.
95+
*/
96+
toBeValidDate(): R;
97+
9398
/**
9499
* Use `.toBeFunction` when checking if a value is a `Function`.
95100
*/
@@ -301,4 +306,3 @@ declare namespace jest {
301306
toIncludeMultiple(substring: string[]): R;
302307
}
303308
}
304-

0 commit comments

Comments
 (0)