STD: Config Import/Export (CONFIGIO)
Version: v1.0.0 Status: Draft SRS Source:
docusaurus/docs/srs/configio.mdDomain: CONFIGIO
Overview
This document specifies tests for the Configuration Import/Export domain, which covers bulk configuration management via XLSX spreadsheet import and export operations across 14+ configuration types (expanded to 22 REQs in v3.1.0).
Domain Characteristics:
- Primary function: Backend file parsing, validation, and data persistence
- Secondary function: Status report generation and notification
- Configuration dependency: Multiple toggle settings (extraction instruments, role priority, sample type)
Test Method Rationale: Per Test Plan Section 3.2, Configuration import/export uses TM-API as primary method. Import/export operations are backend file I/O with deterministic validation logic testable without UI. TM-UI used for notification display verification, upload workflow, page stability after import, and data persistence across SPA navigation (REQ-CONFIGIO-001). TM-MAN used for keyboard shortcut verification (REQ-CONFIGIO-002).
Test Case Convention: Steps describe logical actions, not UI mechanics. Use "Import configuration file with data X" or "Verify row status is Ignored", not "Click upload button" or "Check the value in cell A1". This ensures test intent survives UI redesigns.
Coverage Summary
| REQ ID | Title | ACs | Tests | AC Coverage | Method | Gaps |
|---|---|---|---|---|---|---|
| REQ-CONFIGIO-001 | Generate Import Status Reports | 4 | TC-CONFIGIO-001, TC-CONFIGIO-040, TC-CONFIGIO-041, TC-CONFIGIO-042, TC-CONFIGIO-B006, TC-CONFIGIO-B007, TC-CONFIGIO-B011 | 4/4 (100%) | TM-HYB | None |
| REQ-CONFIGIO-002 | Export Customer-Friendly Configuration | 3 | TC-CONFIGIO-002 | 3/3 (100%) | TM-HYB | None |
| REQ-CONFIGIO-003 | Import/Export Mixes and Targets | 14 | TC-CONFIGIO-003, TC-CONFIGIO-004, TC-CONFIGIO-005 | 14/14 (100%) | TM-API | None |
| REQ-CONFIGIO-004 | Import/Export Combined Outcomes | 14 | TC-CONFIGIO-006, TC-CONFIGIO-007, TC-CONFIGIO-008 | 14/14 (100%) | TM-API | None |
| REQ-CONFIGIO-005 | Import/Export Control Labels | 7 | TC-CONFIGIO-009, TC-CONFIGIO-010 | 7/7 (100%) | TM-API | None |
| REQ-CONFIGIO-006 | Import/Export Error Codes | 4 | TC-CONFIGIO-011 | 4/4 (100%) | TM-API | None |
| REQ-CONFIGIO-007 | Import/Export Error Resolutions | 5 | TC-CONFIGIO-012 | 5/5 (100%) | TM-API | None |
| REQ-CONFIGIO-008 | Import/Export Help Items Tags | 3 | TC-CONFIGIO-013 | 3/3 (100%) | TM-API | None |
| REQ-CONFIGIO-009 | Import/Export Rules Configuration | 7 | TC-CONFIGIO-014, TC-CONFIGIO-015 | 7/7 (100%) | TM-API | None |
| REQ-CONFIGIO-010 | Import/Export QIR Quantification Settings | 8 | TC-CONFIGIO-016, TC-CONFIGIO-017 | 8/8 (100%) | TM-API | None |
| REQ-CONFIGIO-011 | Validate Westgard Limits on Import | 3 | TC-CONFIGIO-018 | 3/3 (100%) | TM-API | None |
| REQ-CONFIGIO-012 | Import Reporting Cut-offs | 5 | TC-CONFIGIO-019 | 5/5 (100%) | TM-API | None |
| REQ-CONFIGIO-013 | Import/Export LIMS Export Configuration | 3 | TC-CONFIGIO-020 | 3/3 (100%) | TM-API | None |
| REQ-CONFIGIO-014 | Apply Extraction Instruments Toggle | 3 | TC-CONFIGIO-021 | 3/3 (100%) | TM-API | None |
| REQ-CONFIGIO-015 | Global/Strict Config Import/Export Pattern | 13 | TC-CONFIGIO-032, TC-CONFIGIO-033, TC-CONFIGIO-034, TC-CONFIGIO-035 | 13/13 (100%) | TM-API | None |
| REQ-CONFIGIO-016 | Control Labels Enhanced Columns | 9 | TC-CONFIGIO-036 | 9/9 (100%) | TM-API | None |
| REQ-CONFIGIO-017 | Control Labels Re-import Behavior | 6 | TC-CONFIGIO-037 | 6/6 (100%) | TM-API | None |
| REQ-CONFIGIO-018 | Mix/Targets Quantification Scope Import/Export | 12 | TC-CONFIGIO-038, TC-CONFIGIO-039 | 12/12 (100%) | TM-API | None |
| REQ-CONFIGIO-019 | Cross Contamination Limits Import Validation | 2 | TC-CONFIGIO-043 | 2/2 (100%) | TM-API | None |
| REQ-CONFIGIO-020 | Automatic Rule Mappings Export Sheet | 3 | TC-CONFIGIO-044 | 3/3 (100%) | TM-API | None |
| REQ-CONFIGIO-021 | Target Name Suffix Import Sheet | 6 | TC-CONFIGIO-045 | 6/6 (100%) | TM-API | None |
| REQ-CONFIGIO-022 | Config Import Progress Indicator | 2 | TC-CONFIGIO-046 | 2/2 (100%) | TM-HYB | None |
Totals: 22 REQs, 186 ACs, 49 Test Cases, 100% Coverage
Test Cases
TC-CONFIGIO-001: Import status report generation and notification
Verifies: REQ-CONFIGIO-001 (AC1, AC2, AC3, AC4)
Method: TM-HYB (API for import, UI for notification verification)
Priority: High
Preconditions:
- User logged in with Administrator role
- Test XLSX file prepared with mix of valid and invalid rows
Test Data:
- Mixes and Targets sheet with:
- Row 1: Valid mix/target configuration
- Row 2: Valid mix/target configuration
- Row 3: Invalid (MINIMUM FLUORESCENCE exceeds precision)
Steps:
- Import configuration file via API endpoint
- Retrieve import result notification
- Download generated status report
Expected Results:
- AC1: Notification displays sheet name, imported count (2), ignored count (1)
- AC2: Downloaded report contains Status column appended to original data
- AC3: Row 1 Status = "Imported", Row 2 Status = "Imported"
- AC4: Row 3 Status = "Ignored" with reason "Value exceeds maximum precision"
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3714
TC-CONFIGIO-002: Customer-friendly configuration export
Verifies: REQ-CONFIGIO-002 (AC1, AC2, AC3)
Method: TM-HYB (API for export verification, manual for keyboard shortcut)
Priority: Medium
Preconditions:
- User logged in with Administrator role
- At least one kit configuration exists
- Site name configured as "TestSite"
Steps:
- Trigger customer-friendly export via API
- Verify downloaded file
- Navigate to Kit Configurations page
- Press P key (keyboard shortcut verification - manual)
Expected Results:
- AC1: System generates XLSX file with customer-friendly configuration data
- AC2: Filename matches pattern
customer-friendly-kit-configurations-TestSite.xlsx - AC3: Keyboard shortcut P triggers export (manual verification)
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: [Pending]
TC-CONFIGIO-003: Mixes and Targets import - column support and precision validation
Verifies: REQ-CONFIGIO-003 (AC1, AC2, AC3)
Method: TM-API
Priority: High
Preconditions:
- Administrator role
- Mix "TestMix" exists
Test Data:
| Scenario | MINIMUM FLUORESCENCE | IS QUANTITATIVE | Expected |
|---|---|---|---|
| Valid precision | 100000.123456 | TRUE | Imported |
| Max precision | 1234567890123456.1234567890123456 | FALSE | Imported |
| Exceeds precision | 12345678901234567.12345678901234567 | TRUE | Ignored |
| Invalid boolean | 100 | YES | Ignored |
| Valid boolean false | 100 | FALSE | Imported |
Steps:
- Prepare XLSX with test data rows
- Import via API endpoint
- Query database for imported values
- Retrieve status report
Expected Results:
- AC1: MINIMUM FLUORESCENCE, IS QUANTITATIVE, and other columns supported
- AC2: Precision validation rejects values exceeding 16 integer + 16 decimal places
- AC3: IS QUANTITATIVE validated as boolean (TRUE/FALSE only)
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3562
TC-CONFIGIO-004: Mixes and Targets import - passive target and threshold validation
Verifies: REQ-CONFIGIO-003 (AC4, AC5, AC6, AC7)
Method: TM-API
Priority: High
Preconditions:
- Mix "TestMix" with targets "TargetA", "TargetB", "TargetC"
Test Data:
| Scenario | Mix | Target | is_passive | Expected Threshold | Expected Result |
|---|---|---|---|---|---|
| Single passive | TestMix | TargetA | true | 500 | Imported |
| Multiple passive (row 1) | TestMix2 | TargetA | true | 500 | All rejected |
| Multiple passive (row 2) | TestMix2 | TargetB | true | 600 | All rejected |
| Non-passive threshold | TestMix | TargetC | false | 50000000 | Imported |
| Passive threshold > 1000 | TestMix | TargetA | true | 1500 | Ignored |
| Non-passive threshold > 100M | TestMix | TargetC | false | 150000000 | Ignored |
Steps:
- Import XLSX with passive target scenarios
- Verify mix rejection for multiple passive targets
- Verify threshold validation per passive status
Expected Results:
- AC4: Expected Threshold validated as whole number within configured range
- AC5: Each mix has at most one passive target enforced
- AC6: Passive target threshold validated as > 0 and <= 1000
- AC7: Non-passive target threshold validated as > 0 and <= 100000000
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-4677
TC-CONFIGIO-005: Mixes and Targets import - MAX CT, PREPEND CYCLES, and cross-field dependency validation
Verifies: REQ-CONFIGIO-003 (AC8, AC9, AC10, AC11, AC12, AC13, AC14)
Method: TM-API
Priority: Medium
Preconditions:
- Mix exists with multiple targets
Test Data (MAX CT and PREPEND CYCLES):
| MAX CT FOR CLS | MAX CT FOR CT | PREPEND CYCLES | Expected |
|---|---|---|---|
| null | null | 0 | Imported |
| 30 | 45 | 5 | Imported |
| 0 | 50 | 3 | Ignored (MAX CT < 1) |
| 101 | 50 | 3 | Ignored (MAX CT > 100) |
| 50 | 50 | -1 | Ignored (negative PREPEND) |
| 50 | 50 | 2.5 | Ignored (non-integer PREPEND) |
Test Data (Cross-Field Dependencies — @V3_1_0):
| CHECK CLS DISCREPANCY | CT DISCREPANCY DELTA | CALIBRATION FILE PATH | Expected |
|---|---|---|---|
| TRUE | (empty) | /path/to/bson | Imported |
| TRUE | (empty) | (empty) | Ignored — "Bson is required to enable check cls discrepancy" |
| FALSE | (empty) | (empty) | Imported |
| (empty) | 2.5 | /path/to/bson | Imported |
| (empty) | 2.5 | (empty) | Ignored — "Bson is required to enable check ct discrepancy" |
| TRUE | 2.5 | /path/to/bson | Imported |
| TRUE | 2.5 | (empty) | Ignored — both cross-field errors |
Steps:
- Import XLSX with MAX CT and PREPEND CYCLES test cases
- Verify validation rules applied
- Verify export includes all columns
- Import XLSX with cross-field dependency test cases (@V3_1_0)
- Verify CHECK CLS DISCREPANCY requires CALIBRATION FILE PATH
- Verify CT DISCREPANCY DELTA requires CALIBRATION FILE PATH
Expected Results:
- AC8: MAX CT values validated as numeric between 1 and 100, allowing null
- AC9: PREPEND CYCLES validated as non-negative integer
- AC10: Invalid rows rejected with appropriate error messages
- AC11: Export includes all configured values for supported columns
- AC12: Round-trip import/export preserves all data
- AC13 (@V3_1_0): CHECK CLS DISCREPANCY = TRUE without CALIBRATION FILE PATH rejected with "Bson is required to enable check cls discrepancy"
- AC14 (@V3_1_0): CT DISCREPANCY DELTA non-empty without CALIBRATION FILE PATH rejected with "Bson is required to enable check ct discrepancy"
Automation Status: Manual (XLSX column validation — config import/export content verification)
TC-CONFIGIO-006: Combined Outcomes import - role and outcome type validation
Verifies: REQ-CONFIGIO-004 (AC1, AC2, AC3, AC4)
Method: TM-API
Priority: High
Preconditions:
- Roles configured: "SampleRole" (Sample type), "ControlRole" (Control type), "IgnoreRole" (Ignore type)
- Error codes configured: "ERR001", "ERR002"
- LIMS codes configured: "LIMS001"
Test Data:
| ROLE | OUTCOME TYPE | Expected |
|---|---|---|
| (blank) | Error | Ignored - ROLE required |
| NonExistent | Error | Ignored - ROLE not found |
| IgnoreRole | Error | Ignored - Ignore-typed not allowed |
| SampleRole | Error | Imported |
| ControlRole | Invalid | Ignored - invalid OUTCOME TYPE |
| ControlRole | Error | Imported |
| ControlRole | Lims | Ignored - Control can only have Error |
Steps:
- Import XLSX with role and outcome type test cases
- Verify validation rules applied
Expected Results:
- AC1: Import/Export supports MIX, TARGET, ROLE, OUTCOME TYPE columns
- AC2: ROLE validated as required, existing, and not Ignore-typed
- AC3: OUTCOME TYPE validated as required ("Error" or "Lims")
- AC4: Control-typed roles can only have "Error" outcome type
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-4239
TC-CONFIGIO-007: Combined Outcomes import - code and target validation
Verifies: REQ-CONFIGIO-004 (AC5, AC6, AC7)
Method: TM-API
Priority: High
Preconditions:
- Same as TC-CONFIGIO-006
- TARGET ERROR CODE "TERR001" exists
- Mix "TestMix" has target "TargetA"
Test Data:
| ROLE Type | TARGET ERROR CODE | TARGET TO HAVE ERROR | Expected |
|---|---|---|---|
| Sample | TERR001 | TargetA | Ignored - Sample cannot have TARGET ERROR CODE |
| Sample | (empty) | (empty) | Imported |
| Control | TERR001 | TargetA | Imported |
| Control | (empty) | (empty) | Imported |
| Control | TERR001 | TargetX (not in mix) | Ignored - target not in mix |
Steps:
- Import XLSX with code and target validation cases
- Verify TARGET ERROR CODE rules per role type
- Verify TARGET TO HAVE ERROR belongs to specified mix
Expected Results:
- AC5: WELL ERROR CODE / LIMS CODE validated against appropriate configuration
- AC6: TARGET ERROR CODE must be empty for Sample-typed roles
- AC7: TARGET TO HAVE ERROR validated as belonging to specified mix
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3885
TC-CONFIGIO-008: Combined Outcomes import - priority, discrepancy, and IC Failed
Verifies: REQ-CONFIGIO-004 (AC8, AC9, AC10, AC11, AC12, AC13, AC14)
Method: TM-API
Priority: Medium
Preconditions:
- Existing combined outcomes at priorities 1, 2, 3
Test Data:
| PRIORITY | CLS DISCREPANCY | CT DISCREPANCY | IC FAILED | Expected |
|---|---|---|---|---|
| abc | (blank) | (blank) | false | Ignored - PRIORITY non-numeric |
| 2 | (blank) | (blank) | false | Imported - existing priorities shifted |
| 5 | TRUE | FALSE | true | Imported |
| 6 | YES | (blank) | false | Ignored - invalid boolean |
| 7 | (blank) | (blank) | true | Imported |
Steps:
- Import XLSX with priority and discrepancy test cases
- Verify priority merging shifts existing rows
- Verify discrepancy fields accept boolean or blank
- Export and verify IC FAILED preserved
Expected Results:
- AC8: PRIORITY validated as numeric
- AC9: Imported priorities merge, shifting existing rows
- AC10: Discrepancy required fields validated as boolean or blank
- AC11: Blank discrepancy values interpreted as "Any"
- AC12: Multi-run combined outcome feature disabled when discrepancy used
- AC13: Export includes all configured combined outcomes
- AC14: IC FAILED value preserved during round-trip
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-5230
TC-CONFIGIO-009: Control Labels import - backup mixes and wildcard validation
Verifies: REQ-CONFIGIO-005 (AC1, AC2, AC3)
Method: TM-API
Priority: High
Preconditions:
- Mixes "Mix1", "Mix2", "Mix3" exist
Test Data:
| BACKUP MIXES | LABELS_IN_IMPORTED_RUNFILE | Expected |
|---|---|---|
| Mix1|Mix2 | POS* | Imported |
| Mix1|Mix2|Mix3 | *SARS-CoV-2 PC | Imported |
| Mix1 | Ne*g | Ignored - wildcard in middle |
| Mix1 | TestLabelEnd | Ignored - wildcard in middle |
| Mix1 | * | Imported (wildcard at start only) |
Steps:
- Import XLSX with backup mixes and wildcard patterns
- Verify pipe-separated format for BACKUP MIXES
- Verify wildcard validation rules
Expected Results:
- AC1: BACKUP MIXES, LABELS_IN_IMPORTED_RUNFILE columns supported
- AC2: BACKUP MIXES formatted as pipe-separated mix names
- AC3: Wildcard "*" rejected when in middle of role alias
Automation Status: Manual (XLSX column validation — config import/export content verification)
TC-CONFIGIO-010: Control Labels import - IC delta check and resolution priority
Verifies: REQ-CONFIGIO-005 (AC4, AC5, AC6, AC7)
Method: TM-API
Priority: Medium
Preconditions:
- Control roles of types: Sample, Ignore, Crossover, Control
- Client config "Use role priority for resolution" initially disabled
Test Data:
| Role Type | EXCLUDE FROM IC DELTA CHECK | RESOLUTION PRIORITY | Config Enabled | Expected |
|---|---|---|---|---|
| Control | Yes | 5 | true | Imported |
| Control | No | 5 | false | Imported (priority ignored) |
| Sample | Yes | 5 | true | Ignored - Sample cannot have priority |
| Ignore | Yes | 5 | true | Ignored - Ignore cannot have priority |
| Crossover | No | 5 | true | Ignored - Crossover cannot have priority |
| Control | Invalid | (empty) | false | Ignored - invalid IC value |
Steps:
- Import with "Use role priority" disabled, verify priority ignored
- Enable "Use role priority", reimport
- Verify role type restrictions on resolution priority
- Export and verify all columns included
Expected Results:
- AC4: EXCLUDE FROM IC DELTA CHECK validated as Yes/No/empty
- AC5: RESOLUTION PRIORITY only imported when config enabled
- AC6: Sample, Ignore, Crossover roles cannot have resolution priority
- AC7: Export includes all configured values
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-5303
TC-CONFIGIO-011: Error Codes import and export
Verifies: REQ-CONFIGIO-006 (AC1, AC2, AC3, AC4)
Method: TM-API
Priority: Medium
Preconditions:
- User has Super Administrator role
Test Data:
| ERROR CODE | ERROR TYPE | IS INHIBITED | CAUSES MISSING MIXES |
|---|---|---|---|
| ERR001 | Associate Control Error | true | false |
| ERR002 | Standard Error | false | true |
| ERR003 | Associate Control Error | false | false |
Steps:
- Import XLSX with error code test data
- Query database for imported error codes
- Export error codes configuration
- Verify round-trip data integrity
Expected Results:
- AC1: ERROR CODE, ERROR TYPE, IS INHIBITED, CAUSES MISSING MIXES columns supported
- AC2: ERROR TYPE supports "Associate Control Error" type
- AC3: IS INHIBITED and CAUSES MISSING MIXES imported as boolean
- AC4: Export includes all error codes with configured properties
Automation Status: Manual (XLSX column validation — config import/export content verification)
TC-CONFIGIO-012: Error Resolutions import and export
Verifies: REQ-CONFIGIO-007 (AC1, AC2, AC3, AC4, AC5)
Method: TM-API
Priority: Medium
Preconditions:
- User has Super Administrator role
- Resolvable error "ERR_RESOLVABLE" exists
- Non-resolvable errors ONE_STANDARD_CONTROL, STANDARD_WITHOUT_QUANT exist
Test Data:
| Error | RESOLUTION LEVEL | Expected |
|---|---|---|
| ERR_RESOLVABLE | Well | Imported |
| ERR_RESOLVABLE | All Observations | Imported |
| ERR_RESOLVABLE | Discrepant Observations | Imported |
| ERR_RESOLVABLE | Invalid | Ignored |
| ONE_STANDARD_CONTROL | Well | Ignored - non-resolvable |
| STANDARD_WITHOUT_QUANT | All Observations | Ignored - non-resolvable |
Steps:
- Import XLSX with resolution level test data
- Verify valid resolution levels accepted
- Verify non-resolvable errors rejected
- Export and verify RESOLUTION LEVEL included
Expected Results:
- AC1: RESOLUTION LEVEL column supported
- AC2: RESOLUTION LEVEL validated as "Well", "All Observations", or "Discrepant Observations"
- AC3: Invalid RESOLUTION LEVEL causes row rejection
- AC4: Resolutions cannot be added to non-resolvable errors
- AC5: Export includes RESOLUTION LEVEL for all error resolutions
Automation Status: Manual (XLSX column validation — config import/export content verification)
TC-CONFIGIO-013: Help Items tags import and export
Verifies: REQ-CONFIGIO-008 (AC1, AC2, AC3)
Method: TM-API
Priority: Low
Preconditions:
- Help items exist in system
Test Data:
| HELP ITEM | TAGS | Expected |
|---|---|---|
| HelpItem1 | tag1, tag2, tag3 | Imported with 3 tags |
| HelpItem2 | single-tag | Imported with 1 tag |
| HelpItem3 | (empty) | Imported with empty tags |
| HelpItem4 | (null) | Imported with empty tags |
Steps:
- Import XLSX with help items and tags
- Verify comma-separated tags parsed correctly
- Export help items configuration
- Verify tags formatted as comma-separated or blank
Expected Results:
- AC1: TAGS column supported
- AC2: Multiple tags parsed from comma-separated format
- AC3: Empty/null tags result in empty tags value; export formats correctly
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-014: Rules import - IS ALLOW ERROR WELLS
Verifies: REQ-CONFIGIO-009 (AC1, AC2, AC3, AC4)
Method: TM-API
Priority: Medium
Preconditions:
- Rules configured in system
Test Data:
| Rule | IS ALLOW ERROR WELLS | Expected |
|---|---|---|
| Rule1 | TRUE | Imported with allow_error_wells = true |
| Rule2 | FALSE | Imported with allow_error_wells = false |
| Rule3 | (null) | Imported with allow_error_wells = false |
| Rule4 | (empty) | Imported with allow_error_wells = false |
| Rule5 | Yes | Imported with allow_error_wells = false (treated as non-boolean) |
Steps:
- Import XLSX with IS ALLOW ERROR WELLS values
- Verify null/empty treated as false
- Verify non-boolean treated as false
- Export and verify true/false boolean output
Expected Results:
- AC1: IS ALLOW ERROR WELLS column supported
- AC2: Null/empty values treated as false
- AC3: Non-boolean values treated as false
- AC4: Export includes IS ALLOW ERROR WELLS as true/false
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3559
TC-CONFIGIO-015: Rules import - precedence normalization
Verifies: REQ-CONFIGIO-009 (AC5, AC6, AC7)
Method: TM-API
Priority: High
Preconditions:
- Existing rules with various types and precedences
Test Data:
Import order:
- Rule A: Type=Observation, Precedence=5
- Rule B: Type=Observation, Precedence=5 (duplicate)
- Rule C: Type=Control Check, Precedence=1
- Rule D: Type=Sample Result, Precedence=10
- Rule E: Type=Observation, Precedence=3
Expected normalized global precedence:
- Rule E: 1 (Observation, relative 3)
- Rule A: 2 (Observation, relative 5, first)
- Rule B: 3 (Observation, relative 5, second - later row higher)
- Rule C: 4 (Control Check)
- Rule D: 5 (Sample Result)
Steps:
- Import rules with varying types and relative precedences
- Verify normalization based on rule type order
- Verify gaps removed within types
- Verify duplicate handling (later rows get higher precedence)
Expected Results:
- AC5: Precedence normalized based on rule type and relative precedence
- AC6: Rule type precedence order: Observation(1) < Control Check(2) < Sample Result(3) < Apply Controls(4) < Sample Check(5) < Parse/Import/Reanalysis/General/Reporting(6)
- AC7: Duplicate precedences within type resolved; new imports take priority over existing
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-4054
TC-CONFIGIO-016: QIR Quantification Settings import - column support and basic validation
Verifies: REQ-CONFIGIO-010 (AC1, AC2, AC3, AC4)
Method: TM-API
Priority: High
Preconditions:
- Targets "TargetA", "TargetB" exist in target table
Test Data:
| TARGET | SLOPE | INTERCEPT | Expected |
|---|---|---|---|
| TargetA | 1.5 | 2.4 | Imported |
| TargetA | 1.5 | (null) | Ignored - both required |
| TargetA | (null) | 2.4 | Ignored - both required |
| TargetA | (null) | (null) | Imported (neither provided) |
| NonExistent | 1.5 | 2.4 | Ignored - target not found |
Steps:
- Import XLSX with slope/intercept test cases
- Verify TARGET existence validation
- Verify SLOPE and INTERCEPT must be provided together
Expected Results:
- AC1: TARGET, SLOPE, INTERCEPT, MIN/MAX SLOPE, MIN/MAX EFFICIENCY, MIN R2, MIN CONTROLS columns supported
- AC2: TARGET validated as required and existing
- AC3: SLOPE and INTERCEPT required together (both or neither)
- AC4: Export includes all quantification settings
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3567
TC-CONFIGIO-017: QIR Quantification Settings import - range validation
Verifies: REQ-CONFIGIO-010 (AC5, AC6, AC7, AC8)
Method: TM-API
Priority: Medium
Preconditions:
- Target "TargetA" exists
Test Data:
| MIN SLOPE | MAX SLOPE | MIN EFFICIENCY | MAX EFFICIENCY | MIN R2 | MIN CONTROLS | Expected |
|---|---|---|---|---|---|---|
| 0.5 | 1.5 | 0.8 | 1.2 | 0.95 | 3 | Imported |
| 1.5 | 0.5 | 0.8 | 1.2 | 0.95 | 3 | Ignored - min > max |
| 0.5 | 1.5 | 1.2 | 0.8 | 0.95 | 3 | Ignored - min > max |
| (null) | (null) | (null) | (null) | 0.5 | 2 | Imported |
| 0.5 | 1.5 | 0.8 | 1.2 | -0.1 | 3 | Ignored - MIN R2 < 0 |
| 0.5 | 1.5 | 0.8 | 1.2 | 1.5 | 3 | Ignored - MIN R2 > 1 |
| 0.5 | 1.5 | 0.8 | 1.2 | 0.95 | 1 | Ignored - MIN CONTROLS < 2 |
Steps:
- Import XLSX with range validation test cases
- Verify MIN/MAX comparisons
- Verify MIN R2 range (0-1)
- Verify MIN CONTROLS minimum (>= 2)
Expected Results:
- AC5: MIN/MAX SLOPE validated as null or decimal with min <= max
- AC6: MIN/MAX EFFICIENCY validated as null or decimal with min <= max
- AC7: MIN R2 validated as null or decimal between 0 and 1
- AC8: MIN CONTROLS validated as null or integer >= 2
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3567
TC-CONFIGIO-018: Westgard Limits import - SD validation
Verifies: REQ-CONFIGIO-011 (AC1, AC2, AC3)
Method: TM-API
Priority: Medium
Preconditions:
- Westgard configuration exists
Test Data:
| SD Value | Expected |
|---|---|
| 0.5 | Imported |
| 1.0 | Imported |
| 0 | Ignored |
| -0.5 | Ignored |
| (null) | Ignored |
Steps:
- Import XLSX with various SD values
- Verify validation rejects SD = 0 and SD < 0
- Verify valid SD > 0 imported
Expected Results:
- AC1: SD validated as number greater than 0
- AC2: Rows with SD = 0 ignored
- AC3: Rows with valid SD > 0 imported
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-019: Reporting Cut-offs import - specimen type validation
Verifies: REQ-CONFIGIO-012 (AC1, AC2, AC3, AC4, AC5)
Method: TM-API
Priority: Medium
Preconditions:
- Mix "TestMix" exists
- Specimen "SpecimenA" has test code mapping for TestMix
- Specimen "SpecimenB" does NOT have mapping for TestMix
Test Data with "use sample type" ENABLED:
| Mix | SPECIMEN TYPE | Expected |
|---|---|---|
| TestMix | SpecimenA | Imported with specimen association |
| TestMix | SpecimenB | Ignored - no mapping |
| TestMix | (empty) | Imported without specimen association |
Test Data with "use sample type" DISABLED:
| Mix | SPECIMEN TYPE | Expected |
|---|---|---|
| TestMix | SpecimenA | Ignored - specimen not allowed |
| TestMix | (empty) | Imported |
Steps:
- Enable "use sample type" config
- Import with specimen type scenarios
- Disable "use sample type" config
- Import with specimen type scenarios
Expected Results:
- AC1: SPECIMEN TYPE column supported
- AC2: When enabled, rows with valid specimen/mix mapping imported with association
- AC3: When enabled, rows without specimen imported without association
- AC4: When disabled, rows with specimen rejected
- AC5: When disabled, rows without specimen imported normally
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-4293
TC-CONFIGIO-020: LIMS Export configuration import and export
Verifies: REQ-CONFIGIO-013 (AC1, AC2, AC3)
Method: TM-API
Priority: Medium
Preconditions:
- LIMS export codes exist
Test Data:
| Code | IS INHIBITED | CAUSES MISSING MIXES | DOES PREVENT ANALYSE |
|---|---|---|---|
| LIMS001 | true | false | YES |
| LIMS002 | false | true | NO |
| LIMS003 | true | true | YES |
Steps:
- Import XLSX with LIMS export configuration
- Verify boolean columns imported correctly
- Verify DOES PREVENT ANALYSE accepts YES/NO
- Export and verify all properties included
Expected Results:
- AC1: IS INHIBITED, CAUSES MISSING MIXES, DOES PREVENT ANALYSE columns supported
- AC2: DOES PREVENT ANALYSE accepts YES/NO values
- AC3: Import creates/updates entries; export includes all properties
Automation Status: Manual (XLSX column validation — config import/export content verification)
TC-CONFIGIO-021: Extraction Instruments toggle impact on Westgard import
Verifies: REQ-CONFIGIO-014 (AC1, AC2, AC3)
Method: TM-API
Priority: High
Preconditions:
- Westgard configuration exists
Test Data:
| Row | Has Extraction Instruments | Toggle ON Result | Toggle OFF Result |
|---|---|---|---|
| 1 | Yes | Imported | Ignored |
| 2 | No | Ignored | Imported |
| 3 | Yes | Imported | Ignored |
| 4 | No | Ignored | Imported |
Steps:
- Set "Use Extraction Instruments" toggle ON
- Import Westgard configuration
- Verify rows without Extraction Instruments ignored
- Set toggle OFF
- Import same configuration
- Verify rows with Extraction Instruments ignored
- Check import report for "Ignored" status
Expected Results:
- AC1: Toggle ON - rows without Extraction Instruments ignored
- AC2: Toggle OFF - rows with Extraction Instruments ignored
- AC3: Ignored rows show status "Ignored" in import report
Automation Status: Manual (XLSX column validation — config import/export content verification)
Jira: BT-3713
TC-CONFIGIO-022: Mixes and Targets column validation (Phase B2)
Verifies: REQ-CONFIGIO-003 (Column ACs from CONFIG_COVERAGE_FIXES.md Phase B2)
Method: TM-API
Priority: High
Preconditions:
- Mix "TestMix" exists with targets
- Import file prepared with column test scenarios
Test Data:
| Column | Scenario | Value | Expected Status | Expected Error |
|---|---|---|---|---|
| QUANTITATIVE | Invalid | ABC | Ignored | "Invalid quantification" |
| QUANTITATIVE | Inconsistent in mix | true/false | Ignored | "Multiple quantification settings" |
| TARGET ORDER | Partial | 1,(empty),3 | Ignored | "Must fill all orders or not fill at all" |
| TARGET ORDER | Non-numeric | ABC | Ignored | "Order must be numeric" |
| PREFERRED RESULT PROVIDER | Invalid | OTHER | Ignored | Invalid provider error |
| EXPECTED THRESHOLD | Passive >1000 | 1500 | Ignored | Threshold range error |
Steps:
- Import XLSX with column validation test cases
- Retrieve status report
- Verify each row's status and error message
Expected Results:
- QUANTITATIVE invalid: Rejected with "Invalid quantification"
- QUANTITATIVE inconsistent: Rejected with "Multiple quantification settings"
- TARGET ORDER partial: Rejected with "Must fill all orders or not fill at all"
- TARGET ORDER non-numeric: Rejected with "Order must be numeric"
- PREFERRED RESULT PROVIDER invalid: Rejected with invalid provider error
- EXPECTED THRESHOLD out of range: Rejected with threshold range error
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-023: Combined Outcomes column validation (Phase B1)
Verifies: REQ-CONFIGIO-004 (Column ACs from CONFIG_COVERAGE_FIXES.md Phase B1)
Method: TM-API
Priority: High
Preconditions:
- Mixes, targets, error codes, LIMS statuses configured
- Specimens configured
Test Data (Mix Result Level):
| Column | Scenario | Expected Error |
|---|---|---|
| ALLOW OTHER RUNS TO BE USED | Invalid | "Invalid 'other runs to be used' value" |
| ALLOW OTHER RUNS TO BE USED | With discrepancy | "'Use other runs' not allowed because CLS discrepancy or CT discrepancy is required" |
| IS REPEAT | Invalid | "Invalid is repeat" |
| MIX MISSING | Inconsistent | "mix_missing values must be consistent" |
| MIX LEVEL OUTCOME TYPE | Without code | "mix level: well error code or lims code filled without selecting outcome type" |
| REQUIRED HISTORY OUTCOMES | Without repeat | "Previous well outcomes are not allowed" |
| REQUIRED HISTORY OUTCOMES | Invalid outcome | "previous well outcomes are invalid" |
Test Data (Target Result Level):
| Column | Scenario | Expected Error |
|---|---|---|
| RESULT | Invalid | "Result not found" |
| MIN CT | Non-integer | "CT value is not integer" |
| MIN CT | Out of range | "CT is not in valid range" |
| MAX CT | Less than MIN | "Max CT is not greater than to min CT" |
| MIN QUANTITY | Not numeric | "Quantity is not numeric" |
| MAX QUANTITY | Less than MIN | "Max quantity is not greater than to min quantity" |
| SPECIMEN | Invalid (enabled) | "Invalid specimen name" |
| SPECIMEN | Filled (disabled) | "Specimen is filled when 'use sample type' config is disabled" |
Steps:
- Import Combined Outcomes with column validation test cases
- Retrieve status report
- Verify error messages match specification
Expected Results:
- All documented error messages produced for invalid scenarios
- Mix result level validations enforced
- Target result level validations enforced
- Cross-field validations (CT range, quantity range) enforced
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-024: Error Resolutions column validation (Phase B3)
Verifies: REQ-CONFIGIO-007 (Column ACs from CONFIG_COVERAGE_FIXES.md Phase B3)
Method: TM-API
Priority: High
Preconditions:
- Resolution message numbers configured
- LIMS statuses configured
Test Data:
| RESOLUTION NUMBER | OTHER WELLS AFFECTED | Expected Error |
|---|---|---|
| (empty) | DETECTED | "Resolution number is not filled" |
| 99 (invalid) | DETECTED | "No matching resolution message" |
| 1 | ALL WELLS,DETECTED | "Can't have other lims along with all wells" |
Steps:
- Import Error Resolutions with column validation test cases
- Retrieve status report
- Verify error messages match specification
Expected Results:
- RESOLUTION NUMBER empty: "Resolution number is not filled"
- RESOLUTION NUMBER invalid: "No matching resolution message"
- OTHER WELLS AFFECTED with ALL WELLS + others: "Can't have other lims along with all wells"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-025: Error Codes DEFAULT LIMS EXPORT validation (Phase B4)
Verifies: REQ-CONFIGIO-006 (DEFAULT LIMS EXPORT column AC from CONFIG_COVERAGE_FIXES.md Phase B4)
Method: TM-API
Priority: High
Preconditions:
- LIMS status codes configured
Test Data:
| ERROR CODE | DEFAULT LIMS EXPORT | Expected |
|---|---|---|
| ERR001 | DETECTED | Imported |
| ERR002 | NONEXISTENT | Ignored - "Default Lims Status does not match with any available Lims Statuses" |
Steps:
- Import Error Codes with DEFAULT LIMS EXPORT test cases
- Retrieve status report
- Verify validation error message
Expected Results:
- Valid LIMS status: Row imported
- Invalid LIMS status: Rejected with "Default Lims Status does not match with any available Lims Statuses"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-026: Westgard Limits DYE and RANGE START DATE validation (Phase C7)
Verifies: REQ-CONFIGIO-011 (DYE, RANGE START DATE column ACs from CONFIG_COVERAGE_FIXES.md Phase C7)
Method: TM-API
Priority: Medium
Preconditions:
- Mixes with targets and dyes configured
Test Data:
| TARGET | DYE | RANGE START DATE | Expected |
|---|---|---|---|
| Global | (empty) | 2026-01-15 | Imported |
| TargetA | FAM | 2026-01-15 | Imported |
| TargetA | INVALID | 2026-01-15 | Ignored - invalid DYE |
| TargetA | FAM | (empty) | Ignored |
| TargetA | FAM | invalid | Ignored - "Invalid date format..." |
Steps:
- Import Westgard Limits with DYE and date test cases
- Retrieve status report
- Verify error messages
Expected Results:
- DYE not required when TARGET is "Global"
- DYE required when TARGET is specific
- RANGE START DATE required, accepts string or Excel serial
- Invalid date: "Invalid date format. Expected a valid date string or Excel serial number."
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-027: Help Items full column validation (Phase C1)
Verifies: REQ-CONFIGIO-008 (Full column ACs from CONFIG_COVERAGE_FIXES.md Phase C1)
Method: TM-API
Priority: Medium
Preconditions:
- Help videos configured
- Valid page names in system
Test Data:
| ORDER | TITLE | DESCRIPTION | VIDEO | PAGES AVAILABLE | Expected |
|---|---|---|---|---|---|
| 1 | Help 1 | Desc 1 | video1 | Run Files | Imported |
| (empty) | Help 2 | Desc 2 | (empty) | Run Files | Ignored - "Help item: ignored" |
| 2 | (empty) | Desc 2 | (empty) | Run Files | Ignored - "Help item: ignored" |
| 3 | Help 3 | (empty) | (empty) | Run Files | Ignored - "Help item: ignored" |
| 4 | Help 4 | Desc 4 | invalid_video | Run Files | Ignored - "Help item: ignored" |
| 5 | Help 5 | Desc 5 | (empty) | Invalid Page | Ignored - "Help item: ignored" |
Steps:
- Import Help Items with column validation test cases
- Retrieve status report
- Verify all required columns enforced
Expected Results:
- ORDER required and unique
- TITLE required
- DESCRIPTION required
- VIDEO optional, must match existing HelpVideo
- PAGES AVAILABLE required, must be valid page names
- Invalid rows: "Help item: ignored"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-028: Rules and Rules Mapping column validation (Phase C5/C6)
Verifies: REQ-CONFIGIO-009 (Column ACs from CONFIG_COVERAGE_FIXES.md Phase C5/C6)
Method: TM-API
Priority: Medium
Preconditions:
- Rules configured with programmatic names
- Mixes with targets and dyes configured
Test Data (Rules):
| PROGRAMMATIC RULE NAME | RULE DESCRIPTION | Expected |
|---|---|---|
| (empty) | Description | Ignored |
| RULE_NAME | (empty) | Ignored |
Test Data (Rules Mapping):
| RULE ID | MIX | TARGET | DYE | Expected Error |
|---|---|---|---|---|
| (empty) | Mix1 | TargetA | FAM | "Rule id is not filled" |
| NONEXISTENT | Mix1 | TargetA | FAM | "No matching rule" |
| RULE_NAME | Mix1 | TargetA | (empty) | "Invalid mix and dye combination" |
| RULE_NAME | Mix1 | NONEXISTENT | FAM | "No matching target" |
Steps:
- Import Rules with validation test cases
- Import Rules Mapping with validation test cases
- Verify error messages match specification
Expected Results:
- Rules: PROGRAMMATIC RULE NAME and RULE DESCRIPTION required
- Rules Mapping: RULE ID required, must match existing rule
- Rules Mapping: DYE required when TARGET is not "global"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-029: Control Labels export column validation (Phase C3)
Verifies: REQ-CONFIGIO-005 (Export column ACs from CONFIG_COVERAGE_FIXES.md Phase C3)
Method: TM-API
Priority: Medium
Preconditions:
- Control labels with roles configured
Steps:
- Export Control Labels via API
- Verify export file contains ROLE TYPE and IS EXTRACTED columns
- Verify values are derived from Role entity
Expected Results:
- Export includes ROLE TYPE column (derived from Role)
- Export includes IS EXTRACTED column (derived from Role.has_extraction)
- ROLE TYPE and IS EXTRACTED are read-only (not used during import)
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-030: Reporting Cut-offs QUANT OR CT validation (Phase F3)
Verifies: REQ-CONFIGIO-012 (QUANT OR CT column AC from CONFIG_COVERAGE_FIXES.md Phase F3)
Method: TM-API
Priority: Medium
Preconditions:
- Mixes configured
Test Data:
| MIX | TARGET | QUANT OR CT | UPPER BOUNDARY | Expected |
|---|---|---|---|---|
| Mix1 | TargetA | Quant | 1000 | Imported |
| Mix1 | TargetA | Ct | 35 | Imported |
| Mix1 | TargetA | (empty) | 1000 | Ignored - "Quant or Ct is not present" |
| Mix1 | TargetA | Invalid | 1000 | Ignored - "Invalid option" |
Steps:
- Import Reporting Cut-offs with QUANT OR CT test cases
- Retrieve status report
- Verify error messages
Expected Results:
- QUANT OR CT required, valid values: "Quant" or "Ct"
- Empty value: "Quant or Ct is not present"
- Invalid value: "Invalid option"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-031: LIMS Export RESULT column validation (Phase F4)
Verifies: REQ-CONFIGIO-013 (RESULT column AC from CONFIG_COVERAGE_FIXES.md Phase F4)
Method: TM-API
Priority: Medium
Preconditions:
- LIMS export codes configured
Test Data:
| CODE | MESSAGE | TYPE | RESULT | Expected |
|---|---|---|---|---|
| LIMS001 | Detected | Exclude | DETECTED | Imported |
| LIMS002 | Not Detected | Warning | NOT_DETECTED | Imported |
| LIMS003 | Unknown | Information | (empty) | Imported (null result) |
| LIMS004 | Invalid | Warning | INVALID | Ignored - "Lims status: ignored" |
Steps:
- Import LIMS Export configuration with RESULT column test cases
- Retrieve status report
- Verify RESULT validation
Expected Results:
- RESULT optional, valid values: "DETECTED", "NOT_DETECTED", or null
- Invalid RESULT: Row rejected with "Lims status: ignored"
Automation Status: Planned
Jira: Pending
TC-CONFIGIO-032: Global/Strict pattern — Reporting Cut-offs import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-015 (Import AC1-AC3, Export AC1-AC2, Mapper AC1, Orphan AC1-AC2, Entity: Reporting Cut-offs)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB", "TargetC" exists
- Quantitative reporting cut-offs configured
Test Data (Import):
| MIX | TARGET | DYE | QUANT OR CT | UPPER BOUNDARY | Expected |
|---|---|---|---|---|---|
| Global | Global | Global | Quant | 1000 | Imported as non-strict (is_strict=false) |
| MixA | TargetA | FAM | Ct | 35 | Imported as strict |
| Global | Global | Global | Invalid | 1000 | Ignored — global rows still validated |
Test Data (Export):
| Record Type | Expected MIX | Expected TARGET | Expected DYE |
|---|---|---|---|
| Non-strict | Global | Global | Global |
| Strict | MixA | TargetA | FAM |
Test Data (Orphan Handling):
- Import global cut-off for "MixA"
- Delete "TargetC" from "MixA"
- Re-run global mapper
- Verify former TargetC cut-off is now strict (not deleted)
Steps:
- Import XLSX with "Global" rows for reporting cut-offs
- Verify non-strict records created with is_strict=false
- Verify global mapper creates per-target records for matching targets
- Export configuration and verify "Global" labels for non-strict rows
- Export configuration and verify specific names for strict rows
- Delete a target and re-run mapper
- Verify orphaned non-strict record marked strict
Expected Results:
- Import AC1: Rows with "Global" in mix/target/dye treated as non-strict settings
- Import AC2: Global mapping records created for non-strict rows
- Import AC3: Global rows validated for all other required fields
- Export AC1: Non-strict rows exported with "Global" labels
- Export AC2: Strict rows exported with actual mix/target/dye names
- Mapper AC1: Mapper creates non-strict cut-off records per matching target
- Orphan AC1: Orphaned non-strict records marked strict (not deleted)
- Orphan AC2: Orphaned rows become fixed target-specific settings
- Entity: Reporting cut-off global rows apply to all targets in a mix
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-033: Global/Strict pattern — Combined Outcomes import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-015 (Entity: Combined Outcomes)
Method: TM-API
Priority: High
Preconditions:
- Mixes "MixA", "MixB" with targets exist
- Error codes and LIMS statuses configured
- Roles configured
Test Data (Import):
| MIX | TARGET | ROLE | OUTCOME TYPE | is_strict | Expected |
|---|---|---|---|---|---|
| Global | Global | SampleRole | Error | false | Imported — global outcome applies across all mixes/targets |
| MixA | TargetA | SampleRole | Error | true | Imported — strict outcome for specific mix/target |
Test Data (Export):
| Record Type | Expected MIX | Expected TARGET |
|---|---|---|
| Non-strict (is_strict=false) | Global | Global |
| Strict (is_strict=true) | MixA | TargetA |
Steps:
- Import combined outcomes with "Global" mix and target
- Verify single "global" mix entry with "global" target created (is_strict=false)
- Import strict combined outcome for specific mix/target
- Export and verify "Global" labels for non-strict rows
- Export and verify specific names for strict rows
Expected Results:
- Entity: Global outcomes (is_strict=false) apply across all mixes and targets
- Entity: Single "global" mix entry with "global" target created
- Export: "Global" labels for non-strict rows
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-034: Global/Strict pattern — Cross Contamination Limits import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-015 (Mapper AC2, Entity: Cross Contamination Limits)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB" exists
- Dyes configured
Test Data (Import):
| MIX | TARGET | DYE | QUANT OR CT | CONTAMINATION VALUE | Expected |
|---|---|---|---|---|---|
| Global | Global | Global | Quant | 100 | Imported as non-strict |
| MixA | TargetA | FAM | Ct | 50 | Imported as strict |
Test Data (Orphan):
- Import global cross contamination limit
- Delete "TargetB" from "MixA"
- Re-run mapper
- Verify former TargetB adjacent record marked strict
Steps:
- Import XLSX with "Global" rows for cross contamination limits
- Verify mapper creates adjacent records for matching targets
- Export and verify "Global" labels for non-strict rows
- Delete a target and re-run mapper
- Verify orphaned non-strict adjacent marked strict
Expected Results:
- Entity: Global rows use "Global" for mix/target/dye
- Mapper: Adjacent records created for matching targets
- Orphan: Orphaned non-strict adjacents marked strict
- Export: Non-strict rows show "Global"; strict rows show actual names
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-035: Global/Strict pattern — Curve Control Limits import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-015 (Mapper AC2, Entity: Curve Control Limits)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB" exists
- Control label with role alias "POS" exists for MixA
- Control label with role alias "NEG" exists for MixA
Test Data (Import):
| MIX | TARGET | DYE | ROLE | Expected |
|---|---|---|---|---|
| Global | Global | Global | POS | Imported as non-strict; mapper restricted to mixes with POS control label |
| MixA | TargetA | FAM | POS | Imported as strict |
Test Data (Mapper Restriction):
- Import global curve control limit with ROLE = "POS"
- Verify mapper creates records only for targets in mixes that have a "POS" control label
- Mixes without "POS" control label do not receive mapped records
Steps:
- Import XLSX with "Global" rows for curve control limits
- Verify global mapping stores role_id
- Verify mapper restricts to targets in mixes with matching role alias (control label)
- Export and verify "Global" labels for non-strict rows
- Remove control label from a mix and re-run mapper
- Verify orphaned non-strict limits marked strict
Expected Results:
- Entity: Global rows store role_id in global mapping data
- Mapper: Restricts to targets in mixes with matching role alias (control label)
- Orphan: Orphaned non-strict limits marked strict
- Export: Non-strict rows show "Global"; strict rows show actual names
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-036: Control Labels enhanced columns import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-016 (AC1-AC9)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB", "TargetC"
- Specimens "SpecA", "SpecB" configured for the site
- Control roles configured
Test Data:
| ROLE | MIX | VERIFY_IC_TARGET_IS_POSITIVE | VERIFIABLE_TARGETS | ASSOCIATED_SPECIMENS | Expected |
|---|---|---|---|---|---|
| POS | MixA | TRUE | TargetA,TargetB | SpecA,SpecB | Imported |
| POS | MixA | FALSE | (empty) | (empty) | Imported (backward compatible) |
| POS | MixA | (empty) | (empty) | (empty) | Imported (backward compatible, no verification) |
| POS | MixA | maybe | (empty) | (empty) | Ignored — invalid verify-IC option |
| POS | MixA | TRUE | TargetA,NonExistent | (empty) | Ignored — invalid target names |
| POS | MixA | TRUE | (empty) | (empty) | Ignored — verifiable targets required when verify-IC is TRUE |
| POS | MixA | FALSE | (empty) | SpecA,InvalidSpec | Ignored — invalid specimen names |
Steps:
- Import XLSX with VERIFY_IC_TARGET_IS_POSITIVE, VERIFIABLE_TARGETS, and ASSOCIATED_SPECIMENS columns
- Verify boolean validation for VERIFY_IC_TARGET_IS_POSITIVE
- Verify VERIFIABLE_TARGETS validated against available targets in the mix
- Verify ASSOCIATED_SPECIMENS validated against site's specimens
- Verify empty columns cause backward-compatible behavior
- Export and verify new columns reflected in output
- Query database and verify verifiable_target_ids (JSON), verify_ic_target_is_positive, and associated_specimen_ids persisted
Expected Results:
- AC1: VERIFY_IC_TARGET_IS_POSITIVE column supported as boolean (TRUE/FALSE)
- AC2: VERIFIABLE_TARGETS column supported as comma-separated target names
- AC3: ASSOCIATED_SPECIMENS column supported as comma-separated specimen names
- AC4: Non-boolean VERIFY_IC_TARGET_IS_POSITIVE rejected with invalid verify-IC error
- AC5: Invalid VERIFIABLE_TARGETS rejected with invalid target names error
- AC6: Invalid ASSOCIATED_SPECIMENS rejected with error naming invalid specimens
- AC7: Empty columns cause backward-compatible behavior (no verification/associations)
- AC8: Imported values persisted to control_labels record (verifiable_target_ids, verify_ic_target_is_positive, associated_specimen_ids)
- AC9: Export reflects stored values in new columns
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-037: Control Labels re-import well migration and global mapping matching (@V3_1_0)
Verifies: REQ-CONFIGIO-017 (AC1-AC6)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets exists
- Control labels with role "POS" imported for MixA
- Wells exist that reference the imported control labels
- Global mappings exist for non-strict control labels
Test Data (Well Migration):
- Import control labels with role "POS" for MixA (creates control label ID=100)
- Create wells referencing control label ID=100
- Re-import control labels with role "POS" for MixA (creates new control label ID=200)
- Verify wells now reference control label ID=200
Test Data (Global Mapping Matching):
- Import global control labels with role "POS" (non-strict, is_strict=false)
- Import global control labels with role "NEG" (non-strict, is_strict=false)
- Re-import control labels — only "POS" labels matching full global mapping criteria marked strict
- Verify "NEG" labels unaffected
Steps:
- Import control labels and create wells referencing them
- Re-import control labels via API
- Verify old control labels soft-deleted (not force-deleted yet)
- Verify wells migrated from old to new control labels (same role_alias and mix_id)
- Verify old soft-deleted control labels force-deleted after migration
- Verify global mapping matching uses full criteria (mix, role, verify-IC, verifiable targets)
- Verify unrelated control labels not affected
Expected Results:
- AC1: On re-import, existing strict control labels soft-deleted (not force-deleted)
- AC2: Wells migrated from deleted to new control labels with same role_alias and mix_id
- AC3: Old soft-deleted control labels force-deleted after well migration
- AC4: Wells now point at corresponding new control labels
- AC5: Global mapping matching uses full criteria (mix, role, verify-IC, verifiable targets)
- AC6: Only control labels matching full global mapping marked strict; unrelated labels unaffected
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-038: Mix/Targets quantification scope and method import/export (@V3_1_0)
Verifies: REQ-CONFIGIO-018 (AC1-AC8)
Method: TM-API
Priority: High
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB" exists
Test Data (Quantification Scope):
| MIX | QUANTIFICATION_SCOPE | Expected |
|---|---|---|
| MixA (row 1) | OFF | Imported |
| MixA (row 2) | OFF | Imported (consistent) |
| MixB (row 1) | ALL | Imported |
| MixC (row 1) | BY_SPECIMEN | Imported |
| MixD (row 1) | off | Imported (normalized to lowercase) |
| MixD (row 2) | OFF | Imported (trimmed whitespace) |
| MixE (row 1) | INVALID | Imported — falls back to "OFF" |
| MixF (row 1) | ALL | Ignored — "Multiple quantification settings" |
| MixF (row 2) | OFF | Ignored — inconsistent across mix rows |
Test Data (Quantification Method):
| MIX | QUANTIFICATION_METHOD | Expected |
|---|---|---|
| MixA | StandardCurve | Imported |
| MixB | (empty) | Imported (null, no failure) |
| MixC | INVALID_METHOD | Imported (treated as null, no failure) |
Test Data (Automatic Baseline):
| MIX | TARGET | USE_AUTOMATIC_BASELINE | Expected |
|---|---|---|---|
| MixA | TargetA | TRUE | Imported |
| MixA | TargetB | FALSE | Imported |
Steps:
- Import XLSX with QUANTIFICATION_SCOPE test cases
- Verify normalization (lowercase, trim)
- Verify invalid values fall back to "OFF"
- Verify consistency enforcement across mix rows
- Import XLSX with QUANTIFICATION_METHOD test cases
- Verify invalid/empty method treated as null without failure
- Import XLSX with USE_AUTOMATIC_BASELINE test cases
- Verify boolean import per target
- Export and verify QUANTIFICATION_SCOPE, QUANTIFICATION_METHOD, USE_AUTOMATIC_BASELINE columns present
Expected Results:
- AC1: QUANTIFICATION_SCOPE column supported with valid values: "OFF", "ALL", "BY_SPECIMEN"
- AC2: Values normalized (lowercase, trimmed); invalid values fall back to "OFF"
- AC3: Inconsistent QUANTIFICATION_SCOPE within mix rejected with "Multiple quantification settings"
- AC4: Legacy QUANTITATIVE column no longer read on import
- AC5: QUANTIFICATION_METHOD column mapped to QuantificationMethods enum; invalid/empty treated as null
- AC6: USE_AUTOMATIC_BASELINE supported as boolean per target
- AC7: Export replaces QUANTITATIVE with QUANTIFICATION_SCOPE (default "OFF") and QUANTIFICATION_METHOD
- AC8: Export includes USE_AUTOMATIC_BASELINE per target
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-039: Mix/Targets virtual target linking on import (@V3_1_0)
Verifies: REQ-CONFIGIO-018 (AC9-AC12)
Method: TM-API
Priority: Medium
Preconditions:
- Base mix "BaseMix" with targets "TargetA" (DyeFAM), "TargetB" (DyeVIC) exists
- Virtual mix "VirtualMix" configured with base_mix = "BaseMix"
Test Data:
| MIX | TARGET | DYE | BASE MIX | Expected |
|---|---|---|---|---|
| BaseMix | TargetA | FAM | (empty) | Imported — base target |
| BaseMix | TargetB | VIC | (empty) | Imported — base target |
| VirtualMix | VTargetA | FAM | BaseMix | Imported — virtual target linked to BaseMix/TargetA by dye |
| VirtualMix | VTargetB | VIC | BaseMix | Imported — virtual target linked to BaseMix/TargetB by dye |
Steps:
- Import XLSX with base mix and virtual mix targets
- Verify virtual targets (rows with base_mix) have mix_target_id set to base target matched by dye
- Verify base targets are not affected by virtual target linking
- Export and verify round-trip integrity
Expected Results:
- AC9: Virtual targets updated by matching base mix targets by dye
- AC10: Virtual target's mix_target_id points at the base target
- AC11: Conflicting QUANTIFICATION_SCOPE within mix rejected with "Multiple quantification settings" (error handling)
- AC12: Export includes QUANTIFICATION_SCOPE and QUANTIFICATION_METHOD for round-trip
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-043: Cross Contamination Limits import error cascade prevention (@V3_1_0)
Verifies: REQ-CONFIGIO-019 (AC1, AC2)
Method: TM-API
Priority: Medium
Preconditions:
- Mix "MixA" with targets "TargetA", "TargetB" exists
- Cross contamination configuration exists
Test Data:
| QUANT OR CT | CONTAMINATION VALUE | POTENTIAL CONTAMINATING | Expected |
|---|---|---|---|
| InvalidValue | 100 | TargetB | Ignored — only quant_or_ct error reported (no cascade) |
| (empty) | 100 | TargetB | Ignored — only quant_or_ct error reported (no cascade) |
| Quant | -50 | TargetB | Ignored — contamination value error reported |
| Quant | 100 | NonExistent | Ignored — contaminating target error reported |
| Quant | 100 | TargetB | Imported |
Steps:
- Import XLSX with invalid quant_or_ct values alongside invalid contamination values
- Verify status report contains only the quant_or_ct error (no cascading errors)
- Import XLSX with valid quant_or_ct but invalid contamination values
- Verify status report contains the contamination value errors
- Import XLSX with all valid values
- Verify row imported successfully
Expected Results:
- AC1: Invalid quant_or_ct — row rejected with only quant_or_ct error; no redundant contamination value errors
- AC2: Valid quant_or_ct with invalid contamination values — row rejected with contamination value errors
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-044: Automatic Rule Mappings export sheet (@V3_1_0)
Verifies: REQ-CONFIGIO-020 (AC1, AC2, AC3)
Method: TM-API
Priority: Medium
Preconditions:
- Rules configured with automatic rule mapping tags
- Mix "MixA" with targets "TargetA", "TargetB" exists
- Control labels with roles configured
- Automatic rule mapper has generated mappings
- Manual (custom) rule mappings also exist
Steps:
- Export configuration via API
- Locate the "Automatic Rule Mappings" sheet in the exported XLSX
- Verify sheet contains all auto-generated rule mappings
- Verify each row includes rule name, rule ID, role, mix, target, dye, and specimen columns
- Verify manual (custom) rule mappings are NOT included in this sheet
- Verify manual mappings still appear in the "Rules Mapping" sheet
Expected Results:
- AC1: Export includes sheet listing all automatically generated rule-to-role-to-target mappings
- AC2: Each row includes rule name, rule ID, role, mix, target, dye, and specimen (where applicable)
- AC3: Sheet distinguishes auto-mapped rules from custom mappings (auto-mapped only in this sheet)
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-045: Target Name Suffix to Specimen import (@V3_1_0)
Verifies: REQ-CONFIGIO-021 (AC1-AC6)
Method: TM-API
Priority: Medium
Preconditions:
- Specimens "SpecA", "SpecB" configured for the site
- No existing target name suffix mappings
Test Data:
| SUFFIX | SPECIMEN NAME | Expected |
|---|---|---|
| _SERUM | SpecA | Imported (stored as "_SERUM" uppercase) |
| _plasma | SpecB | Imported (normalized to "_PLASMA") |
| _Serum | SpecA | Ignored — duplicate suffix (case-insensitive, "_SERUM" already exists) |
| _CSF | NonExistent | Ignored — unknown specimen name |
| _BAL | SpecA | Imported |
Steps:
- Import XLSX with Target Name Suffix sheet
- Verify suffixes normalized to uppercase before storage
- Verify suffix uniqueness enforced (case-insensitive)
- Verify specimen names resolved against site's configured specimens
- Verify duplicate suffix rejected with appropriate error
- Verify unknown specimen rejected with error identifying invalid specimen
Expected Results:
- AC1: Import supports Target Name Suffix sheet with suffix and specimen name columns
- AC2: Suffixes normalized to uppercase before storage
- AC3: Suffix uniqueness enforced (case-insensitive) within site
- AC4: Specimen names resolved against site's configured specimens
- AC5: Duplicate suffixes rejected with appropriate error
- AC6: Unknown specimen names rejected with error identifying invalid specimen
Automation Status: Planned
Jira: [Pending]
TC-CONFIGIO-046: Config import progress indicator (@V3_1_0)
Verifies: REQ-CONFIGIO-022 (AC1, AC2)
Method: TM-HYB (API for import trigger, UI/WebSocket for progress verification)
Priority: Medium
Preconditions:
- User logged in with Administrator role
- Configuration file with multiple sheets prepared
- WebSocket connection established (Pusher)
Steps:
- Upload configuration file via API
- Monitor WebSocket broadcasts during import
- Verify progress updates received as each sheet is processed
- Verify each update indicates which sheet is currently being imported
Expected Results:
- AC1: System updates user on import progress as each sheet is processed
- AC2: Progress updates indicate which sheet is currently being imported
Automation Status: Planned (requires WebSocket monitoring)
Jira: [Pending]
TC-CONFIGIO-040: Kit Configuration page has upload button for config import
Verifies: REQ-CONFIGIO-001
Method: TM-UI
Priority: Medium
Preconditions:
- User logged in with Administrator role
Steps:
- Navigate to the Kit Configuration page
- Wait for the page to fully render
Expected Results:
- Page displays the "Kit Configuration" screen title
- "Upload Configuration Sheet" button is present
Automation Status: Automated (Browser)
Feature: tests/exports/browser/upload-runs.feature
TC-CONFIGIO-041: Valid config upload triggers success notification
Verifies: REQ-CONFIGIO-001 (AC1)
Method: TM-UI
Priority: High
Preconditions:
- User logged in with Administrator role
- Valid XLSX configuration file available
Steps:
- Navigate to the Kit Configuration page
- Upload a valid configuration file via the import dialog
- Wait for asynchronous processing acknowledgement
Expected Results:
- Notification containing "submitted" is displayed after upload
Automation Status: Automated (Browser)
Feature: tests/exports/browser/upload-runs.feature
TC-CONFIGIO-042: Kit Configuration page shows data table after config import
Verifies: REQ-CONFIGIO-001
Method: TM-UI
Priority: Medium
Preconditions:
- User logged in with Administrator role
- Valid configuration loaded via API
Steps:
- Load a test configuration via API
- Navigate to the Kit Configuration page
- Wait for the page to render
Expected Results:
- Page displays "Kit Configuration" screen title
- "Reset Configuration Data" button is present (indicating config data exists)
Automation Status: Automated (Browser)
Feature: tests/exports/browser/upload-runs.feature
TC-CONFIGIO-B006: Config upload triggers asynchronous submission notification
Verifies: REQ-CONFIGIO-001 (AC1)
Method: TM-UI
Priority: High
Preconditions:
- User logged in with Administrator role
- Valid XLSX configuration file available
Steps:
- Navigate to the Kit Configuration page
- Upload a configuration file via the import dialog
- Wait for asynchronous job submission
Expected Results:
- Notification containing "submitted" is displayed
Automation Status: Automated (Browser)
Feature: tests/exports/browser/config-io.feature
TC-CONFIGIO-B007: Page remains functional after config upload
Verifies: REQ-CONFIGIO-001
Method: TM-UI
Priority: Medium
Preconditions:
- User logged in with Administrator role
- Valid XLSX configuration file available
Steps:
- Navigate to the Kit Configuration page
- Upload a configuration file via the import dialog
- Verify page elements remain intact after upload
Expected Results:
- "Kit Configuration" screen title still displayed
- "Upload Configuration Sheet" button still present
- "Reset Configuration Data" button still present
Automation Status: Automated (Browser)
Feature: tests/exports/browser/config-io.feature
TC-CONFIGIO-B011: Config data persists across SPA navigation
Verifies: REQ-CONFIGIO-001
Method: TM-UI
Priority: Medium
Preconditions:
- User logged in with Administrator role
- Valid configuration loaded via API
Steps:
- Load test configuration via API
- Navigate to the Kit Configuration page and verify data is displayed
- Navigate away to a different page (e.g., Runs)
- Return to the Kit Configuration page
Expected Results:
- Configuration data rows are visible after initial load
- Configuration data rows are still visible after navigating back
Automation Status: Automated (Browser)
Feature: tests/exports/browser/config-io.feature
Gap Analysis
No gaps identified. All 186 acceptance criteria have test coverage.
Coverage by AC Type
| AC Category | Count | Covered | Notes |
|---|---|---|---|
| Column Support | 42 | 42 | Verified via import/export operations (expanded for Phases B-D + v3.1.0) |
| Field Validation | 78 | 78 | Verified via TM-API with test vectors (expanded for Phases B-D column ACs + v3.1.0) |
| Import Behavior | 30 | 30 | Verified via status report analysis (includes global/strict, re-import, suffix) |
| Export Behavior | 20 | 20 | Verified via round-trip testing (includes global/strict export, auto rule mappings) |
| Configuration Toggle | 4 | 4 | Verified via config state manipulation |
| Mapper/Orphan Behavior | 8 | 8 | Verified via global mapper and orphan handling (v3.1.0) |
| Progress/UI | 4 | 4 | Verified via WebSocket and browser tests (v3.1.0) |
Traceability to Existing Tests
| Test Case | Jira Test | Automation |
|---|---|---|
| TC-CONFIGIO-001 | BT-3714 | Behat |
| TC-CONFIGIO-002 | Pending | Partial |
| TC-CONFIGIO-003 | BT-3562 | PHPUnit |
| TC-CONFIGIO-004 | BT-4677 | PHPUnit |
| TC-CONFIGIO-005 | BT-5227, BT-5308 | PHPUnit |
| TC-CONFIGIO-006 | BT-4239 | PHPUnit |
| TC-CONFIGIO-007 | BT-3885 | PHPUnit |
| TC-CONFIGIO-008 | BT-5230 | PHPUnit |
| TC-CONFIGIO-009 | BT-3913, BT-3985 | PHPUnit |
| TC-CONFIGIO-010 | BT-5303 | PHPUnit |
| TC-CONFIGIO-011 | BT-3835, BT-4164 | PHPUnit |
| TC-CONFIGIO-012 | BT-3862, BT-4864 | PHPUnit |
| TC-CONFIGIO-013 | Pending | Planned |
| TC-CONFIGIO-014 | BT-3559 | PHPUnit |
| TC-CONFIGIO-015 | BT-4054 | PHPUnit |
| TC-CONFIGIO-016 | BT-3567 | PHPUnit |
| TC-CONFIGIO-017 | BT-3567 | PHPUnit |
| TC-CONFIGIO-018 | Pending | Planned |
| TC-CONFIGIO-019 | BT-4293 | PHPUnit |
| TC-CONFIGIO-020 | BT-4164, BT-4042 | PHPUnit |
| TC-CONFIGIO-021 | BT-3713 | PHPUnit |
| TC-CONFIGIO-022 through TC-CONFIGIO-031 | Pending | Planned (Phases B-D column ACs) |
| TC-CONFIGIO-032 | Pending | Planned (@V3_1_0 — Global/Strict: Reporting Cut-offs) |
| TC-CONFIGIO-033 | Pending | Planned (@V3_1_0 — Global/Strict: Combined Outcomes) |
| TC-CONFIGIO-034 | Pending | Planned (@V3_1_0 — Global/Strict: Cross Contamination Limits) |
| TC-CONFIGIO-035 | Pending | Planned (@V3_1_0 — Global/Strict: Curve Control Limits) |
| TC-CONFIGIO-036 | Pending | Planned (@V3_1_0 — Control Labels Enhanced Columns) |
| TC-CONFIGIO-037 | Pending | Planned (@V3_1_0 — Control Labels Re-import) |
| TC-CONFIGIO-038 | Pending | Planned (@V3_1_0 — Quantification Scope/Method) |
| TC-CONFIGIO-039 | Pending | Planned (@V3_1_0 — Virtual Target Linking) |
| TC-CONFIGIO-043 | Pending | Planned (@V3_1_0 — Cross Contamination Validation) |
| TC-CONFIGIO-044 | Pending | Planned (@V3_1_0 — Automatic Rule Mappings Export) |
| TC-CONFIGIO-045 | Pending | Planned (@V3_1_0 — Target Name Suffix Import) |
| TC-CONFIGIO-046 | Pending | Planned (@V3_1_0 — Config Import Progress) |
| TC-CONFIGIO-040 | Browser | Behat (Browser) |
| TC-CONFIGIO-041 | Browser | Behat (Browser) |
| TC-CONFIGIO-042 | Browser | Behat (Browser) |
| TC-CONFIGIO-B006 | Browser | Behat (Browser) |
| TC-CONFIGIO-B007 | Browser | Behat (Browser) |
| TC-CONFIGIO-B011 | Browser | Behat (Browser) |
Notes
- CONFIGIO is a backend-heavy domain with deterministic validation logic
- TM-API is primary method per Test Plan Section 3.2 for configuration import/export
- Most test cases leverage parameterized test data tables for comprehensive coverage
- TC-CONFIGIO-002 includes manual verification for keyboard shortcut (P key)
- TC-CONFIGIO-013, TC-CONFIGIO-018 pending automation due to missing Jira tests
- TC-CONFIGIO-022 through TC-CONFIGIO-031 added for column-level ACs from CONFIG_COVERAGE_FIXES.md Phases B-D
- TC-CONFIGIO-032 through TC-CONFIGIO-039, TC-CONFIGIO-043 through TC-CONFIGIO-046 added for v3.1.0 REQs (REQ-CONFIGIO-015 through 022), all tagged @V3_1_0
- TC-CONFIGIO-005 updated to include cross-field dependency ACs (AC13, AC14) for REQ-CONFIGIO-003 @V3_1_0
- TC-CONFIGIO-040 through TC-CONFIGIO-042 are browser-level TCs from
upload-runs.featurecovering upload button presence, notification, and data display - TC-CONFIGIO-B006, TC-CONFIGIO-B007, TC-CONFIGIO-B011 are browser-level TCs from
config-io.featurecovering async notification, page stability, and SPA data persistence