cypress-autorecord
Version:
It simplifies mocking by auto-recording/stubbing HTTP interactions and automate the process of updating/deleting recordings.
95 lines (80 loc) • 2.51 kB
JavaScript
const path = require('path');
module.exports = (on, config, fs) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
const mocksFolder = path.resolve(config.fixturesFolder, '../mocks');
const readFile = (filePath) => {
if (fs.existsSync(filePath)) {
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
}
return null;
};
const deleteFile = (filePath) => {
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
return true;
}
return null;
};
const deleteFolder = (directoryPath) => {
if (fs.existsSync(directoryPath)) {
fs.readdirSync(directoryPath).forEach((file, index) => {
const curPath = path.join(directoryPath, file);
if (fs.lstatSync(curPath).isDirectory()) {
// recurse
deleteFolder(curPath);
} else {
// delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(directoryPath);
}
}
const cleanMocks = () => {
// TODO: create error handling
const specFiles = fs.readdirSync(config.integrationFolder);
const mockFiles = fs.readdirSync(mocksFolder);
mockFiles.forEach((mockName) => {
const isMockUsed = specFiles.find((specName) => specName.split('.')[0] === mockName.split('.')[0]);
if (!isMockUsed) {
const mockData = readFile(path.join(mocksFolder, mockName));
Object.keys(mockData).forEach((testName) => {
mockData[testName].forEach((route) => {
if (route.fixtureId) {
deleteFile(path.join(config.fixturesFolder, `${route.fixtureId}.json`));
}
});
});
deleteFile(path.join(mocksFolder, mockName));
}
});
return null;
};
const removeAllMocks = () => {
if (fs.existsSync(config.fixturesFolder)) {
const fixtureFiles = fs.readdirSync(config.fixturesFolder);
fixtureFiles.forEach((fileName) => {
const file = path.join(config.fixturesFolder, fileName);
if (fs.lstatSync(file).isDirectory()) {
deleteFolder(file);
} else {
deleteFile(file);
}
});
}
if (fs.existsSync(mocksFolder)) {
const mockFiles = fs.readdirSync(mocksFolder);
mockFiles.forEach((fileName) => {
deleteFile(path.join(mocksFolder, fileName));
});
}
return null;
};
on('task', {
readFile,
deleteFile,
cleanMocks,
removeAllMocks
});
};