From 854c3a823b5c695294fa7c82060845d7cbb13de4 Mon Sep 17 00:00:00 2001 From: nwcm <111259588+nwcm@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:07:08 +1000 Subject: [PATCH 1/4] Update @salesforce/apex/ import to return jest.fn() --- .../__tests__/apex-continuation-scoped-import.test.js | 8 ++------ .../src/transforms/__tests__/apex-scoped-import.test.js | 8 ++------ packages/@lwc/jest-transformer/src/transforms/utils.js | 2 +- test/src/modules/transformer/apex/__tests__/apex.test.js | 7 ++++--- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js index 90bedaa9..d907df71 100644 --- a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js +++ b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js @@ -18,9 +18,7 @@ describe('@salesforce/apexContinuation import', () => { try { myMethod = require("@salesforce/apexContinuation/FooController.fooMethod").default; } catch (e) { - global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || function myMethod() { - return Promise.resolve(); - }; + global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || jest.fn(Promise.resolve()); myMethod = global.__lwcJestMock_myMethod; } @@ -40,9 +38,7 @@ describe('@salesforce/apexContinuation import', () => { try { myMethod = require("@salesforce/apexContinuation/FooController.fooMethod").default; } catch (e) { - global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || function myMethod() { - return Promise.resolve(); - }; + global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || jest.fn(Promise.resolve()); myMethod = global.__lwcJestMock_myMethod; } diff --git a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js index cbf46718..ca9a15b0 100644 --- a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js +++ b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js @@ -18,9 +18,7 @@ describe('@salesforce/apex import', () => { try { myMethod = require("@salesforce/apex/FooController.fooMethod").default; } catch (e) { - global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || function myMethod() { - return Promise.resolve(); - }; + global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || jest.fn(Promise.resolve()); myMethod = global.__lwcJestMock_myMethod; } @@ -40,9 +38,7 @@ describe('@salesforce/apex import', () => { try { myMethod = require("@salesforce/apex/FooController.fooMethod").default; } catch (e) { - global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || function myMethod() { - return Promise.resolve(); - }; + global.__lwcJestMock_myMethod = global.__lwcJestMock_myMethod || jest.fn(Promise.resolve()); myMethod = global.__lwcJestMock_myMethod; } diff --git a/packages/@lwc/jest-transformer/src/transforms/utils.js b/packages/@lwc/jest-transformer/src/transforms/utils.js index c7a37565..c017fad8 100644 --- a/packages/@lwc/jest-transformer/src/transforms/utils.js +++ b/packages/@lwc/jest-transformer/src/transforms/utils.js @@ -75,7 +75,7 @@ const resolvedPromiseTemplate = babelTemplate(` try { RESOURCE_NAME = require(IMPORT_SOURCE).default; } catch (e) { - global.MOCK_NAME = global.MOCK_NAME || function RESOURCE_NAME() { return Promise.resolve(); }; + global.MOCK_NAME = global.MOCK_NAME || jest.fn(Promise.resolve()); RESOURCE_NAME = global.MOCK_NAME; } `); diff --git a/test/src/modules/transformer/apex/__tests__/apex.test.js b/test/src/modules/transformer/apex/__tests__/apex.test.js index c499844c..20794405 100644 --- a/test/src/modules/transformer/apex/__tests__/apex.test.js +++ b/test/src/modules/transformer/apex/__tests__/apex.test.js @@ -8,7 +8,8 @@ import { ApexMethod, refreshApex, getSObjectValue } from '../apex'; describe('@salesforce/apex/', () => { it('exports a default method returning a promise', () => { - expect(ApexMethod()).resolves.toEqual(undefined); + // expect(ApexMethod()).resolves.toEqual(undefined); + expect(ApexMethod).not.toHaveBeenCalled(); }); }); @@ -18,9 +19,9 @@ describe('@salesforce/apex', () => { }); it('exports getSObjectValue method returning a jest.fn()', () => { - expect(getSObjectValue).not.toBeCalled(); + expect(getSObjectValue).not.toHaveBeenCalled(); getSObjectValue('foo'); - expect(getSObjectValue).toBeCalledWith('foo'); + expect(getSObjectValue).toHaveBeenCalledWith('foo'); }); }); From 741cff42e4ffcb2cb1dcb90748e6aefeddb29a2f Mon Sep 17 00:00:00 2001 From: nwcm <111259588+nwcm@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:30:45 +1000 Subject: [PATCH 2/4] Test @salesforce/apex/is jest.fn() --- test/src/modules/transformer/apex/__tests__/apex.test.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/src/modules/transformer/apex/__tests__/apex.test.js b/test/src/modules/transformer/apex/__tests__/apex.test.js index 20794405..8a85353a 100644 --- a/test/src/modules/transformer/apex/__tests__/apex.test.js +++ b/test/src/modules/transformer/apex/__tests__/apex.test.js @@ -7,9 +7,13 @@ import { ApexMethod, refreshApex, getSObjectValue } from '../apex'; describe('@salesforce/apex/', () => { - it('exports a default method returning a promise', () => { - // expect(ApexMethod()).resolves.toEqual(undefined); + it('exports a default method returning a promise', async () => { expect(ApexMethod).not.toHaveBeenCalled(); + + ApexMethod.mockResolvedValue('bar'); + const result = await ApexMethod('foo'); + expect(ApexMethod).toHaveBeenCalledWith('foo'); + expect(result).toBe('bar'); }); }); From e0c3c7b09097313f2ee31a0d7d241234f08e1697 Mon Sep 17 00:00:00 2001 From: nwcm <111259588+nwcm@users.noreply.github.com> Date: Fri, 26 Jul 2024 13:07:05 +1000 Subject: [PATCH 3/4] update documentation --- packages/@lwc/jest-preset/README.md | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/@lwc/jest-preset/README.md b/packages/@lwc/jest-preset/README.md index fa27252e..2d6824d5 100644 --- a/packages/@lwc/jest-preset/README.md +++ b/packages/@lwc/jest-preset/README.md @@ -110,6 +110,36 @@ Then, create a new test file in `__tests__` that follows the naming convention ` Now you can write and run the Jest tests! +#### @Salesforce/apex/ Method Mocks + +Imports of `@Salesforce/apex/*` automatically resolve to `jest.fn()`, these can be optionally overwritten. + +```js +import apexMethod from '@Salesforce/apex/apexClass.apexMethod'; + +it('test apex cal', async () => { + apexMethod.mockResolvedValue({ foo: 'bar' }); +}); +``` + +Optional set function for method manually + +```js +import apexMethod from '@Salesforce/apex/apexClass.apexMethod'; + +jest.mock( + '@salesforce/apex/apexClass.apexMethod', + () => ({ + default: jest.fn(), + }), + { virtual: true }, +); + +it('test apex callout', async () => { + apexMethod.mockResolvedValue({ foo: 'bar' }); +}); +``` + ### Custom matchers This package contains convenience functions to help test web components, including Lightning Web Components. From 01d64f0adae04e0d9091713692b1400a130af1a7 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Tue, 30 Jul 2024 15:33:50 -0700 Subject: [PATCH 4/4] fix: import jest from `@jest/globals` --- .../__tests__/apex-continuation-scoped-import.test.js | 2 ++ .../src/transforms/__tests__/apex-scoped-import.test.js | 2 ++ packages/@lwc/jest-transformer/src/transforms/utils.js | 1 + 3 files changed, 5 insertions(+) diff --git a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js index d907df71..01e1673d 100644 --- a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js +++ b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-continuation-scoped-import.test.js @@ -13,6 +13,7 @@ describe('@salesforce/apexContinuation import', () => { import myMethod from '@salesforce/apexContinuation/FooController.fooMethod'; `, ` + import { jest } from '@jest/globals'; let myMethod; try { @@ -33,6 +34,7 @@ describe('@salesforce/apexContinuation import', () => { `, ` import { otherNamed } from './something-valid'; + import { jest } from '@jest/globals'; let myMethod; try { diff --git a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js index ca9a15b0..72b558cc 100644 --- a/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js +++ b/packages/@lwc/jest-transformer/src/transforms/__tests__/apex-scoped-import.test.js @@ -13,6 +13,7 @@ describe('@salesforce/apex import', () => { import myMethod from '@salesforce/apex/FooController.fooMethod'; `, ` + import { jest } from '@jest/globals'; let myMethod; try { @@ -33,6 +34,7 @@ describe('@salesforce/apex import', () => { `, ` import { otherNamed } from './something-valid'; + import { jest } from '@jest/globals'; let myMethod; try { diff --git a/packages/@lwc/jest-transformer/src/transforms/utils.js b/packages/@lwc/jest-transformer/src/transforms/utils.js index c017fad8..787b1100 100644 --- a/packages/@lwc/jest-transformer/src/transforms/utils.js +++ b/packages/@lwc/jest-transformer/src/transforms/utils.js @@ -71,6 +71,7 @@ function stringScopedImportTransform(t, path, importIdentifier, fallbackData) { * shared. */ const resolvedPromiseTemplate = babelTemplate(` + import { jest } from '@jest/globals'; let RESOURCE_NAME; try { RESOURCE_NAME = require(IMPORT_SOURCE).default;