npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

jest-date

v1.1.6

Published

Custom jest matchers to test dates

Downloads

46,568

Readme


version downloads

Watch on GitHub Star on GitHub

The problem

You want to use jest to write tests that assert how dates compare to eachother. As part of that goal, you want to avoid all the repetitive patterns that arise in doing so and you want to get valueable feedback when tests fail.

This solution

The jest-date library provides a set of custom jest matchers that you can use to extend jest. These will make your tests more declarative, clear to read and to maintain. Next to that, it will give you valueable information as to why your test are failing.

Table of Contents

Installation

This module is distributed via npm which is bundled with node and should be installed as one of your project's devDependencies:

npm install --save-dev jest-date

Usage

Import jest-date once (for instance in your tests setup file) and you're good to go:

import 'jest-date'

Note: If you're using TypeScript, make sure your setup file is a .ts and not a .js to include the necessary types.

Alternatively, you can selectively import only the matchers you intend to use, and extend jest's expect yourself:

import {
  toBeBefore,
  toBeSameMonthAs,
} from 'jest-date/matchers'

expect.extend({toBeBefore, toBeSameMonthAs})

Note: when using TypeScript, this way of importing matchers won't provide the necessary type definitions.

Matcher types

Relative matchers

Relative matchers can be used to compare two dates with eachother. When a matcher fails, it will provide a debug message in the following format:

Expected date {expected_date} {matcher} {received_date}, but it was {difference}.

Here are some concrete examples:

toBeSameSecondAs: Expected date 2020-07-13T22:05:23.670Z to be same second as 2020-07-13T22:05:22.670Z, but it was 1 second after.

toBeBefore: Expected date 1970-01-01T00:00:00.000Z not to be before 2020-01-01T00:00:00.000Z, but it was 50 years before.

toBeSameQuarterAs: Expected date 2020-10-13T22:15:12.304Z to be same quarter as 2020-07-13T22:15:12.304Z, but it was 3 months after.

Weekday matchers

Weekday matchers can be used to check if a given date falls on a certain day of the week. When this kind of a matcher fails, it will provide a debug message in either the following formats:

Standard Message: Expected date {received} to be on a {expected_day}, but it was on a {actual_day}.

Inverted Message: Expected date {received} not be on a {expected_day}, but it was

Here are some concrete examples:

toBeMonday: Expected date 2020-07-13T22:25:43.553Z to be on a monday, but it was on a tuesday.

toBeSunday: Expected date 2020-07-11T22:26:33.626Z not to be on a sunday, but it was.

Custom matchers

jest-date can work with any library or framework. The custom matcher examples below are written using functions from the awesome date-fns library (e.g. isBefore, isSameDayAs, formatDistance, etc.)

toBeBefore

Matcher type: relative

toBeBefore(date: Date)

This allows you to check whether a date is before another.

Examples

expect(new Date('1970')).toBeBefore(new Date('2020')) // ✔️ pass
expect(new Date('2020')).toBeBefore(new Date('1970')) // ❌ fail

expect(new Date('1970')).not.toBeBefore(new Date('2020')) // ❌ fail
expect(new Date('2020')).not.toBeBefore(new Date('1970')) // ✔️ pass

toBeAfter

Matcher type: relative

toBeAfter(date: Date)

This allows you to check whether a date is after another.

Examples

expect(new Date('2020')).toBeAfter(new Date('1970')) // ✔️ pass
expect(new Date('1970')).toBeAfter(new Date('2020')) // ❌ fail

expect(new Date('2020')).not.toBeAfter(new Date('1970')) // ❌ fail
expect(new Date('1970')).not.toBeAfter(new Date('2020')) // ✔️ pass

toBeSameSecondAs

Matcher type: relative

toBeSameSecondAs(date: Date)

This allows you to check whether a date is in the same second as another.

Examples

import {startOfSecond, addSeconds} from 'date-fns'

const date = new Date()

expect(startOfSecond(date)).toBeSameSecondAs(date) // ✔️ pass
expect(addSeconds(date, 2)).toBeSameSecondAs(date) // ❌ fail

expect(startOfSecond(date)).not.toBeSameSecondAs(date) // ❌ fail
expect(addSeconds(date, 2)).not.toBeSameSecondAs(date) // ✔️ pass

toBeSameMinuteAs

Matcher type: relative

toBeSameMinuteAs(date: Date)

This allows you to check whether a date is in the same minute as another.

Examples

import {startOfMinute, addMinutes} from 'date-fns'

const date = new Date()

expect(startOfMinute(date)).toBeSameMinuteAs(date) // ✔️ pass
expect(addMinutes(date, 2)).toBeSameMinuteAs(date) // ❌ fail

expect(startOfMinute(date)).not.toBeSameMinuteAs(date) // ❌ fail
expect(addMinutes(date, 2)).not.toBeSameMinuteAs(date) // ✔️ pass

toBeSameHourAs

Matcher type: relative

toBeSameHourAs(date: Date)

This allows you to check whether a date is in the same hour as another.

Examples

import {startOfHour, addHours} from 'date-fns'

const date = new Date()

