chronokinesis

Module for testing time-dependent code


Keywords
date, time, timezone, fake, mock, test, freeze, travel, hiro, fake now, browser, freezing, javascript, nodejs, rollup, timekeeper
License
MIT
Install
npm install chronokinesis@7.0.0

Documentation

chronokinesis

Build Coverage Status

Mock time and date for traveling and freezing. Inspired and borrowed from timekeeper.

Introduction

Mock Date and Date.now in order to help you test time-dependent code. Provides travel, freeze, and timezone functionality for your Node.js tests.

import * as ck from 'chronokinesis';

ck.freeze();

setTimeout(() => {
  // Frozen
  console.log(new Date());

  ck.reset();
}, 2000);

With arguments:

import * as ck from 'chronokinesis';
import assert from 'node:assert';

ck.freeze(1980, 0, 1);

assert.equal(true, ck.isKeepingTime());
assert.deepEqual(new Date(), new Date(1980, 0, 1));

ck.reset();

or use with luxon:

import { DateTime } from 'luxon';
import * as ck from 'chronokinesis';

ck.travel(DateTime.now().plus({ year: 1 }).toMillis());

setTimeout(() => {
  console.log('Traveled with Luxon DateTime one year and some', new Date());

  ck.reset();
}, 2000);

or use with moment:

import moment from 'moment';
import * as ck from 'chronokinesis';

ck.travel(moment().add(1, 'year'));

setTimeout(() => {
  console.log('Traveled with Moment Date one year and some', new Date());

  ck.reset();
}, 2000);

API Reference

freeze([...args])

Freeze point in time. Calls can be made with the same arguments as the Date constructor.

  • ...args: Optional date constructor arguments, if empty stops time at now
import * as ck from 'chronokinesis';

ck.freeze('1942-01-08');

setTimeout(() => {
  // Frozen
  console.log(new Date());

  ck.reset();
}, 2000);

travel([...args])

Time travel to another era. Calls can be made with the same arguments as the Date constructor

  • ...args: Optional date constructor arguments, pretty useless if empty but won´t crash
import * as ck from 'chronokinesis';
let date = new Date(2018, 0, 31);

ck.travel(date);

setTimeout(function () {
  console.log(new Date());
  ck.reset();
}, 1500);

When used in combination with freeze the time is still frozen but at the travelled time().

import * as ck from 'chronokinesis';
import moment from 'moment';

let date = new Date(2018, 0, 31);

ck.freeze(date);

ck.travel(moment().add(1, 'year'));

setTimeout(function () {
  console.log(`Still frozen but one year ahead ${new Date()}`);

  ck.reset();
}, 1500);

defrost()

Defrost a frozen point in time. Used in combination with travelling will start ticking the clock.

import * as ck from 'chronokinesis';

ck.freeze(1980, 0, 1);

// Travel one year
ck.travel(1981, 1, 1);

// Start ticking
ck.defrost();

setTimeout(() => {
  // Tick tack
  console.log(new Date());

  ck.reset();
}, 2000);

reset()

Resets Date to current glory.

import * as ck from 'chronokinesis';

ck.freeze(2060, 0, 1);
console.log(`end of time is reached at ${new Date()} according to Newton`);

ck.reset();

// Today
console.log(new Date());

isKeepingTime()

Utility function to see if we still travel or freeze time.

import * as ck from 'chronokinesis';

console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');
ck.travel(1893448800000);
console.log(ck.isKeepingTime() ? 'Is' : 'Not', 'keeping time');

ck.reset();

timezone(timeZone[, ...args])

Travel to time zone.

  • timeZone: IANA time zone string
  • ...args: Optional travel to date arguments

Returns TimeZoneTraveller api

import * as ck from 'chronokinesis';

ck.reset();

const tz = ck.timezone('Asia/Shanghai');

console.log('Now in Shanghai', new Date());

tz.freeze();

ck.reset();

new TimeZoneTraveller(timeZone)

Time zone traveller api.

import { TimeZoneTraveller, reset } from 'chronokinesis';

const timezone = new TimeZoneTraveller('Asia/Shanghai');

timezone.freeze();

reset();

timezone.freeze([...args])

Freeze at the specific timezone.

timezone.travel([...args])

Start traveling in the specific timezone.

timezone.reset()

Same as #reset

timezone.defrost()

Same as #defrost

Distributions

The module is prepared for browser and nodejs.

Nodejs require

const ck = require('chronokinesis');

Browser (UMD)

Use dist/chronokinesis.cjs. Sets global property chronokinesis.

Acknowledgements

chronokinesis initial code is inspired and borrowed from timekeeper