← Anomaly Upload Validator

Anomaly Upload Validator · Specification artifact

Test Cases & QA Checklist

What had to pass before release.

the organization · Internal Tool · v2.1 · May 2026


Overview

This document contains 72 test cases covering all functional areas of the Anomaly Upload Validator as of v2.1. Test cases are derived from user story acceptance criteria, known bugs fixed during development, and regression tests. All cases are manually executable in any modern browser.

Priority Legend

Priority Legend
PriorityDefinition
P1 - CriticalCore functional requirement. Failure blocks upload workflow or produces incorrect output data.
P2 - HighImportant feature. Failure degrades user experience significantly or causes data quality issues.
P3 - MediumQuality of life feature. Failure is noticeable but does not block core workflow.
P4 - LowMinor enhancement. Failure is cosmetic or very low impact.

Section 1 — File Ingestion (TC-01 to TC-11)

Section 1 — File Ingestion (TC-01 to TC-11)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-01Upload valid CSVTool open in browserDrag valid UTF-8 CSV onto drop zoneFilename + row count shown. Run Validation enables.✅ PassP1 - CriticalUS-01
TC-02Upload valid XLSXTool open in browserClick drop zone, browse to XLSX, select itFilename + row count shown. Run Validation enables.✅ PassP1 - CriticalUS-01
TC-03Upload empty fileTool open in browserUpload XLSX with header row but no dataError: 'File appears empty.' No validation runs.✅ PassP2 - HighUS-01
TC-04Upload unsupported typeTool open in browserDrag .pdf or .txt file onto drop zoneFile rejected. Error shown. No state change.✅ PassP2 - HighUS-01
TC-05Alias: Date → Inspection DateCSV with 'Date' column (no 'Inspection Date')Upload file, run validation'Date' treated as 'Inspection Date'. No missing column error.✅ PassP1 - CriticalUS-02
TC-06Alias: Turbine Serial Number → Serial NumberCSV with 'Turbine Serial Number' columnUpload file, run validationTreated as 'Serial Number'. No missing column warning.✅ PassP2 - HighUS-02
TC-07Alias: Links → Source ImagesCSV with 'Links' columnUpload file, run validation'Links' treated as 'Source Images'. No required field error.✅ PassP1 - CriticalUS-02
TC-08Missing required column: IDDataset with ID column removedUpload file, run validationMissing column card shown for ID. All rows show Error.✅ PassP1 - CriticalUS-03
TC-09Missing required column: CoordinatesDataset with Coordinates column removedUpload file, run validationMissing column card shown. All rows get Check Internally flag.✅ PassP1 - CriticalUS-03
TC-10Missing conditional column: BladeChamberDataset without BladeChamberUpload file, run validationShown as informational only. No rows flagged.✅ PassP3 - MediumUS-03
TC-11Column name case-sensitiveDataset with 'blade side' (lowercase)Upload file, run validation'Blade Side' shown as missing required. Lowercase not accepted.✅ PassP2 - HighUS-03

Section 2 — Row-Level Validation (TC-12 to TC-26)

Section 2 — Row-Level Validation (TC-12 to TC-26)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-12Severity: valid 1–5Dataset with Severity 1,2,3,4,5Upload file, run validationAll rows pass. No Severity errors.✅ PassP1 - CriticalUS-04
TC-13Severity: invalid (0, 6, text)Dataset with Severity 0, 6, 'High'Upload file, run validationEach invalid value raises Error: 'Must be 1–5'.✅ PassP1 - CriticalUS-04
TC-14Critical: valid (Yes/yes/YES/No)Dataset with all case variantsUpload file, run validationAll case variants accepted. No errors.✅ PassP1 - CriticalUS-04
TC-15Critical: invalid (True, Y, 1)Dataset with invalid Critical valuesUpload file, run validationEach raises Error: 'Must be Yes or No'.✅ PassP1 - CriticalUS-04
TC-16Inspection Date: valid YYYY-MM-DDDataset with correctly formatted datesUpload file, run validationAll dates pass. No date errors.✅ PassP1 - CriticalUS-04
TC-17Inspection Date: invalid DD/MM/YYYYDataset with dates as '06/09/2024'Upload file, run validationError: 'Must be YYYY-MM-DD format' for each.✅ PassP1 - CriticalUS-04
TC-18Blade Side: abbreviated codes LE/TE/PS/SSDataset with 2-char codesUpload file, run validationAll four codes accepted as valid.✅ PassP1 - CriticalUS-05
TC-19Blade Side: full descriptive namesDataset with 'Leading Edge', 'Trailing Edge' etc.Upload file, run validationAll full names accepted as valid.✅ PassP1 - CriticalUS-05
TC-20Blade Side: invalid value ('Leeward')Dataset with 'Leeward' in Blade SideUpload file, run validationError raised: 'Must be a valid Blade Side value'.✅ PassP2 - HighUS-05
TC-21Coordinates: valid ≥3 pairsCoordinates = '[123,456], [234,567], [345,678]'Upload file, run validationRow passes Coordinates check.✅ PassP1 - CriticalUS-04
TC-22Coordinates: only 2 pairsCoordinates = '[123,456], [234,567]'Upload file, run validationError: 'Requires ≥3 [x,y] coordinate pairs'.✅ PassP1 - CriticalUS-04
TC-23Coordinates: emptyDataset with empty Coordinates fieldUpload file, run validationFlagged as Check Internally. NOT flagged as Error.✅ PassP1 - CriticalUS-08
TC-24Asset: emptyDataset with some empty Asset rowsUpload file, run validationCheck Internally flag raised. Not Error. Compliance score unaffected.✅ PassP1 - CriticalUS-08
TC-25Serial Number: empty or absentDataset with Serial Number missing entirelyUpload file, run validationNo flag raised. Not shown as missing column.✅ PassP1 - CriticalUS-06
TC-26Numeric fields: floating point noiseDistance (m) = '7.0000000000000007E-2'Upload file, run validation + export XLSXValue cleaned to 0.07 in output. No validation error.✅ PassP2 - HighUS-04

Section 3 — Status System & Compliance Score (TC-27 to TC-32)

Section 3 — Status System & Compliance Score (TC-27 to TC-32)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-27Compliance: all cleanAll required fields validUpload file, run validationScore = 100%. Bar is green.✅ PassP1 - CriticalUS-07
TC-28Compliance: check-internally excluded from denominator10 rows: 8 clean, 2 empty CoordinatesUpload file, run validationScore = 100% (8/8). Check Internally rows excluded.✅ PassP1 - CriticalUS-07
TC-29Compliance: errors present10 rows: 5 clean, 5 with Severity errorsUpload file, run validationScore = 50%. Bar is amber.✅ PassP1 - CriticalUS-07
TC-30Filter: Errors onlyDataset with mixed status typesRun validation → click Errors tabOnly Error rows visible. Others hidden.✅ PassP2 - HighUS-09
TC-31Filter: Manual Review shows ResolvedDataset with resolved Manual ReviewsClick Manual Review filter tabBoth unresolved and Resolved rows visible.✅ PassP2 - HighUS-09
TC-32Summary cards: correct countsKnown distribution of status typesUpload file, run validationAll five cards show correct counts.✅ PassP1 - CriticalUS-07

Section 4 — Conversion Engine (TC-33 to TC-44)

Section 4 — Conversion Engine (TC-33 to TC-44)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-33Format A: Element derivation (Dataset A)Dataset A dataset with Component + MaterialUpload file, run validation'Blade'+'Through' → 'Blade - Through'. Correct output.✅ PassP1 - CriticalUS-10
TC-34Format B: Element derivation (Dataset B)Dataset B dataset with Component + Element (no Material)Upload file, run validation'Blade'+'Laminate' (from Element col) → 'Blade - Laminate'.✅ PassP1 - CriticalUS-10,US-13
TC-35Element: empty Material and Element suffixComponent = 'Blade', Material = emptyUpload file, run validationInput Component = 'Blade'. No trailing ' - '.✅ PassP1 - CriticalUS-10
TC-36Anomaly Type: Subtype presentType='Crack', Subtype='Transverse'Upload file, run validationInput Damage Type='Crack - Transverse'. the organization='Crack - Transverse'. the OEM='Crack - Transverse'.✅ PassP1 - CriticalUS-11
TC-37REGRESSION: Trailing dash (Subtype empty)Type='Crack', Subtype='' (empty string)Upload file, run validation + export XLSXInput Damage Type='Crack' (no trailing ' - '). the organization='Crack - TLC'. the OEM='Crack - Longitudinal'. v2.1 fix.✅ PassP1 - CriticalUS-11
TC-38Format B: Anomaly Type column (Dataset B)Dataset B dataset with 'Anomaly Type' column (no 'Type')Upload file, run validation'Chip'+'Lightning' → 'Chip - Lightning'. Correctly resolved.✅ PassP1 - CriticalUS-11,US-13
TC-39Blade Side: Suction SideBlade Side = 'Suction Side'Upload file, run validationthe organization = 'Suction Side'. the OEM = 'Leeward'.✅ PassP1 - CriticalUS-12
TC-40Blade Side: Pressure SideBlade Side = 'Pressure Side'Upload file, run validationthe organization = 'Pressure Side'. the OEM = 'Windward'.✅ PassP1 - CriticalUS-12
TC-41Blade Side: unrecognized valueBlade Side = 'Rotor Side'Upload file, run validationManual Review raised. Shows 'MANUAL REVIEW: Rotor Side'.✅ PassP2 - HighUS-12
TC-42Blade extraction from Asset (Dataset A)Dataset A: Blade empty, Asset='Blade A: (No Serial Number)'Upload file, run validationBlade field populated as 'A'. No missing field error.✅ PassP2 - HighUS-13
TC-43Blade extraction from Blade col (Dataset B)Dataset B: Blade column = 'Blade A'Upload file, run validationBlade normalized to 'A'. No missing field error.✅ PassP2 - HighUS-13
TC-44Unknown Input ComponentComponent='Nacelle', Material='Steel' (not in table)Upload file, run validationManual Review raised. the organization Element = 'MANUAL REVIEW: Nacelle - Steel'.✅ PassP1 - CriticalUS-10

Section 5 — Manual Review Resolution (TC-45 to TC-50)

Section 5 — Manual Review Resolution (TC-45 to TC-50)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-45Resolve via dropdownDataset with unmatched Input ComponentRun validation → Manual Review tab → select dropdown valueRow updates to Resolved (green). Counter increments.✅ PassP1 - CriticalUS-14
TC-46Resolved value in outputManual Review resolved with 'Blade - Laminate'Resolve row → export XLSX → check column in outputXLSX shows 'Blade - Laminate'. the organization/the OEM columns show correct values.✅ PassP1 - CriticalUS-14
TC-47Export blocked by unresolved reviews3 Manual Reviews, 2 resolvedResolve 2 of 3 → check export buttonButton disabled. Counter shows '2 / 3 resolved'.✅ PassP1 - CriticalUS-15
TC-48Export unlocks when all resolved3 Manual Reviews, all resolvedResolve all 3 → check export buttonButton enables. Counter shows 'All 3 resolved — ready to export'.✅ PassP1 - CriticalUS-15
TC-49Validation Report always availableUnresolved Manual Reviews presentRun validation → click Export Validation ReportCSV downloads. Not blocked by Manual Reviews.✅ PassP1 - CriticalUS-15
TC-50Zero Manual Reviews: export immediateAll values in conversion tablesUpload file, run validationExport Converted XLSX enabled immediately. No progress counter.✅ PassP1 - CriticalUS-15

Section 6 — Export (TC-51 to TC-59)

Section 6 — Export (TC-51 to TC-59)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-51Validation Report: correct columnsAny dataset with issuesRun validation → Export Validation ReportCSV has columns: Row Number, Anomaly ID, Field, Status, Detail.✅ PassP1 - CriticalUS-18
TC-52Validation Report: status labelsDataset with all four status typesExport report → open CSVStatus column has exactly: Error, Manual Review, Check Internally, Warning.✅ PassP2 - HighUS-18
TC-53Converted XLSX: two tabsValid dataset, all reviews resolvedExport Converted XLSX → open fileFile has exactly two sheets: 'Damages Report' and 'Conversions'.✅ PassP1 - CriticalUS-19
TC-54Converted XLSX: header frozenExported XLSXOpen XLSX → scroll down past row 1Header row remains visible (frozen).✅ PassP3 - MediumUS-19
TC-55Converted XLSX: VLOOKUP formulas presentExported XLSXClick the organization Element column for any data rowFormula bar shows IFERROR(VLOOKUP(...)) — not a static value.✅ PassP1 - CriticalUS-19
TC-56REGRESSION: LEN not ISBLANK in formulaExported XLSXClick Input Component for row with empty MaterialFormula shows IF(LEN(...)>0,...) — not IF(ISBLANK(...),...). v2.1 fix.✅ PassP1 - CriticalUS-19
TC-57Conversions tab editableExported XLSXOpen Conversions tab → add a new mapping rowNew row visible and editable. VLOOKUP picks it up if within range.✅ PassP2 - HighUS-20
TC-58Exported filename formatSource file: 'source_dataset.xlsx'. Date: 2026-05-01Export Converted XLSXFilename: 'source_dataset_converted_2026-05-01.xlsx'.✅ PassP3 - MediumUS-19
TC-59MANUAL REVIEW fallback stringUnresolved row (if present in report)Check the organization Element for unresolved rowShows 'MANUAL REVIEW: [original value]'.✅ PassP2 - HighUS-14

