From f10311b74734b32cb375409d96a09a70d08c16aa Mon Sep 17 00:00:00 2001 From: Tejas Bubane Date: Sat, 2 Jun 2018 22:11:20 +0530 Subject: [PATCH] Add toBeValidDate matcher Issue: #117 --- .all-contributorsrc | 4 ++- README.md | 15 +++++++++ src/matchers/index.js | 4 ++- .../__snapshots__/index.test.js.snap | 3 ++ src/matchers/toBeValidDate/index.js | 26 +++++++++++++++ src/matchers/toBeValidDate/index.test.js | 33 +++++++++++++++++++ src/matchers/toBeValidDate/predicate.js | 7 ++++ src/matchers/toBeValidDate/predicate.test.js | 24 ++++++++++++++ 8 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 src/matchers/toBeValidDate/__snapshots__/index.test.js.snap create mode 100644 src/matchers/toBeValidDate/index.js create mode 100644 src/matchers/toBeValidDate/index.test.js create mode 100644 src/matchers/toBeValidDate/predicate.js create mode 100644 src/matchers/toBeValidDate/predicate.test.js diff --git a/.all-contributorsrc b/.all-contributorsrc index a03ede10..eafb828e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -277,7 +277,9 @@ "avatar_url": "https://avatars2.githubusercontent.com/u/980783?v=4", "profile": "http://foss-geek.blogspot.com/", "contributions": [ - "code" + "code", + "test", + "doc" ] }, { diff --git a/README.md b/README.md index 3b17b5c8..d8e8d1aa 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ If you've come here to help contribute - Thanks! Take a look at the [contributin * [.toBeFalse()](#tobefalse) * [Date](#date) * [.toBeDate()](#tobedate) + * [.toBeValidDate()](#tobevaliddate) * Further proposals in [#117](https://github.com/jest-community/jest-extended/issues/117) PRs welcome * [Function](#function) * [.toBeFunction()](#tobefunction) @@ -332,6 +333,20 @@ test('passes when value is a date', () => { }); ``` +### .toBeValidDate() + +Use `.toBeValidDate` when checking if a given `Date` object is valid. + +``` +test('passes when Date is valid', () => { + expect(new Date()).toBeValidDate(); + expect('01/01/2018').not.toBeValidDate(); + expect(new Date('01/01/2018').toBeValidDate(); + expect(new Date('01/90/2018').not.toBeValidDate(); + expect(undefined).not.toBeValidDate(); +}); +``` + ### Function #### .toBeFunction() diff --git a/src/matchers/index.js b/src/matchers/index.js index 6231572e..c5de2ca9 100644 --- a/src/matchers/index.js +++ b/src/matchers/index.js @@ -43,6 +43,7 @@ import toBeEmpty from './toBeEmpty'; import toBeSealed from './toBeSealed'; import toIncludeRepeated from './toIncludeRepeated'; import toHaveBeenCalledBefore from './toHaveBeenCalledBefore'; +import toBeValidDate from './toBeValidDate'; export default [ toBeEven, @@ -89,5 +90,6 @@ export default [ toBeSealed, toSatisfy, toIncludeRepeated, - toHaveBeenCalledBefore + toHaveBeenCalledBefore, + toBeValidDate ].reduce((acc, matcher) => ({ ...acc, ...matcher }), {}); diff --git a/src/matchers/toBeValidDate/__snapshots__/index.test.js.snap b/src/matchers/toBeValidDate/__snapshots__/index.test.js.snap new file mode 100644 index 00000000..46623ffb --- /dev/null +++ b/src/matchers/toBeValidDate/__snapshots__/index.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`.toBeValidDate fails when not given an invalid date 1`] = `"Invalid time value"`; diff --git a/src/matchers/toBeValidDate/index.js b/src/matchers/toBeValidDate/index.js new file mode 100644 index 00000000..01c52566 --- /dev/null +++ b/src/matchers/toBeValidDate/index.js @@ -0,0 +1,26 @@ +import { matcherHint, printReceived } from 'jest-matcher-utils'; + +import predicate from './predicate'; + +const passMessage = received => () => + matcherHint('.not.toBeValidDate', 'received', '') + + '\n\n' + + 'Expected value to not be a valid date received:\n' + + ` ${printReceived(received)}`; + +const failMessage = received => () => + matcherHint('.toBeValidDate', 'received', '') + + '\n\n' + + 'Expected value to be a valid date received:\n' + + ` ${printReceived(received)}`; + +export default { + toBeValidDate: expected => { + const pass = predicate(expected); + if (pass) { + return { pass: true, message: passMessage(expected) }; + } + + return { pass: false, message: failMessage(expected) }; + } +}; diff --git a/src/matchers/toBeValidDate/index.test.js b/src/matchers/toBeValidDate/index.test.js new file mode 100644 index 00000000..6c6af913 --- /dev/null +++ b/src/matchers/toBeValidDate/index.test.js @@ -0,0 +1,33 @@ +import each from 'jest-each'; + +import matcher from './'; + +expect.extend(matcher); + +describe('.toBeValidDate', () => { + test('passes when given a valid date', () => { + expect(new Date()).toBeValidDate(); + }); + + test('fails when not given an invalid date', () => { + expect(() => expect(new Date('31/01/2018')).toBeValidDate()).toThrowErrorMatchingSnapshot(); + }); +}); + +describe('.not.toBeValidDate', () => { + each([ + [new Date('01/90/2018')], + [new Date('32/01/2018')], + [false], + [true], + [0], + [''], + [{}], + [() => {}], + [undefined], + [null], + [NaN] + ]).test('passes when not given a date: %s', given => { + expect(given).not.toBeValidDate(); + }); +}); diff --git a/src/matchers/toBeValidDate/predicate.js b/src/matchers/toBeValidDate/predicate.js new file mode 100644 index 00000000..f345f26c --- /dev/null +++ b/src/matchers/toBeValidDate/predicate.js @@ -0,0 +1,7 @@ +let is = type => value => Object.prototype.toString.call(value) === `[object ${type}]`; + +let hasDateType = is('Date'); + +let isValidDate = value => hasDateType(value) && !isNaN(value) && !isNaN(value.getTime()); + +export default expected => isValidDate(expected); diff --git a/src/matchers/toBeValidDate/predicate.test.js b/src/matchers/toBeValidDate/predicate.test.js new file mode 100644 index 00000000..e789dd62 --- /dev/null +++ b/src/matchers/toBeValidDate/predicate.test.js @@ -0,0 +1,24 @@ +import each from 'jest-each'; +import predicate from './predicate'; + +describe('toBeDate Predicate', () => { + test('returns true when given a valid date', () => { + expect(predicate(new Date('12/25/2017'))).toBe(true); + }); + + each([ + [new Date('01/90/2018')], + [new Date('32/01/2018')], + [true], + [false], + [''], + [0], + [{}], + [() => {}], + [undefined], + [null], + [NaN] + ]).test('returns false when given: %s', given => { + expect(predicate(given)).toBe(false); + }); +});