aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-07-02 22:09:50 -0700
committerGravatar GitHub <noreply@github.com> 2023-07-02 22:09:50 -0700
commitaa38e51afb73dab3071addc07f82fd96153ff450 (patch)
tree086f4e8fe0d99adeef7aacf6afbe885f2c9a7663 /src
parentc21fadf9bcc939dcf7d949cda86c974481b5f609 (diff)
downloadbun-aa38e51afb73dab3071addc07f82fd96153ff450.tar.gz
bun-aa38e51afb73dab3071addc07f82fd96153ff450.tar.zst
bun-aa38e51afb73dab3071addc07f82fd96153ff450.zip
Support mocking `new Date()` & `Date.now()` in bun:test (#3501)
* Support changing the time * Bump WebKit * Update bun.lockb --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src')
m---------src/bun.js/WebKit0
-rw-r--r--src/bun.js/bindings/JSMockFunction.cpp24
-rw-r--r--src/bun.js/test/jest.zig5
3 files changed, 29 insertions, 0 deletions
diff --git a/src/bun.js/WebKit b/src/bun.js/WebKit
-Subproject 8a03cf746abef8a48c932ab25f8821390632f2e
+Subproject 26c819733315f0ab64ae8e8e65b77d77d31211e
diff --git a/src/bun.js/bindings/JSMockFunction.cpp b/src/bun.js/bindings/JSMockFunction.cpp
index 33922c2b7..0e24e761c 100644
--- a/src/bun.js/bindings/JSMockFunction.cpp
+++ b/src/bun.js/bindings/JSMockFunction.cpp
@@ -19,6 +19,7 @@
#include <JavaScriptCore/WeakMapImpl.h>
#include <JavaScriptCore/WeakMapImplInlines.h>
#include <JavaScriptCore/FunctionPrototype.h>
+#include <JavaScriptCore/DateInstance.h>
namespace Bun {
@@ -65,6 +66,29 @@ JSC_DECLARE_HOST_FUNCTION(jsMockFunctionMockRejectedValueOnce);
JSC_DECLARE_HOST_FUNCTION(jsMockFunctionWithImplementationCleanup);
JSC_DECLARE_HOST_FUNCTION(jsMockFunctionWithImplementation);
+extern "C" EncodedJSValue JSMock__jsNow(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame)
+{
+ return JSValue::encode(jsNumber(globalObject->jsDateNow()));
+}
+extern "C" EncodedJSValue JSMock__jsSetSystemTime(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame)
+{
+ JSValue argument0 = callFrame->argument(0);
+
+ if (auto* dateInstance = jsDynamicCast<DateInstance*>(argument0)) {
+ if (std::isnormal(dateInstance->internalNumber())) {
+ globalObject->overridenDateNow = dateInstance->internalNumber();
+ }
+ return JSValue::encode(callFrame->thisValue());
+ }
+
+ if (argument0.isNumber() && argument0.asNumber() > 0) {
+ globalObject->overridenDateNow = argument0.asNumber();
+ }
+
+ globalObject->overridenDateNow = -1;
+ return JSValue::encode(callFrame->thisValue());
+}
+
uint64_t JSMockModule::s_nextInvocationId = 0;
// This is taken from JSWeakSet
diff --git a/src/bun.js/test/jest.zig b/src/bun.js/test/jest.zig
index 6e4cb827c..727466835 100644
--- a/src/bun.js/test/jest.zig
+++ b/src/bun.js/test/jest.zig
@@ -440,6 +440,9 @@ pub const Jest = struct {
jest.put(globalObject, ZigString.static("fn"), mockFn);
jest.put(globalObject, ZigString.static("spyOn"), spyOn);
jest.put(globalObject, ZigString.static("restoreAllMocks"), restoreAllMocks);
+ jest.put(globalObject, ZigString.static("now"), JSC.NewFunction(globalObject, ZigString.static("now"), 0, JSMock__jsNow, false));
+ jest.put(globalObject, ZigString.static("setSystemTime"), JSC.NewFunction(globalObject, ZigString.static("setSystemTime"), 0, JSMock__jsSetSystemTime, false));
+
module.put(globalObject, ZigString.static("jest"), jest);
module.put(globalObject, ZigString.static("spyOn"), spyOn);
@@ -455,6 +458,8 @@ pub const Jest = struct {
extern fn Bun__Jest__testPreloadObject(*JSC.JSGlobalObject) JSC.JSValue;
extern fn Bun__Jest__testModuleObject(*JSC.JSGlobalObject) JSC.JSValue;
extern fn JSMock__jsMockFn(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue;
+ extern fn JSMock__jsNow(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue;
+ extern fn JSMock__jsSetSystemTime(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue;
extern fn JSMock__jsRestoreAllMocks(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue;
extern fn JSMock__jsSpyOn(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue;