--- stepsCompleted: - step-01-detect-mode - step-02-load-context - step-03-risk-and-testability - step-04-coverage-plan - step-05-generate-output lastStep: step-05-generate-output lastSaved: 2026-03-17 workflowType: testarch-test-design inputDocuments: - D:\Development\Tracking_Kits\docs\project-overview.md - D:\Development\Tracking_Kits\docs\architecture.md - D:\Development\Tracking_Kits\docs\module-map.md - D:\Development\Tracking_Kits\docs\development-guide.md - D:\Development\Tracking_Kits\_bmad-output\project-context.md - D:\Development\Tracking_Kits\App\Controllers\Kit\KitController.asp - D:\Development\Tracking_Kits\App\DomainModels\InkjetRecordsRepository.asp - D:\Development\Tracking_Kits\App\Views\Kit\SwitchBoardPurpleEnvelopeEdit.asp --- # Test Design for Architecture: Purple Envelope Edit and Ballot Range Report **Purpose:** Architectural concerns, testability gaps, and NFR requirements for review by Dev/Architecture before adding regression tests for the current purple-envelope workflow. **Date:** 2026-03-17 **Author:** Daniel Covington **Status:** Architecture Review Pending **Project:** workspace **PRD Reference:** Brownfield functional references: `docs/project-overview.md`, `docs/module-map.md`, and the currently deployed purple-envelope behavior **ADR Reference:** Brownfield architecture references: `docs/architecture.md` and `App/Controllers/Kit/KitController.asp` --- ## Executive Summary **Scope:** Preserve current behavior for `SwitchBoardPurpleEnvelopeEdit`, including report rendering, mixed-format precinct ordering, election-date formatting, color-assignment forms, and print-only report scoping. **Business Context**: - **Revenue/Impact:** Operational election-mail output; wrong report data can cause incorrect ballot packaging and operator rework. - **Problem:** The feature is currently exercised mostly through manual IIS verification, so small controller/view/repository regressions can silently change report output. - **GA Launch:** Immediate brownfield regression protection for current production behavior. **Architecture**: - **Key Decision 1:** Purple-envelope behavior remains in Classic ASP controller/view/repository layers, not a separate service. - **Key Decision 2:** Report content is rendered as HTML from `KitController` + `InkjetRecordsRepository` + `SwitchBoardPurpleEnvelopeEdit.asp`. - **Key Decision 3:** Mixed-format precinct ordering is handled in VBScript controller helpers, while ballot range aggregation is still SQL-backed. **Expected Scale**: - Single-kit page render with precinct rows sourced from `InkjetRecords` - Operator-facing print workflow from browser print preview - Existing automated test harness limited to ASPUnit helper-style tests **Risk Summary:** - **Total risks:** 7 - **High-priority (>=6):** 3 risks requiring mitigation before relying on automated regression coverage - **Test effort:** ~14-19 targeted automated checks plus 2 manual print checks (~1-1.5 QA weeks) --- ## Quick Guide ### BLOCKERS - Team Must Decide 1. **R-006: No isolated fixture path for Kit/Inkjet/Settings data** - Tests need a disposable MDB or deterministic seed/reset strategy before meaningful controller/repository regression coverage can be added. Recommended owner: Dev. 2. **R-002: Ballot range correctness is data-sensitive** - We need agreed fixture data covering numeric, zero-padded, and alpha-suffixed precincts plus min/max ballot scenarios. Recommended owner: Dev + QA. 3. **R-001: Mixed-format precinct ordering is custom logic** - The current order rules must be frozen as explicit expected outputs before tests are written. Recommended owner: Product/Dev/QA. ### HIGH PRIORITY - Team Should Validate 1. **R-003: Election date formatting/fallback behavior** - Approve the rule set: valid dates render `Mon-YYYY`, invalid or missing values fall back without crashing. 2. **R-004: Print-only report scope depends on browser print behavior** - Approve a split strategy: automated HTML/CSS assertions plus manual browser print smoke for final confidence. 3. **R-005: Color-assignment regressions can hide behind the same screen** - Validate that the report tests must also preserve existing `AssignKitColorPost` and `AssignPrecinctColorsPost` behavior. ### INFO ONLY - Solutions Provided 1. **Test strategy:** favor repository/controller integration checks plus limited manual IIS print verification. 2. **Tooling:** reuse ASPUnit, a disposable test MDB copy, and HTML response assertions. 3. **Coverage:** focus first on sorting, aggregation, date formatting, same-screen regression, and print scoping. 4. **Gate guidance:** P0 automated checks must pass 100%; P1 >=95%; manual IIS print smoke required before release for print-impacting changes. --- ## For Architects and Devs - Open Topics ### Risk Assessment **Total risks identified:** 7 (3 high-priority score >=6, 4 medium, 0 low) #### High-Priority Risks (Score >=6) - Immediate Attention | Risk ID | Category | Description | Probability | Impact | Score | Mitigation | Owner | Timeline | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | **R-001** | **DATA** | Mixed-format precinct sort order changes (`0003`, `12A`, alpha-only values) and produces wrong operator-facing sequence | 2 | 3 | **6** | Lock expected order with seeded regression fixtures and HTML assertions | Dev + QA | Before next release | | **R-002** | **DATA** | Ballot range query/regression returns wrong low or high ballot numbers per precinct | 2 | 3 | **6** | Add repository-level aggregation checks against known datasets | Dev + QA | Before next release | | **R-006** | **TECH** | No isolated test-data harness for `Kit`, `InkjetRecords`, `Settings`, and `Colors` blocks stable regression coverage | 3 | 2 | **6** | Create disposable MDB copy and reset/seeding conventions for tests | Dev | Before automated suite work | #### Medium-Priority Risks (Score 3-5) | Risk ID | Category | Description | Probability | Impact | Score | Mitigation | Owner | | --- | --- | --- | --- | --- | --- | --- | --- | | R-003 | BUS | Election date header shows wrong format or blank value unexpectedly | 2 | 2 | 4 | Add valid, invalid, and missing-setting render checks | QA | | R-004 | OPS | Print-only output regresses and shows extra page content or loses repeated-page spacing | 2 | 2 | 4 | Add HTML/CSS assertions and manual print smoke | QA | | R-005 | BUS | Same-screen changes break existing color-assignment workflows while report tests are added | 2 | 2 | 4 | Add regression checks for both POST actions | Dev + QA | | R-007 | BUS | Empty precinct data renders broken or confusing output instead of the current no-data row | 2 | 2 | 4 | Add explicit empty-state render test | QA | #### Risk Category Legend - **TECH**: architectural or testability risk - **DATA**: incorrect ballot or precinct data interpretation - **BUS**: operator-facing workflow correctness - **OPS**: environment or print/runtime behavior --- ### Testability Concerns and Architectural Gaps #### 1. Blockers to Fast Feedback | Concern | Impact | What Architecture Must Provide | Owner | Timeline | | --- | --- | --- | --- | --- | | **No disposable test database pattern** | Automated tests will share mutable data and become brittle | A documented temp MDB copy/reset approach for ASPUnit-backed integration tests | Dev | Pre-implementation | | **No render-test seam for controller output** | Report assertions stay manual and expensive | A small harness or convention for invoking `SwitchBoardPurpleEnvelopeEdit` against seeded data and asserting HTML | Dev | Pre-implementation | | **Implicit behavior contract only lives in code/user feedback** | Tests may encode the wrong business rule | A short frozen rules list for sorting, header formatting, and empty-state expectations | Dev + QA + Stakeholders | Pre-implementation | #### 2. Architectural Improvements Needed 1. **Stabilize feature fixtures** - **Current problem:** no reusable seed set for mixed precinct and ballot-range cases. - **Required change:** create named fixture datasets for numeric-only, zero-padded, alpha-suffixed, alpha-only, and empty-state kits. - **Impact if not fixed:** tests will either miss key edge cases or rely on hand-built ad hoc data. - **Owner:** Dev - **Timeline:** before automated test implementation 2. **Separate deterministic logic from page orchestration where practical** - **Current problem:** ordering/date helpers are private controller methods, making low-level regression checks harder. - **Required change:** either expose deterministic helper seams or cover the helpers through stable page-render assertions. - **Impact if not fixed:** coverage will skew toward broad render tests only. - **Owner:** Dev - **Timeline:** implementation phase if needed 3. **Document browser-dependent print boundaries** - **Current problem:** browser headers/footers and repeated-page spacing are only partially controllable in app code. - **Required change:** record which print expectations are automatable versus manual. - **Impact if not fixed:** release disputes on “test passed but print preview changed”. - **Owner:** QA - **Timeline:** before sign-off --- ### Testability Assessment Summary #### What Works Well - Existing repository boundaries make ballot-range aggregation testable without full browser automation. - The report HTML is deterministic from seeded data, which is good for response-body assertions. - The feature is localized to `KitController`, `InkjetRecordsRepository`, `KitViewModels`, and one view template. - ASPUnit already exists, so the project has a place to add targeted regression checks. #### Accepted Trade-offs - Browser-generated print headers/footers will remain manual-verification territory. - Full visual print fidelity on Windows/IIS is accepted as a release smoke check, not a unit-level assertion target. --- ### Risk Mitigation Plans (High-Priority Risks >=6) #### R-001: Mixed-format precinct sort regression (Score: 6) - HIGH **Mitigation Strategy:** 1. Define the expected canonical sort order for representative precinct values. 2. Seed one kit containing `0001`, `0003`, `12`, `12A`, `12B`, and alpha-only precincts. 3. Assert that both the color table and report table render in the same expected order. **Owner:** Dev + QA **Timeline:** Before next release **Status:** Planned **Verification:** Automated HTML assertions against the seeded render output #### R-002: Ballot range aggregation regression (Score: 6) - HIGH **Mitigation Strategy:** 1. Seed multiple `InkjetRecords` rows per precinct with known min/max ballot numbers. 2. Assert repository output for each precinct’s low/high values. 3. Assert the rendered HTML shows the same values and no cross-precinct bleed. **Owner:** Dev + QA **Timeline:** Before next release **Status:** Planned **Verification:** Repository integration checks plus page-render verification #### R-006: Missing isolated test-data harness (Score: 6) - HIGH **Mitigation Strategy:** 1. Stand up a disposable test MDB copy for ASPUnit/controller integration runs. 2. Create reset hooks for `Kit`, `InkjetRecords`, `Settings`, and `Colors`. 3. Document fixture naming and cleanup rules for parallel-safe future tests. **Owner:** Dev **Timeline:** Before automated suite expansion **Status:** Planned **Verification:** Test runs can seed, execute, and reset without polluting shared data --- ### Assumptions and Dependencies #### Assumptions 1. Brownfield docs plus current user-approved behavior are sufficient substitutes for a formal PRD for this feature slice. 2. IIS-backed manual verification remains available for final print checks. 3. Existing status strings and form routing remain part of the contract and should not be normalized during test work. #### Dependencies 1. Disposable test data store available before controller/repository automation begins. 2. Mixed-format precinct fixture definitions agreed before expected-order assertions are written. 3. QA has access to a Windows/IIS browser for manual print smoke validation. #### Risks to Plan - **Risk:** undocumented operator expectations about sort order - **Impact:** the suite may freeze the wrong behavior - **Contingency:** validate the expected fixture output with stakeholders before coding assertions --- **End of Architecture Document** **Next Steps for Architecture/Dev Team:** 1. Approve the sort-order and date-format behavior contract. 2. Provide a disposable MDB fixture/reset approach. 3. Confirm manual print checks remain part of release validation for this feature. **Next Steps for QA Team:** 1. Use the companion QA doc for concrete scenario planning. 2. Build seeded datasets around mixed-format precincts and ballot ranges. 3. Add manual print preview checks only for browser-dependent behavior.