diff options
-rw-r--r-- | src/bun.js/bindings/JSMockFunction.cpp | 12 | ||||
-rw-r--r-- | src/bun.js/test/jest.zig | 25 | ||||
-rwxr-xr-x | test/bun.lockb | bin | 56172 -> 86272 bytes | |||
-rw-r--r-- | test/js/bun/test/mock-fn.test.js | 12 | ||||
-rw-r--r-- | test/js/bun/test/test-interop.js | 19 | ||||
-rw-r--r-- | test/package.json | 3 |
6 files changed, 48 insertions, 23 deletions
diff --git a/src/bun.js/bindings/JSMockFunction.cpp b/src/bun.js/bindings/JSMockFunction.cpp index b7c2659b4..fbfcf0c9e 100644 --- a/src/bun.js/bindings/JSMockFunction.cpp +++ b/src/bun.js/bindings/JSMockFunction.cpp @@ -391,6 +391,7 @@ void JSMockFunction::visitChildrenImpl(JSCell* cell, Visitor& visitor) visitor.append(fn->instances); visitor.append(fn->returnValues); visitor.append(fn->invocationCallOrder); + visitor.append(fn->spyOriginal); fn->mock.visit(visitor); } DEFINE_VISIT_CHILDREN(JSMockFunction); @@ -526,13 +527,13 @@ extern "C" void JSMock__resetSpies(Zig::GlobalObject* globalObject) globalObject->mockModule.activeSpies.clear(); } -extern "C" EncodedJSValue jsFunctionResetSpies(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callframe) +extern "C" EncodedJSValue JSMock__jsRestoreAllMocks(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callframe) { JSMock__resetSpies(jsCast<Zig::GlobalObject*>(globalObject)); return JSValue::encode(jsUndefined()); } -extern "C" EncodedJSValue JSMock__spyOn(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callframe) +extern "C" EncodedJSValue JSMock__jsSpyOn(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callframe) { auto& vm = lexicalGlobalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); @@ -963,7 +964,7 @@ JSC_DEFINE_CUSTOM_GETTER(jsMockFunctionGetter_protoImpl, (JSC::JSGlobalObject * return JSValue::encode(jsUndefined()); } -JSC_DEFINE_HOST_FUNCTION(jsMockFunctionConstructor, (JSC::JSGlobalObject * lexicalGlobalObject, JSC::CallFrame* callframe)) +extern "C" EncodedJSValue JSMock__jsMockFn(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callframe) { auto& vm = lexicalGlobalObject->vm(); auto* globalObject = jsCast<Zig::GlobalObject*>(lexicalGlobalObject); @@ -997,11 +998,6 @@ JSC_DEFINE_HOST_FUNCTION(jsMockFunctionConstructor, (JSC::JSGlobalObject * lexic return JSValue::encode(thisObject); } -extern "C" EncodedJSValue JSMockFunction__createObject(Zig::GlobalObject* globalObject) -{ - auto& vm = globalObject->vm(); - return JSValue::encode(JSC::JSFunction::create(vm, globalObject, 0, "mock"_s, jsMockFunctionConstructor, ImplementationVisibility::Public)); -} extern "C" EncodedJSValue JSMockFunction__getCalls(EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); diff --git a/src/bun.js/test/jest.zig b/src/bun.js/test/jest.zig index a1a4f2af8..f43afb1a2 100644 --- a/src/bun.js/test/jest.zig +++ b/src/bun.js/test/jest.zig @@ -333,7 +333,7 @@ pub const Jest = struct { pub fn Bun__Jest__createTestModuleObject(globalObject: *JSC.JSGlobalObject) callconv(.C) JSC.JSValue { JSC.markBinding(@src()); - const module = JSC.JSValue.createEmptyObject(globalObject, 11); + const module = JSC.JSValue.createEmptyObject(globalObject, 12); const test_fn = JSC.NewFunction(globalObject, ZigString.static("test"), 2, TestScope.call, false); module.put( @@ -431,31 +431,32 @@ pub const Jest = struct { Expect.getConstructor(globalObject), ); - const mock_fn = JSMockFunction__createObject(globalObject); - const spyOn = JSC.NewFunction(globalObject, ZigString.static("spyOn"), 2, JSMock__spyOn, false); - const restoreAllMocks = JSC.NewFunction(globalObject, ZigString.static("restoreAllMocks"), 2, jsFunctionResetSpies, false); - module.put(globalObject, ZigString.static("mock"), mock_fn); + const mockFn = JSC.NewFunction(globalObject, ZigString.static("fn"), 1, JSMock__jsMockFn, false); + const spyOn = JSC.NewFunction(globalObject, ZigString.static("spyOn"), 2, JSMock__jsSpyOn, false); + const restoreAllMocks = JSC.NewFunction(globalObject, ZigString.static("restoreAllMocks"), 2, JSMock__jsRestoreAllMocks, false); + module.put(globalObject, ZigString.static("mock"), mockFn); const jest = JSValue.createEmptyObject(globalObject, 3); - jest.put(globalObject, ZigString.static("fn"), mock_fn); + jest.put(globalObject, ZigString.static("fn"), mockFn); jest.put(globalObject, ZigString.static("spyOn"), spyOn); jest.put(globalObject, ZigString.static("restoreAllMocks"), restoreAllMocks); module.put(globalObject, ZigString.static("jest"), jest); module.put(globalObject, ZigString.static("spyOn"), spyOn); - const vi = JSValue.createEmptyObject(globalObject, 1); - vi.put(globalObject, ZigString.static("fn"), mock_fn); + const vi = JSValue.createEmptyObject(globalObject, 3); + vi.put(globalObject, ZigString.static("fn"), mockFn); + vi.put(globalObject, ZigString.static("spyOn"), spyOn); + vi.put(globalObject, ZigString.static("restoreAllMocks"), restoreAllMocks); module.put(globalObject, ZigString.static("vi"), vi); return module; } - extern fn JSMockFunction__createObject(*JSC.JSGlobalObject) JSC.JSValue; - extern fn Bun__Jest__testPreloadObject(*JSC.JSGlobalObject) JSC.JSValue; extern fn Bun__Jest__testModuleObject(*JSC.JSGlobalObject) JSC.JSValue; - extern fn jsFunctionResetSpies(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue; - extern fn JSMock__spyOn(*JSC.JSGlobalObject, *JSC.CallFrame) JSC.JSValue; + extern fn JSMock__jsMockFn(*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; pub fn call( _: void, diff --git a/test/bun.lockb b/test/bun.lockb Binary files differindex fc86845e1..a26f2fdfe 100755 --- a/test/bun.lockb +++ b/test/bun.lockb diff --git a/test/js/bun/test/mock-fn.test.js b/test/js/bun/test/mock-fn.test.js index eac981fd1..8504e3d70 100644 --- a/test/js/bun/test/mock-fn.test.js +++ b/test/js/bun/test/mock-fn.test.js @@ -2,7 +2,16 @@ * This file is meant to be runnable in both Jest and Bun. * `bunx jest mock-fn.test.js` */ -var { isBun, test, describe, expect, jest, vi, mock, bunTest, spyOn } = require("./test-interop.js")(); +var { isBun, expect, jest, vi, mock, spyOn } = require("./test-interop.js")(); + +// if you want to test vitest, comment the above and uncomment the below + +// import { expect, describe, test, vi } from "vitest"; +// const isBun = false; +// const jest = { fn: vi.fn, restoreAllMocks: vi.restoreAllMocks }; +// const spyOn = vi.spyOn; +// import * as extended from "jest-extended"; +// expect.extend(extended); async function expectResolves(promise) { expect(promise).toBeInstanceOf(Promise); @@ -434,7 +443,6 @@ describe("mock()", () => { return "3"; }, ); - expect(result).toBe(undefined); expect(fn()).toBe("1"); }); test("withImplementation (async)", async () => { diff --git a/test/js/bun/test/test-interop.js b/test/js/bun/test/test-interop.js index 5c41082d6..4b2199ae9 100644 --- a/test/js/bun/test/test-interop.js +++ b/test/js/bun/test/test-interop.js @@ -20,6 +20,25 @@ module.exports = () => { vi: bunTest.vi, spyOn: bunTest.spyOn, }; + } else if (process.env.VITEST) { + const vi = require("vitest"); + + return { + isBun: false, + bunTest: null, + test: vi.test, + describe: vi.describe, + it: vi.it, + expect: vi.expect, + beforeEach: vi.beforeEach, + afterEach: vi.afterEach, + beforeAll: vi.beforeAll, + afterAll: vi.afterAll, + jest: { fn: vi.fn }, + mock: null, + vi, + spyOn: vi.spyOn, + }; } else { const globals = require("@jest/globals"); const extended = require("jest-extended"); diff --git a/test/package.json b/test/package.json index a9b8db913..480305013 100644 --- a/test/package.json +++ b/test/package.json @@ -22,7 +22,8 @@ "supertest": "^6.1.6", "svelte": "^3.55.1", "typescript": "^5.0.2", - "undici": "^5.20.0" + "undici": "^5.20.0", + "vitest": "^0.32.2" }, "private": true, "scripts": { |