Anomaly Upload Validator · Specification artifact
Test Cases & QA Checklist
What had to pass before release.
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 | Definition |
|---|---|
| P1 - Critical | Core functional requirement. Failure blocks upload workflow or produces incorrect output data. |
| P2 - High | Important feature. Failure degrades user experience significantly or causes data quality issues. |
| P3 - Medium | Quality of life feature. Failure is noticeable but does not block core workflow. |
| P4 - Low | Minor enhancement. Failure is cosmetic or very low impact. |
Section 1 — File Ingestion (TC-01 to TC-11)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-01 | Upload valid CSV | Tool open in browser | Drag valid UTF-8 CSV onto drop zone | Filename + row count shown. Run Validation enables. | ✅ Pass | P1 - Critical | US-01 |
| TC-02 | Upload valid XLSX | Tool open in browser | Click drop zone, browse to XLSX, select it | Filename + row count shown. Run Validation enables. | ✅ Pass | P1 - Critical | US-01 |
| TC-03 | Upload empty file | Tool open in browser | Upload XLSX with header row but no data | Error: 'File appears empty.' No validation runs. | ✅ Pass | P2 - High | US-01 |
| TC-04 | Upload unsupported type | Tool open in browser | Drag .pdf or .txt file onto drop zone | File rejected. Error shown. No state change. | ✅ Pass | P2 - High | US-01 |
| TC-05 | Alias: Date → Inspection Date | CSV with 'Date' column (no 'Inspection Date') | Upload file, run validation | 'Date' treated as 'Inspection Date'. No missing column error. | ✅ Pass | P1 - Critical | US-02 |
| TC-06 | Alias: Turbine Serial Number → Serial Number | CSV with 'Turbine Serial Number' column | Upload file, run validation | Treated as 'Serial Number'. No missing column warning. | ✅ Pass | P2 - High | US-02 |
| TC-07 | Alias: Links → Source Images | CSV with 'Links' column | Upload file, run validation | 'Links' treated as 'Source Images'. No required field error. | ✅ Pass | P1 - Critical | US-02 |
| TC-08 | Missing required column: ID | Dataset with ID column removed | Upload file, run validation | Missing column card shown for ID. All rows show Error. | ✅ Pass | P1 - Critical | US-03 |
| TC-09 | Missing required column: Coordinates | Dataset with Coordinates column removed | Upload file, run validation | Missing column card shown. All rows get Check Internally flag. | ✅ Pass | P1 - Critical | US-03 |
| TC-10 | Missing conditional column: BladeChamber | Dataset without BladeChamber | Upload file, run validation | Shown as informational only. No rows flagged. | ✅ Pass | P3 - Medium | US-03 |
| TC-11 | Column name case-sensitive | Dataset with 'blade side' (lowercase) | Upload file, run validation | 'Blade Side' shown as missing required. Lowercase not accepted. | ✅ Pass | P2 - High | US-03 |
Section 2 — Row-Level Validation (TC-12 to TC-26)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-12 | Severity: valid 1–5 | Dataset with Severity 1,2,3,4,5 | Upload file, run validation | All rows pass. No Severity errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-13 | Severity: invalid (0, 6, text) | Dataset with Severity 0, 6, 'High' | Upload file, run validation | Each invalid value raises Error: 'Must be 1–5'. | ✅ Pass | P1 - Critical | US-04 |
| TC-14 | Critical: valid (Yes/yes/YES/No) | Dataset with all case variants | Upload file, run validation | All case variants accepted. No errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-15 | Critical: invalid (True, Y, 1) | Dataset with invalid Critical values | Upload file, run validation | Each raises Error: 'Must be Yes or No'. | ✅ Pass | P1 - Critical | US-04 |
| TC-16 | Inspection Date: valid YYYY-MM-DD | Dataset with correctly formatted dates | Upload file, run validation | All dates pass. No date errors. | ✅ Pass | P1 - Critical | US-04 |
| TC-17 | Inspection Date: invalid DD/MM/YYYY | Dataset with dates as '06/09/2024' | Upload file, run validation | Error: 'Must be YYYY-MM-DD format' for each. | ✅ Pass | P1 - Critical | US-04 |
| TC-18 | Blade Side: abbreviated codes LE/TE/PS/SS | Dataset with 2-char codes | Upload file, run validation | All four codes accepted as valid. | ✅ Pass | P1 - Critical | US-05 |
| TC-19 | Blade Side: full descriptive names | Dataset with 'Leading Edge', 'Trailing Edge' etc. | Upload file, run validation | All full names accepted as valid. | ✅ Pass | P1 - Critical | US-05 |
| TC-20 | Blade Side: invalid value ('Leeward') | Dataset with 'Leeward' in Blade Side | Upload file, run validation | Error raised: 'Must be a valid Blade Side value'. | ✅ Pass | P2 - High | US-05 |
| TC-21 | Coordinates: valid ≥3 pairs | Coordinates = '[123,456], [234,567], [345,678]' | Upload file, run validation | Row passes Coordinates check. | ✅ Pass | P1 - Critical | US-04 |
| TC-22 | Coordinates: only 2 pairs | Coordinates = '[123,456], [234,567]' | Upload file, run validation | Error: 'Requires ≥3 [x,y] coordinate pairs'. | ✅ Pass | P1 - Critical | US-04 |
| TC-23 | Coordinates: empty | Dataset with empty Coordinates field | Upload file, run validation | Flagged as Check Internally. NOT flagged as Error. | ✅ Pass | P1 - Critical | US-08 |
| TC-24 | Asset: empty | Dataset with some empty Asset rows | Upload file, run validation | Check Internally flag raised. Not Error. Compliance score unaffected. | ✅ Pass | P1 - Critical | US-08 |
| TC-25 | Serial Number: empty or absent | Dataset with Serial Number missing entirely | Upload file, run validation | No flag raised. Not shown as missing column. | ✅ Pass | P1 - Critical | US-06 |
| TC-26 | Numeric fields: floating point noise | Distance (m) = '7.0000000000000007E-2' | Upload file, run validation + export XLSX | Value cleaned to 0.07 in output. No validation error. | ✅ Pass | P2 - High | US-04 |
Section 3 — Status System & Compliance Score (TC-27 to TC-32)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-27 | Compliance: all clean | All required fields valid | Upload file, run validation | Score = 100%. Bar is green. | ✅ Pass | P1 - Critical | US-07 |
| TC-28 | Compliance: check-internally excluded from denominator | 10 rows: 8 clean, 2 empty Coordinates | Upload file, run validation | Score = 100% (8/8). Check Internally rows excluded. | ✅ Pass | P1 - Critical | US-07 |
| TC-29 | Compliance: errors present | 10 rows: 5 clean, 5 with Severity errors | Upload file, run validation | Score = 50%. Bar is amber. | ✅ Pass | P1 - Critical | US-07 |
| TC-30 | Filter: Errors only | Dataset with mixed status types | Run validation → click Errors tab | Only Error rows visible. Others hidden. | ✅ Pass | P2 - High | US-09 |
| TC-31 | Filter: Manual Review shows Resolved | Dataset with resolved Manual Reviews | Click Manual Review filter tab | Both unresolved and Resolved rows visible. | ✅ Pass | P2 - High | US-09 |
| TC-32 | Summary cards: correct counts | Known distribution of status types | Upload file, run validation | All five cards show correct counts. | ✅ Pass | P1 - Critical | US-07 |
Section 4 — Conversion Engine (TC-33 to TC-44)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-33 | Format A: Element derivation (Dataset A) | Dataset A dataset with Component + Material | Upload file, run validation | 'Blade'+'Through' → 'Blade - Through'. Correct output. | ✅ Pass | P1 - Critical | US-10 |
| TC-34 | Format B: Element derivation (Dataset B) | Dataset B dataset with Component + Element (no Material) | Upload file, run validation | 'Blade'+'Laminate' (from Element col) → 'Blade - Laminate'. | ✅ Pass | P1 - Critical | US-10,US-13 |
| TC-35 | Element: empty Material and Element suffix | Component = 'Blade', Material = empty | Upload file, run validation | Input Component = 'Blade'. No trailing ' - '. | ✅ Pass | P1 - Critical | US-10 |
| TC-36 | Anomaly Type: Subtype present | Type='Crack', Subtype='Transverse' | Upload file, run validation | Input Damage Type='Crack - Transverse'. the organization='Crack - Transverse'. the OEM='Crack - Transverse'. | ✅ Pass | P1 - Critical | US-11 |
| TC-37 | REGRESSION: Trailing dash (Subtype empty) | Type='Crack', Subtype='' (empty string) | Upload file, run validation + export XLSX | Input Damage Type='Crack' (no trailing ' - '). the organization='Crack - TLC'. the OEM='Crack - Longitudinal'. v2.1 fix. | ✅ Pass | P1 - Critical | US-11 |
| TC-38 | Format 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. | ✅ Pass | P1 - Critical | US-11,US-13 |
| TC-39 | Blade Side: Suction Side | Blade Side = 'Suction Side' | Upload file, run validation | the organization = 'Suction Side'. the OEM = 'Leeward'. | ✅ Pass | P1 - Critical | US-12 |
| TC-40 | Blade Side: Pressure Side | Blade Side = 'Pressure Side' | Upload file, run validation | the organization = 'Pressure Side'. the OEM = 'Windward'. | ✅ Pass | P1 - Critical | US-12 |
| TC-41 | Blade Side: unrecognized value | Blade Side = 'Rotor Side' | Upload file, run validation | Manual Review raised. Shows 'MANUAL REVIEW: Rotor Side'. | ✅ Pass | P2 - High | US-12 |
| TC-42 | Blade extraction from Asset (Dataset A) | Dataset A: Blade empty, Asset='Blade A: (No Serial Number)' | Upload file, run validation | Blade field populated as 'A'. No missing field error. | ✅ Pass | P2 - High | US-13 |
| TC-43 | Blade extraction from Blade col (Dataset B) | Dataset B: Blade column = 'Blade A' | Upload file, run validation | Blade normalized to 'A'. No missing field error. | ✅ Pass | P2 - High | US-13 |
| TC-44 | Unknown Input Component | Component='Nacelle', Material='Steel' (not in table) | Upload file, run validation | Manual Review raised. the organization Element = 'MANUAL REVIEW: Nacelle - Steel'. | ✅ Pass | P1 - Critical | US-10 |
Section 5 — Manual Review Resolution (TC-45 to TC-50)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-45 | Resolve via dropdown | Dataset with unmatched Input Component | Run validation → Manual Review tab → select dropdown value | Row updates to Resolved (green). Counter increments. | ✅ Pass | P1 - Critical | US-14 |
| TC-46 | Resolved value in output | Manual Review resolved with 'Blade - Laminate' | Resolve row → export XLSX → check column in output | XLSX shows 'Blade - Laminate'. the organization/the OEM columns show correct values. | ✅ Pass | P1 - Critical | US-14 |
| TC-47 | Export blocked by unresolved reviews | 3 Manual Reviews, 2 resolved | Resolve 2 of 3 → check export button | Button disabled. Counter shows '2 / 3 resolved'. | ✅ Pass | P1 - Critical | US-15 |
| TC-48 | Export unlocks when all resolved | 3 Manual Reviews, all resolved | Resolve all 3 → check export button | Button enables. Counter shows 'All 3 resolved — ready to export'. | ✅ Pass | P1 - Critical | US-15 |
| TC-49 | Validation Report always available | Unresolved Manual Reviews present | Run validation → click Export Validation Report | CSV downloads. Not blocked by Manual Reviews. | ✅ Pass | P1 - Critical | US-15 |
| TC-50 | Zero Manual Reviews: export immediate | All values in conversion tables | Upload file, run validation | Export Converted XLSX enabled immediately. No progress counter. | ✅ Pass | P1 - Critical | US-15 |
Section 6 — Export (TC-51 to TC-59)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-51 | Validation Report: correct columns | Any dataset with issues | Run validation → Export Validation Report | CSV has columns: Row Number, Anomaly ID, Field, Status, Detail. | ✅ Pass | P1 - Critical | US-18 |
| TC-52 | Validation Report: status labels | Dataset with all four status types | Export report → open CSV | Status column has exactly: Error, Manual Review, Check Internally, Warning. | ✅ Pass | P2 - High | US-18 |
| TC-53 | Converted XLSX: two tabs | Valid dataset, all reviews resolved | Export Converted XLSX → open file | File has exactly two sheets: 'Damages Report' and 'Conversions'. | ✅ Pass | P1 - Critical | US-19 |
| TC-54 | Converted XLSX: header frozen | Exported XLSX | Open XLSX → scroll down past row 1 | Header row remains visible (frozen). | ✅ Pass | P3 - Medium | US-19 |
| TC-55 | Converted XLSX: VLOOKUP formulas present | Exported XLSX | Click the organization Element column for any data row | Formula bar shows IFERROR(VLOOKUP(...)) — not a static value. | ✅ Pass | P1 - Critical | US-19 |
| TC-56 | REGRESSION: LEN not ISBLANK in formula | Exported XLSX | Click Input Component for row with empty Material | Formula shows IF(LEN(...)>0,...) — not IF(ISBLANK(...),...). v2.1 fix. | ✅ Pass | P1 - Critical | US-19 |
| TC-57 | Conversions tab editable | Exported XLSX | Open Conversions tab → add a new mapping row | New row visible and editable. VLOOKUP picks it up if within range. | ✅ Pass | P2 - High | US-20 |
| TC-58 | Exported filename format | Source file: 'source_dataset.xlsx'. Date: 2026-05-01 | Export Converted XLSX | Filename: 'source_dataset_converted_2026-05-01.xlsx'. | ✅ Pass | P3 - Medium | US-19 |
| TC-59 | MANUAL REVIEW fallback string | Unresolved row (if present in report) | Check the organization Element for unresolved row | Shows 'MANUAL REVIEW: [original value]'. | ✅ Pass | P2 - High | US-14 |
Section 7 — Dataset Statistics & Edge Cases (TC-60 to TC-67)
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-60 | Anomaly count | Dataset with 115 data rows | Upload file, run validation | Total Anomalies card shows 115. | ✅ Pass | P2 - High | US-16 |
| TC-61 | Unique turbine count | Dataset with 40 unique turbine IDs | Upload file, run validation | Unique Turbines card shows 40. | ✅ Pass | P2 - High | US-16 |
| TC-62 | Site breakdown table | Dataset with two distinct sites | Upload file, run validation | Both sites shown. Counts correct. Sorted by anomaly count desc. | ✅ Pass | P2 - High | US-16 |
| TC-63 | Auto-conversion count | 100 fields successfully auto-converted | Upload file, run validation | Fields Auto-Converted card shows 100. | ✅ Pass | P3 - Medium | US-17 |
| TC-64 | Reset clears all state | Dataset loaded and validated | Click Reset button | All cleared. Drop zone ready. Resolved values discarded. | ✅ Pass | P2 - High | US-01 |
| TC-65 | No data transmitted externally | Any dataset. Network monitor open | Upload, validate, export. Monitor all network requests. | No outbound requests except CDN load for SheetJS. | ✅ Pass | P1 - Critical | US-01 |
| TC-66 | Large dataset performance | Dataset with 500+ rows | Upload file, run validation | Completes within 5 seconds. No browser freeze. | ✅ Pass | P2 - High | N/A |
| TC-67 | Multi-site dataset | Dataset with rows from two sites | Upload file, run validation | All rows processed correctly. Both sites in breakdown table. | ✅ Pass | P2 - High | US-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.
| TC ID | Description | Preconditions | Test Steps | Expected Result | Result | Priority | Story Ref |
|---|---|---|---|---|---|---|---|
| TC-68 | REGRESSION: Trailing dash bug | Any dataset where Subtype is empty for some rows | Upload file, run validation. Check Input Damage Type for empty-Subtype rows | Input Damage Type = 'Crack' not 'Crack - '. Correct conversion output. (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-11 |
| TC-69 | REGRESSION: Dataset B Component+Element | Dataset 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) | ✅ Pass | P1 - Critical | US-10,US-13 |
| TC-70 | REGRESSION: Dataset B Anomaly Type col | Dataset 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) | ✅ Pass | P1 - Critical | US-11,US-13 |
| TC-71 | REGRESSION: ISBLANK vs LEN in XLSX | Exported XLSX from any dataset | Inspect Input Component formula for empty-Material row | Formula shows IF(LEN(...)>0,...) not IF(ISBLANK(...),...). (Bug fixed v2.1) | ✅ Pass | P1 - Critical | US-10,US-11 |
| TC-72 | REGRESSION: Blade Side codes accepted | Dataset with LE, TE, PS, SS values | Upload file, run validation | Codes accepted as valid. No Blade Side errors. (Fix from v1.2) | ✅ Pass | P2 - High | US-05 |
QA Sign-off
| Role | Name | Date | Sign-off |
|---|---|---|---|
| QA / Tester | May 2026 | ⬜ Pending | |
| Data Operations Lead | May 2026 | ⬜ Pending | |
| Engineering Lead | May 2026 | ⬜ Pending |