expect(startOfHour(date)).toBeSameHourAs(date) // ✔️ pass
expect(addHours(date, 2)).toBeSameHourAs(date) // ❌ fail

expect(startOfHour(date)).not.toBeSameHourAs(date) // ❌ fail
expect(addHours(date, 2)).not.toBeSameHourAs(date) // ✔️ pass

toBeSameDayAs

Matcher type: relative

toBeSameDayAs(date: Date)

This allows you to check whether a date is in the same day as another.

Examples

import {startOfDay, addDays} from 'date-fns'

const date = new Date()

expect(startOfDay(date)).toBeSameDayAs(date) // ✔️ pass
expect(addDays(date, 2)).toBeSameDayAs(date) // ❌ fail

expect(startOfDay(date)).not.toBeSameDayAs(date) // ❌ fail
expect(addDays(date, 2)).not.toBeSameDayAs(date) // ✔️ pass

toBeSameWeekAs

Matcher type: relative

toBeSameWeekAs(date: Date)

This allows you to check whether a date is in the same week as another.

Examples

import {startOfWeek, addWeeks} from 'date-fns'

const date = new Date()

expect(startOfWeek(date)).toBeSameWeekAs(date) // ✔️ pass
expect(addWeeks(date, 2)).toBeSameWeekAs(date) // ❌ fail

expect(startOfWeek(date)).not.toBeSameWeekAs(date) // ❌ fail
expect(addWeeks(date, 2)).not.toBeSameWeekAs(date) // ✔️ pass

toBeSameMonthAs

Matcher type: relative

toBeSameMonthAs(date: Date)

This allows you to check whether a date is in the same month as another.

Examples

import {startOfMonth, addMonths} from 'date-fns'

const date = new Date()

expect(startOfMonth(date)).toBeSameMonthAs(date) // ✔️ pass
expect(addMonths(date, 2)).toBeSameMonthAs(date) // ❌ fail

expect(startOfMonth(date)).not.toBeSameMonthAs(date) // ❌ fail
expect(addMonths(date, 2)).not.toBeSameMonthAs(date) // ✔️ pass

toBeSameQuarterAs

Matcher type: relative

toBeSameQuarterAs(date: Date)

This allows you to check whether a date is in the same quarter as another.

Examples

import {startOfQuarter, addQuarters} from 'date-fns'

const date = new Date()

expect(startOfQuarter(date)).toBeSameQuarterAs(date) // ✔️ pass
expect(addQuarters(date, 2)).toBeSameQuarterAs(date) // ❌ fail

expect(startOfQuarter(date)).not.toBeSameQuarterAs(date) // ❌ fail
expect(addQuarters(date, 2)).not.toBeSameQuarterAs(date) // ✔️ pass

toBeSameYearAs

Matcher type: relative

toBeSameYearAs(date: Date)

This allows you to check whether a date is in the same year as another.

Examples

import {startOfYear, addYears} from 'date-fns'

const date = new Date()

expect(startOfYear(date)).toBeSameYearAs(date) // ✔️ pass
expect(addYears(date, 2)).toBeSameYearAs(date) // ❌ fail

expect(startOfYear(date)).not.toBeSameYearAs(date) // ❌ fail
expect(addYears(date, 2)).not.toBeSameYearAs(date) // ✔️ pass

toBeMonday

Matcher type: weekday

toBeMonday()

This allows you to check whether a date is on a monday.

Examples

expect(new Date()).toBeMonday()
expect(new Date()).not.toBeMonday()

toBeTuesday

Matcher type: weekday

toBeTuesday()

This allows you to check whether a date is on a tuesday.

Examples

expect(new Date()).toBeTuesday()
expect(new Date()).not.toBeTuesday()

toBeWednesday

Matcher type: weekday

toBeWednesday()

This allows you to check whether a date is on a wednesday.

Examples

expect(new Date()).toBeWednesday()
expect(new Date()).not.toBeWednesday()

toBeThursday

Matcher type: weekday

toBeThursday()

This allows you to check whether a date is on a thursday.

Examples

expect(new Date()).toBeThursday()
expect(new Date()).not.toBeThursday()

toBeFriday

Matcher type: weekday

toBeFriday()

This allows you to check whether a date is on a friday.

Examples

expect(new Date()).toBeFriday()
expect(new Date()).not.toBeFriday()

toBeSaturday

Matcher type: weekday

toBeSaturday()

This allows you to check whether a date is on a saturday.

Examples

expect(new Date()).toBeSaturday()
expect(new Date()).not.toBeSaturday()

toBeSunday

Matcher type: weekday

toBeSunday()

This allows you to check whether a date is on a Sunday.

Examples

expect(new Date()).toBeSunday()
expect(new Date()).not.toBeSunday()

Inspiration

This library was created because as far as I know, there is no matcher library out there dedicated to only comparing dates. I ended up using the functions from date-fns to create assertions like this one:

expect(isSameDay(date1, date2)).toBe(true)

But when this fails, you get no feedback at all other than the fact that the dates are not the same day. By making date matchers with helpful failure messages, I hope to make the debugging lives of developers a little bit easier.

Project structure and tooling hugely inspired by @testing-library/jest-dom

LICENSE

MIT