From 58fe0bdc816136385a7402a9cced90a9e1d1be3e Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Thu, 20 Apr 2023 19:52:48 +0300
Subject: [PATCH] refactor(date): Use Jest fake timers (#21631)

---
 lib/util/date.spec.ts | 53 ++++++++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 23 deletions(-)

diff --git a/lib/util/date.spec.ts b/lib/util/date.spec.ts
index 08d5d102c3..9aa53a38a4 100644
--- a/lib/util/date.spec.ts
+++ b/lib/util/date.spec.ts
@@ -1,3 +1,4 @@
+import { DateTime } from 'luxon';
 import {
   getElapsedDays,
   getElapsedHours,
@@ -5,34 +6,40 @@ import {
   getElapsedMs,
 } from './date';
 
-const ONE_MINUTE_MS = 60 * 1000;
-const ONE_HOUR_MS = 60 * ONE_MINUTE_MS;
-const ONE_DAY_MS = 24 * ONE_HOUR_MS;
-
 describe('util/date', () => {
-  const Jan1 = new Date(new Date().getFullYear(), 0, 1);
+  const t0 = DateTime.fromISO('2020-10-10');
+
+  beforeAll(() => {
+    jest.useFakeTimers();
+  });
+
+  beforeEach(() => {
+    jest.setSystemTime(t0.toMillis());
+  });
 
-  it('returns elapsed days', () => {
-    const elapsedDays = Math.floor(
-      (new Date().getTime() - new Date(Jan1).getTime()) / ONE_DAY_MS
-    );
-    expect(getElapsedDays(Jan1.toDateString())).toBe(elapsedDays);
+  afterAll(() => {
+    jest.useRealTimers();
   });
 
-  it('returns elapsed minutes', () => {
-    const elapsedMinutes = Math.floor(
-      (new Date().getTime() - new Date(Jan1).getTime()) / ONE_MINUTE_MS
-    );
-    expect(getElapsedMinutes(new Date(Jan1))).toBe(elapsedMinutes);
+  describe('getElapsedDays', () => {
+    it('returns elapsed days', () => {
+      const t = t0.minus({ days: 42 });
+      expect(getElapsedDays(t.toISO()!)).toBe(42);
+    });
+  });
+
+  describe('getElapsedMinutes', () => {
+    it('returns elapsed minutes', () => {
+      const t = t0.minus({ minutes: 42 });
+      expect(getElapsedMinutes(t.toJSDate())).toBe(42);
+    });
   });
 
   describe('getElapsedHours', () => {
     it('returns elapsed hours', () => {
-      const elapsedHours = Math.floor(
-        (new Date().getTime() - new Date(Jan1).getTime()) / ONE_HOUR_MS
-      );
-      expect(getElapsedHours(Jan1.toISOString())).toBe(elapsedHours); // ISOstring
-      expect(getElapsedHours(Jan1)).toBe(elapsedHours); // JS Date
+      const t = t0.minus({ hours: 42 });
+      expect(getElapsedHours(t.toISO()!)).toBe(42); // ISOstring
+      expect(getElapsedHours(t.toJSDate())).toBe(42); // JS Date
     });
 
     it('returns zero when date passed is invalid', () => {
@@ -40,10 +47,10 @@ describe('util/date', () => {
     });
   });
 
-  describe('getElapsedMilliseconds', () => {
+  describe('getElapsedMs', () => {
     it('returns elapsed time in milliseconds', () => {
-      const elapsedMs = new Date().getTime() - new Date(Jan1).getTime();
-      expect(getElapsedMs(Jan1.toISOString())).toBe(elapsedMs);
+      const t = t0.minus({ milliseconds: 42 });
+      expect(getElapsedMs(t.toISO()!)).toBe(42);
     });
   });
 });
-- 
GitLab