react-unit-test-generator
Version:
react-unit-test-generator is a helper for writing unit tests for React apps. Its main goal is to automatically generate a suite of the most common test cases for a given component.
149 lines (121 loc) • 4.16 kB
JavaScript
var _generalImports = require("./templates/generalImports");
var _generalImports2 = _interopRequireDefault(_generalImports);
var _getFiles = require("./getFiles");
var _getFiles2 = _interopRequireDefault(_getFiles);
var _renderSuiteSchema = require("./templates/renderSuiteSchema");
var _renderSuiteSchema2 = _interopRequireDefault(_renderSuiteSchema);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var jest = require('jest');
var path = require('path');
var fs = require('fs');
var fileName = process.env.npm_config_fileName;
var filesToRunTestsFor = [];
if (!fileName) {
try {
throw new Error('Original Error');
} catch (err) {
err.message = "No file provided! Please provide a file/path argument: --fileName=<FileNameOrPath>";
throw err;
}
}
var packageName = process.env.npm_package_name;
var rootDir = path.join(__dirname, "../../../../".concat(packageName));
var srcPath = './src';
var testsPath = './tests';
var configFileName = '';
process.argv.map(function (arg) {
if (arg.includes('--config')) {
configFileName = arg.split('--config=')[1];
}
});
if (configFileName) {
try {
var pathToConfigFile = path.join(rootDir, './'.concat(configFileName));
if (fs.existsSync(pathToConfigFile)) {
try {
var configOptions = fs.readFileSync(pathToConfigFile);
configOptions = JSON.parse(configOptions);
if (configOptions.entry) {
srcPath = configOptions.entry;
}
if (configOptions.destination) {
testsPath = configOptions.destination;
}
} catch (err) {
err.message = 'Unable to read from config file.';
throw err;
}
} else {
throw new Error('Cannot find the specified config file.');
}
} catch (err) {
throw err;
}
}
var matchedFiles = [];
matchedFiles = (0, _getFiles2["default"])(path.join(rootDir, srcPath), matchedFiles, fileName);
console.log(matchedFiles);
if (matchedFiles.length === 0) {
try {
throw new Error('Original Error');
} catch (err) {
err.message = "Unable to find any file match for ".concat(fileName);
throw err;
}
}
process.TEST_GENERATOR_WARNINGS = [];
matchedFiles.forEach(function (componentPath) {
var componentName = componentPath.split('/').slice(-1)[0].split('.')[0];
var relativePath = path.relative(path.resolve(packageName, '../../'.concat(path.join(packageName, testsPath))), componentPath).replace(/\\/g, '/');
var Component = require(componentPath)["default"];
if (!Component || !Component.name) {
try {
throw new Error('Original Error');
} catch (err) {
err.message = "The file ".concat(fileName, " does not export a component");
throw err;
}
}
try {
fs.accessSync(componentPath, fs.constants.R_OK);
} catch (err) {
console.log("".concat(componentName, " is not readable"));
}
try {
fs.accessSync(componentPath, fs.constants.W_OK);
} catch (err) {
console.log("".concat(componentName, " is not writable"));
}
console.log('Generating unit tests for ' + componentName + '\n');
var destinationFile = path.join(rootDir, testsPath).concat('/', componentName, '.test.js');
console.log('Destination File: ', path.normalize(destinationFile));
try {
console.log('Adding imports...');
fs.writeFileSync(destinationFile, (0, _generalImports2["default"])(relativePath));
console.log('Done!\n');
} catch (err) {
throw err;
}
try {
console.log('Adding test suite...');
fs.appendFileSync(destinationFile, (0, _renderSuiteSchema2["default"])(componentPath));
filesToRunTestsFor.push(destinationFile.substring(destinationFile.indexOf(componentName)));
console.log('Done!\n');
} catch (err) {
throw err;
}
});
var options = {
collectCoverage: true,
projects: [rootDir],
reporters: ['default', path.resolve(__dirname, '../jestCustomReporter.js')],
setupFiles: [path.resolve(__dirname, '../setupTest.js')],
testPathPattern: filesToRunTestsFor,
verbose: true
};
try {
jest.runCLI(options, options.projects);
} catch (err) {
throw err;
}
;