Marvin
10/02/2023, 8:34 AMimport search from "N/search";
import Search from "N/search/instance";
import ResultSet from "N/search/resultSet";
jest.mock("N/search");
jest.mock("N/search/instance");
jest.mock("N/search/resultSet");
describe("Search test", () => {
it("will results set be looped through?", () => {
search.create.mockReturnValue(Search);
Search.run.mockReturnValue(ResultSet);
ResultSet.each.mockReturnValue([{id: 5}]);
});
});
with the following in the script
search.create({
type: "record_type"
, filters: [
{name: "status", operator: search.Operator.NONEOF, values: ["3", "4"]}
]
}).run().each(function(results) {
console.log({results});
complete = false;
});
complete
never gets swapped to false and the console.log
isn't logged.
Anybody mocked this before?NElliott
10/02/2023, 8:53 AMPhilip Denys
10/02/2023, 10:28 AMerictgrubaugh
10/02/2023, 3:28 PMbattk
10/02/2023, 5:07 PMbattk
10/02/2023, 5:08 PMbattk
10/02/2023, 5:12 PMbattk
10/02/2023, 5:14 PMbattk
10/02/2023, 5:15 PMbattk
10/02/2023, 5:15 PMMarvin
10/03/2023, 7:49 PM.each
doesn't return. But I couldn't figure out how to mock implementation so I changed to using N/query
in this instance since .asMappedResults
returns a value making it easier to mock.
I am very new to Jest and testing so I appreciate all the feedback.erictgrubaugh
10/03/2023, 8:16 PMnetsuiteStuff = getStuffFromNetsuite(); // Use NS APIs to retrieve data; don't unit test this
processedStuff = doBusinessyThings(netsuiteStuff); // avoid NS APIs; unit test this
storeStuffBackInNetsuite(processedStuff); // Use NS APIs to store data; don't unit test this
Marvin
10/03/2023, 8:25 PMgetStuffFromNetsuite()
within your script?
I tried something similar to the following.
const getStuffFromNetsuite = jest.fn();
getStuffFromNetsuite.mockReturnValue(true);
and
const getStuffFromNetsuite = jest.fn().mockImplementation(() => true);
erictgrubaugh
10/03/2023, 8:38 PMdoBusinessyThings
, so I don't need to care about getStuffFromNetsuite
or storeStuffBackInNetsuite
in my tests at all. netsuiteStuff
would be a plain JavaScript Object (or other vanilla JS data structure), so my test would be something like:erictgrubaugh
10/03/2023, 8:39 PMMarvin
10/03/2023, 8:42 PM@oracle/suitecloud-unit-testing
at all?
My first attempt of Jest was pretty much what you did...just test certain functions. I wanted to mock a more top to bottom test though. Maybe I am overdoing it though.erictgrubaugh
10/03/2023, 8:43 PMsuitecloud-unit-testing-stubs
erictgrubaugh
10/03/2023, 8:44 PMMarvin
10/03/2023, 8:47 PMerictgrubaugh
10/03/2023, 8:56 PMsuitecloud-unit-testing-stubs
, mocks might look like these highly contrived tests:Marvin
10/03/2023, 9:10 PM"N/query"
.
/* eslint-disable max-len */
// import script
import script from "../src/FileCabinet/SuiteScripts/cafb-scripts/map-reduce/pdd-create-update-transactions.js";
import testing_data from "../__test_data__/testing_data.js";
// import Netsuite stubs that will be used
import query from "N/query";
import Query from "N/query/instance";
import ResultSet from "N/query/resultSet";
// create mocks from the stubs
jest.mock("N/query");
jest.mock("N/query/instance");
jest.mock("N/query/resultSet");
const inputContext = {
isRestarted: false
};
beforeEach(() => {
jest.clearAllMocks();
});
describe("Testing getInputData entry point", () => {
it.each(testing_data)("$name", ({name, input}) => {
// given
query.create.mockReturnValue(Query);
Query.run.mockReturnValue(ResultSet);
ResultSet.asMappedResults.mockReturnValue(input.query_results);
// when
const input_result = script.getInputData(inputContext);
// then
expect(input_result).toStrictEqual(input.query_results);
});
});
Marvin
10/03/2023, 9:12 PMerictgrubaugh
10/03/2023, 9:12 PMerictgrubaugh
10/03/2023, 9:14 PMbattk
10/03/2023, 9:15 PMbattk
10/03/2023, 9:16 PMerictgrubaugh
10/03/2023, 9:16 PMerictgrubaugh
10/03/2023, 9:17 PMerictgrubaugh
10/03/2023, 9:18 PMMarvin
10/07/2023, 4:41 AMrun()
to runPaged()
because the fetch will return.
Here is the search syntax.
const paged_data = search.create({
type: "recordtype"
, columns: [column_field]
, filters: [
{name: filter_field, operator: search.Operator.ANYOF, values: [parseInt(source_class)]}
]
}).runPaged();
paged_data.pageRanges.forEach((range) => {
const page = paged_data.fetch({index: range.index});
page.data.forEach((result) => {
mapped_class = result.getValue(column_field);
});
Here are sections of the mock.
import search from "N/search";
import Search from "N/search/instance";
import SearchPagedData from "N/search/pagedData";
jest.mock("N/search");
jest.mock("N/search/instance");
jest.mock("N/search/pagedData");
SearchPagedData.fetch = jest.fn();
describe("test", () => {
it("test case", () => {
search.create.mockReturnValue(Search);
Search.runPaged.mockReturnValue(SearchPagedData);
jest.replaceProperty(SearchPagedData, "pageRanges", [{index: 0}, {index: 1}]); // test looping through multiple pages
SearchPagedData.fetch.mockImplementation((options) => {
if (options.index === 0) {
return {
data: [
{getValue: jest.fn(() => 2)}
]
};
} else if (options.index === 1) {
return {
data: [
{getValue: jest.fn(() => 3)}
]
};
}
});
});
});
Philip Denys
10/12/2023, 2:31 PM