feat: add health check endpoint, file upload result handling, and Playwright E2E tests
- Add /health endpoint with anonymous access for monitoring - Add FileUploadResult<T> model and PostMultipartForFileResultAsync for proper upload response handling - Add ApiResult.Success() factory method for interface types - Refactor Login.razor for cleaner code - Add comprehensive Playwright E2E test suite with fixtures and helpers
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
const ExcelJS = require('exceljs');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const testDataDir = path.join(__dirname, '..', 'test-data');
|
||||
|
||||
// Ensure test-data directory exists
|
||||
if (!fs.existsSync(testDataDir)) {
|
||||
fs.mkdirSync(testDataDir, { recursive: true });
|
||||
}
|
||||
|
||||
async function createWorkOrderFile(filename, workOrders) {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
|
||||
worksheet.getCell('A1').value = 'Work Order Number';
|
||||
workOrders.forEach((wo, index) => {
|
||||
worksheet.getCell(`A${index + 2}`).value = wo;
|
||||
});
|
||||
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
await workbook.xlsx.writeFile(filepath);
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function createComponentLotFile(filename, lots) {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
|
||||
worksheet.getCell('A1').value = 'Lot Number';
|
||||
worksheet.getCell('B1').value = 'Item Number';
|
||||
lots.forEach((lot, index) => {
|
||||
worksheet.getCell(`A${index + 2}`).value = lot.lotNumber;
|
||||
worksheet.getCell(`B${index + 2}`).value = lot.itemNumber;
|
||||
});
|
||||
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
await workbook.xlsx.writeFile(filepath);
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function createItemNumberFile(filename, items) {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
|
||||
worksheet.getCell('A1').value = 'Item Number';
|
||||
items.forEach((item, index) => {
|
||||
worksheet.getCell(`A${index + 2}`).value = item;
|
||||
});
|
||||
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
await workbook.xlsx.writeFile(filepath);
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function createPartOperationFile(filename, operations) {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
|
||||
worksheet.getCell('A1').value = 'Item Number';
|
||||
worksheet.getCell('B1').value = 'Operation Number';
|
||||
worksheet.getCell('C1').value = 'MIS Number';
|
||||
worksheet.getCell('D1').value = 'MIS Revision';
|
||||
|
||||
operations.forEach((op, index) => {
|
||||
worksheet.getCell(`A${index + 2}`).value = op.itemNumber;
|
||||
worksheet.getCell(`B${index + 2}`).value = op.operationNumber;
|
||||
worksheet.getCell(`C${index + 2}`).value = op.misNumber;
|
||||
worksheet.getCell(`D${index + 2}`).value = op.misRevision;
|
||||
});
|
||||
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
await workbook.xlsx.writeFile(filepath);
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function createEmptyExcelFile(filename) {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Sheet1');
|
||||
// Just headers, no data
|
||||
worksheet.getCell('A1').value = 'Work Order Number';
|
||||
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
await workbook.xlsx.writeFile(filepath);
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function createInvalidTextFile(filename) {
|
||||
const filepath = path.join(testDataDir, filename);
|
||||
fs.writeFileSync(filepath, 'This is not a valid Excel file\nJust plain text');
|
||||
console.log(`Created: ${filepath}`);
|
||||
return filepath;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
console.log('Creating test Excel files...\n');
|
||||
|
||||
// Work Order test files
|
||||
await createWorkOrderFile('single_workorder.xlsx', [99059700]);
|
||||
await createWorkOrderFile('multiple_workorders.xlsx', [99059700, 99059701, 99059702]);
|
||||
// Maximum work orders from test data
|
||||
await createWorkOrderFile('max_workorders.xlsx', [
|
||||
99059700, 99002260, 99002259, 99002258, 99002257,
|
||||
99002256, 99002255, 99002254, 99002252, 99002251,
|
||||
99002250, 99002249, 99002248, 99002247, 99002246
|
||||
]);
|
||||
|
||||
// Component Lot test files
|
||||
await createComponentLotFile('single_lot.xlsx', [
|
||||
{ lotNumber: 'LOT001', itemNumber: '00598004702' }
|
||||
]);
|
||||
await createComponentLotFile('multiple_lots.xlsx', [
|
||||
{ lotNumber: 'LOT001', itemNumber: '00598004702' },
|
||||
{ lotNumber: 'LOT002', itemNumber: '00598004703' }
|
||||
]);
|
||||
|
||||
// Item Number test files
|
||||
await createItemNumberFile('single_item.xlsx', ['00598004702']);
|
||||
await createItemNumberFile('multiple_items.xlsx', ['00598004702', '00598004703', '00598004704']);
|
||||
|
||||
// Part Operation test files
|
||||
await createPartOperationFile('single_operation.xlsx', [
|
||||
{ itemNumber: '00598004702', operationNumber: '100', misNumber: 'MIS001', misRevision: 'A' }
|
||||
]);
|
||||
await createPartOperationFile('multiple_operations.xlsx', [
|
||||
{ itemNumber: '00598004702', operationNumber: '100', misNumber: 'MIS001', misRevision: 'A' },
|
||||
{ itemNumber: '00598004702', operationNumber: '200', misNumber: 'MIS002', misRevision: 'B' }
|
||||
]);
|
||||
|
||||
// Invalid test files for negative testing
|
||||
console.log('\nCreating invalid test files for negative testing...');
|
||||
await createEmptyExcelFile('empty_file.xlsx');
|
||||
await createInvalidTextFile('invalid_format.txt');
|
||||
|
||||
// Work orders with invalid data
|
||||
await createWorkOrderFile('invalid_workorders.xlsx', ['ABC123XYZ', 'INVALID', '']);
|
||||
await createWorkOrderFile('special_chars_workorders.xlsx', ['99059700!@#', '99002260$%^', '99002259&*']);
|
||||
|
||||
console.log('\nAll test files created successfully!');
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user