summaryrefslogtreecommitdiff
path: root/spec/frontend/__helpers__/fake_date/fake_date.js
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/__helpers__/fake_date/fake_date.js')
-rw-r--r--spec/frontend/__helpers__/fake_date/fake_date.js60
1 files changed, 60 insertions, 0 deletions
diff --git a/spec/frontend/__helpers__/fake_date/fake_date.js b/spec/frontend/__helpers__/fake_date/fake_date.js
new file mode 100644
index 00000000000..bc088ad96b6
--- /dev/null
+++ b/spec/frontend/__helpers__/fake_date/fake_date.js
@@ -0,0 +1,60 @@
+// Frida Kahlo's birthday (6 = July)
+const DEFAULT_ARGS = [2020, 6, 6];
+
+const RealDate = Date;
+
+const isMocked = (val) => Boolean(val.mock);
+
+const createFakeDateClass = (ctorDefaultParam = []) => {
+ const ctorDefault = ctorDefaultParam.length ? ctorDefaultParam : DEFAULT_ARGS;
+
+ const FakeDate = new Proxy(RealDate, {
+ construct: (target, argArray) => {
+ const ctorArgs = argArray.length ? argArray : ctorDefault;
+
+ return new RealDate(...ctorArgs);
+ },
+ apply: (target, thisArg, argArray) => {
+ const ctorArgs = argArray.length ? argArray : ctorDefault;
+
+ return new RealDate(...ctorArgs).toString();
+ },
+ // We want to overwrite the default 'now', but only if it's not already mocked
+ get: (target, prop) => {
+ if (prop === 'now' && !isMocked(target[prop])) {
+ return () => new RealDate(...ctorDefault).getTime();
+ }
+
+ return target[prop];
+ },
+ getPrototypeOf: (target) => {
+ return target.prototype;
+ },
+ // We need to be able to set props so that `jest.spyOn` will work.
+ set: (target, prop, value) => {
+ // eslint-disable-next-line no-param-reassign
+ target[prop] = value;
+ return true;
+ },
+ });
+
+ return FakeDate;
+};
+
+const setGlobalDateToFakeDate = (...args) => {
+ const FakeDate = createFakeDateClass(args);
+ global.Date = FakeDate;
+};
+
+const setGlobalDateToRealDate = () => {
+ global.Date = RealDate;
+};
+
+// We use commonjs so that the test environment module can pick this up
+// eslint-disable-next-line import/no-commonjs
+module.exports = {
+ setGlobalDateToFakeDate,
+ setGlobalDateToRealDate,
+ createFakeDateClass,
+ RealDate,
+};