upload-test-manual
Version:
CLI tool untuk mengolah file CSV dan upload ke ReportPortal
107 lines (93 loc) • 3.34 kB
JavaScript
const buildDescription = (testData, customFields = {}) => {
const fields = {
idField: 'Test Case ID',
stepsField: 'Steps',
expectedResultField: 'Expected Result',
actualResultField: 'Actual Result',
commentField: 'Comment',
...customFields
};
return [
`TEST CASE ID: ${testData[fields.idField] || 'NOT PROVIDED'}`,
`Steps:\n${testData[fields.stepsField]}`,
`Expected: ${testData[fields.expectedResultField] || 'Not specified'}`,
`Actual: ${testData[fields.actualResultField] || 'Not recorded'}`,
`Comments: ${testData[fields.commentField] || 'None'}`
].join('\n\n');
};
const buildAttributes = (testData, customFields = {}) => {
const fields = {
priorityField: 'Priority',
ownerField: 'Owner',
environmentField: 'Environment',
defectField: 'Defect',
automationField: 'Automation Status',
...customFields
};
const attributes = [
{ key: 'priority', value: testData[fields.priorityField] || 'MEDIUM' },
{ key: 'owner', value: testData[fields.ownerField] || 'Unknown' },
{ key: 'environment', value: testData[fields.environmentField] || 'staging' },
{
key: 'key',
value: (testData[fields.automationField] || 'manual').toLowerCase() === 'automated'
? 'automated'
: 'manual'
}
];
if (testData[fields.defectField]) {
attributes.push({ key: 'defect', value: testData[fields.defectField] });
}
// Include Test Case ID in attributes as fallback
if (testData['Test Case ID']) {
attributes.push({ key: 'test_case_id', value: testData['Test Case ID'] });
}
return attributes.filter(attr => attr.value && attr.value !== 'N/A');
};
const formatSteps = (steps) => {
if (!steps) return 'No steps provided';
if (typeof steps === 'string') {
const delimiters = ['\n', ';', '|'];
for (const delimiter of delimiters) {
if (steps.includes(delimiter)) {
return steps.split(delimiter)
.map((step, i) => `${i + 1}. ${step.trim()}`)
.join('\n');
}
}
return `1. ${steps.trim()}`;
}
return 'Unrecognized steps format';
};
const validateCSVStructure = (data, options = {}) => {
const config = {
requiredFields: ['Test Case ID', 'Title', 'Status', 'Steps'],
statusValues: ['Passed', 'Failed', 'Skipped', 'Pending'],
strictMode: false,
...options
};
// Validate required fields
const missingFields = config.requiredFields.filter(field => !data[field]);
if (missingFields.length > 0) {
throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
}
// Validate status values
if (data['Status'] && !config.statusValues.includes(data['Status'])) {
throw new Error(`Invalid status: ${data['Status']}. Must be one of: ${config.statusValues.join(', ')}`);
}
// Strict mode validation
if (config.strictMode) {
const extraFields = Object.keys(data).filter(
key => ![...config.requiredFields, ...(options.optionalFields || [])].includes(key)
);
if (extraFields.length > 0) {
throw new Error(`Unexpected fields: ${extraFields.join(', ')}`);
}
}
};
module.exports = {
buildDescription,
buildAttributes,
validateCSVStructure,
formatSteps
};