chromogen
Version:
simple, interaction-driven Jest test generator for Recoil and React Hooks apps
71 lines (68 loc) • 3.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateActLine = exports.testStateChangesExpect = exports.testStateChangesAct = exports.testInitialState = exports.importZustandStore = void 0;
const utils_1 = require("../utils/utils");
function importZustandStore() {
return `import useStore from '<ADD STORE FILEPATH>';`;
}
exports.importZustandStore = importZustandStore;
function testInitialState(initialRender) {
return Object.entries(initialRender).reduce((acc, [k, v]) => {
return (acc
+ `\tit('${k} should initialize correctly', () => {\n\t\texpect(result.current.${k}).toStrictEqual(${JSON.stringify(v)});\n\t});\n\n`);
}, '');
}
exports.testInitialState = testInitialState;
const dummyTransaction = { action: utils_1.dummyParam, changedValues: {} };
function testStateChangesAct(transactions) {
let groupedTransactions = [...transactions, dummyTransaction].reduce((acc, cur) => {
if (Object.keys(cur.changedValues).some((v) => acc.changedValues[v])
|| cur.action === utils_1.dummyParam) {
acc.groups.push(acc.currentGroup);
acc.currentGroup = [cur];
acc.changedValues = Object.keys(cur.changedValues).reduce((acc, k) => {
acc[k] = true;
return acc;
}, {});
}
else {
acc.currentGroup.push(cur);
Object.keys(cur.changedValues).forEach((k) => (acc.changedValues[k] = true));
}
return acc;
}, { groups: [], currentGroup: [], changedValues: {} }).groups;
return groupedTransactions.reduce((acc, group) => {
const { str, actBlock } = generateItBlock(group);
acc.str += str;
acc.actStatements = actBlock;
return acc;
}, { str: '', actStatements: '' }).str;
}
exports.testStateChangesAct = testStateChangesAct;
function testStateChangesExpect([propertyName, newValue]) {
return `\nexpect(result.current.${propertyName}).toStrictEqual(${JSON.stringify(newValue)});`;
}
exports.testStateChangesExpect = testStateChangesExpect;
function generateActLine(t) {
const { action } = t;
const args = t.arguments;
return `\tresult.current.${action}(${args === null || args === void 0 ? void 0 : args.map((arg) => JSON.stringify(arg)).join(', ')});\n`;
}
exports.generateActLine = generateActLine;
function generateItBlock(transactions) {
const valuesChanged = [];
let expectBlock = '';
transactions.forEach((t) => Object.entries(t.changedValues).forEach(([changedValue, newValue]) => {
valuesChanged.push(changedValue);
expectBlock += testStateChangesExpect([changedValue, newValue]);
}));
let newActBlock = transactions.map(generateActLine).join('');
return {
str: `\n\tit('${valuesChanged.join(' & ')} should update correctly', () => {
const { result } = renderHook(useStore);
act(() => {\n${newActBlock}\n});
${expectBlock}
});`,
actBlock: newActBlock,
};
}