respond-framework
Version:
create as fast you think
92 lines (87 loc) • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var fs = require("fs");
var path = require("path");
const writeTestFile0 = (name, branch, settings, events) => {
const {
filename,
content
} = createTest(name, branch, settings, events);
writeTestFile(filename, content);
return filename;
};
var _default = exports.default = writeTestFile0;
const createTest = (name, branch, settings, events) => {
const moduleDir = createModuleDir(branch);
const filename = createFilename(moduleDir, name);
const levels = name.split('/').length;
const content = createTestFile(moduleDir, levels, settings, cleanAndNumberEvents(events));
return {
filename,
content
};
};
const projectDir = () => path.resolve();
const createModuleDir = branch => branch ? branch.split('.').reduce((dir, mod) => dir + '/modules/' + mod, projectDir()) : projectDir();
const createFilename = (moduleDir, name) => {
const testDir = moduleDir + '/__tests__';
const cleanName = name.replace(/ /g, '-').replace('.js', '');
return testDir + '/' + cleanName + '.js';
};
const createTestFile = (moduleDir, levels, settings, events) => {
const setupTestFile = moduleDir + '/setupTest.js';
const exists = fs.existsSync(setupTestFile);
const dotdot = Array.from({
length: levels
}).map(_ => '..').join('/');
const imports = exists ? `import setupTest from '${dotdot}/setupTest.js'` : `import { setupTest } from 'respond-framework/testing'`;
return `${imports}
const settings = ${JSON.stringify(settings, null, 2)}
const events = ${JSON.stringify(events, null, 2)}
const t = setupTest({ settings })
${events.map(createIndividualTest).join('\n\n')}`;
};
const createIndividualTest = (e, i) => {
const {
type,
arg
} = e;
const argString = JSON.stringify(arg);
const argStringLength = argString?.length;
const testName = argStringLength ? argStringLength <= 80 ? `${i}. ${type} - ${argString}` : `${i}. ${type} - arg` : `${i}. ${type}`;
return `test(\`${testName}\`, async () => {
await t.snap(events[${i}])
})`;
};
const writeTestFile = (filename, content) => {
const dir = filename.slice(0, filename.lastIndexOf('/'));
fs.mkdirSync(dir, {
recursive: true
});
fs.writeFileSync(filename, content);
fs.chmodSync(filename, 0o777);
};
const cleanAndNumberEvents = events => events.map((e, i) => {
const {
event: {
__event: type
},
arg = {},
meta: {
trigger,
input,
cached,
url,
...meta
} = {}
} = e;
return {
index: i,
type,
arg: Object.keys(arg).length === 0 ? undefined : arg,
meta: Object.keys(meta).length === 0 ? undefined : meta
};
});