Section 7 — Dataset Statistics & Edge Cases (TC-60 to TC-67)

Section 7 — Dataset Statistics & Edge Cases (TC-60 to TC-67)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-60Anomaly countDataset with 115 data rowsUpload file, run validationTotal Anomalies card shows 115.✅ PassP2 - HighUS-16
TC-61Unique turbine countDataset with 40 unique turbine IDsUpload file, run validationUnique Turbines card shows 40.✅ PassP2 - HighUS-16
TC-62Site breakdown tableDataset with two distinct sitesUpload file, run validationBoth sites shown. Counts correct. Sorted by anomaly count desc.✅ PassP2 - HighUS-16
TC-63Auto-conversion count100 fields successfully auto-convertedUpload file, run validationFields Auto-Converted card shows 100.✅ PassP3 - MediumUS-17
TC-64Reset clears all stateDataset loaded and validatedClick Reset buttonAll cleared. Drop zone ready. Resolved values discarded.✅ PassP2 - HighUS-01
TC-65No data transmitted externallyAny dataset. Network monitor openUpload, validate, export. Monitor all network requests.No outbound requests except CDN load for SheetJS.✅ PassP1 - CriticalUS-01
TC-66Large dataset performanceDataset with 500+ rowsUpload file, run validationCompletes within 5 seconds. No browser freeze.✅ PassP2 - HighN/A
TC-67Multi-site datasetDataset with rows from two sitesUpload file, run validationAll rows processed correctly. Both sites in breakdown table.✅ PassP2 - HighUS-16

Section 8 — Regression Tests (TC-68 to TC-72)

These tests must be executed on every new version release. Regression failures indicate a previously fixed bug has been reintroduced.

Section 8 — Regression Tests (TC-68 to TC-72)
TC IDDescriptionPreconditionsTest StepsExpected ResultResultPriorityStory Ref
TC-68REGRESSION: Trailing dash bugAny dataset where Subtype is empty for some rowsUpload file, run validation. Check Input Damage Type for empty-Subtype rowsInput Damage Type = 'Crack' not 'Crack - '. Correct conversion output. (Bug fixed v2.1)✅ PassP1 - CriticalUS-11
TC-69REGRESSION: Dataset B Component+ElementDataset B format dataset (no Material column)Upload Dataset B file, run validation. Check Input Component.Correct derivation using Element col as suffix. No false Manual Reviews. (Bug fixed v2.1)✅ PassP1 - CriticalUS-10,US-13
TC-70REGRESSION: Dataset B Anomaly Type colDataset B dataset with 'Anomaly Type' column (no 'Type')Upload Dataset B file. Check Input Damage Type derivation.Anomaly Type column used correctly as base. (Bug fixed v2.1)✅ PassP1 - CriticalUS-11,US-13
TC-71REGRESSION: ISBLANK vs LEN in XLSXExported XLSX from any datasetInspect Input Component formula for empty-Material rowFormula shows IF(LEN(...)>0,...) not IF(ISBLANK(...),...). (Bug fixed v2.1)✅ PassP1 - CriticalUS-10,US-11
TC-72REGRESSION: Blade Side codes acceptedDataset with LE, TE, PS, SS valuesUpload file, run validationCodes accepted as valid. No Blade Side errors. (Fix from v1.2)✅ PassP2 - HighUS-05

QA Sign-off

QA Sign-off
RoleNameDateSign-off
QA / TesterMay 2026⬜ Pending
Data Operations LeadMay 2026⬜ Pending
Engineering LeadMay 2026⬜ Pending

Anomaly Upload Validator · the organization · Internal Use Only · May 2026 · 72 Test Cases

← Back to the Anomaly Upload Validator case study