---
stepsCompleted:
  - step-01-preflight-and-context
  - step-02-identify-targets
  - step-03-generate-tests
  - step-03c-aggregate
  - step-04-validate-and-summarize
lastStep: step-04-validate-and-summarize
lastSaved: 2026-03-17
workflowType: testarch-automate
target: ImportService/TrackingDataImport.vbs
---

# Test Automation Expansion: TrackingDataImport.vbs

## Step 1: Preflight & Context

### Stack Detection

- `test_stack_type`: auto → **detected: `backend`**
- No frontend tooling (no `package.json`, no Playwright/Cypress config)
- No conventional backend manifests — project is **VBScript / Classic ASP**
- Framework for this component: **standalone VBScript test harness** (`Tests/TrackingDataImport_TestHarness.vbs`) run via `cscript`

### Execution Mode

**Standalone** — source code only; no story/PRD/test-design artifacts exist for this component.

### TEA Config Flags

- `tea_use_playwright_utils`: true → **Not applicable** (no browser/HTTP layer)
- `tea_use_pactjs_utils`: true → **Not applicable** (no service contracts)
- `tea_pact_mcp`: mcp → **Not applicable**
- `tea_browser_automation`: auto → **Not applicable** (script only)

### Existing Test Harness Summary

`Tests/TrackingDataImport_TestHarness.vbs` uses `LoadFunctions` + `ExecuteGlobal` to extract individual functions from the source and test them in isolation. Current state:

| Function | Status | Test Count |
|---|---|---|
| `Truncate` | ✅ Tested | 2 |
| `PadLeft` | ✅ Tested | 2 |
| `PadString` | ✅ Tested | 3 (including Null input) |
| `CleanNull` | ✅ Tested | 2 |
| `CompressArray` | ✅ Tested | 1 |
| `TrimLeadingZeros` | ✅ Tested | 2 |
| `PushNonEmptyToBottom` | ✅ Tested | 1 |
| `GetState` | ✅ Tested | 2 |
| `GetCityFromLine` | ✅ Tested | 3 (including Null) |
| `Assign` | ⚠️ Loaded, not tested | 0 |
| `Choice` | ⚠️ Loaded, not tested | 0 |
| `CheckForFiles` | ⚠️ Smoke only (empty dir) | 1 |
| `CheckStringDoesNotHaveForiegnCountries` | ❌ Not in harness | 0 |

### Functions Out of Scope (Require COM/DB/Shell)

`ValidJcode`, `GetSetting`, `CheckStatusFor`, `CheckForJobsToCass`, `ValidImportCSV`, `ConvertCsvToString`, `SetupKit`, `ImportCass`, `ExportMMCsv`, `RunMailManager`, `CreateExportForSnailWorks`, `CreateProofForJurisdiction`, `createTrackingInfoForKit`, `ExportInkjetFile`, `ThereAreCustomOfficeCopyJobsReady`, `CreateCustomOfficeCopyJobsInKjetFiles`, `CreateCustomOfficeCopyJobsProofFiles`, `CheckSnailWorksPurpleEnvelopeExport`, `CheckSnailWorksTrakingKitExport`, `Main`, `InitConfig`, `ProcessStatus`

---

## Step 2: Coverage Plan

### ⚠️ Highest Actual Risk — Zero Coverage (Orchestration Path)

The import pipeline `CheckForFiles` → `ConvertCsvToString` → `ValidImportCSV` → `SetupKit` has **no automated coverage at any level**. This is the path that processes real CSV files into the database. A failure here causes silent data loss or incorrect kit creation. The unit tests below are baseline documentation; they do not protect this pipeline.

### Targets by Test Level

**Unit (VBScript `cscript` harness) — only applicable level for this component**

#### P0 — Critical: Import gate + behavior-documentation

| Target | Gap | Test Cases | Note |
|---|---|---|---|
| `ValidImportCSV` | Import gate — accepts/rejects all incoming files; Chilkat COM likely available in harness | 20-column CSV → True, 19-column → False, 0-column → False | Investigate: harness can `CreateObject("Chilkat_9_5_0.Csv")` directly |
| `CheckStringDoesNotHaveForiegnCountries` | Not in harness; pure logic, no COM dependency | clean US address → True, `"CANADA"` → False, `"JAPAN"` → False, lowercase `"canada"` → True (documents case-sensitive behavior) | Substring test `"123 Norway Ave"` → True documents assumption that input arrives pre-uppercased |
| `GetState` | `IgnoreCase=False` — mixed-case CSV input silently returns no state | `"lansing, mi 48906"` → `""` (documents real behavior risk) | Affects downstream CASS processing |

#### P0 — Failure mode cases (surfaced by FMA)

| Target | Case | Expected | Risk Note |
|---|---|---|---|
| `CheckStringDoesNotHaveForiegnCountries` | Null input | type mismatch (documents crash) | `InStr(Null,x)` raises runtime error |
| `GetState` | Null input | type mismatch | `RegExp.Execute(Null)` raises type mismatch |
| `Choice` | Null condition | False branch taken silently | VBScript evaluates `If Null Then` as False |

#### P1 — Important: Edge cases for already-tested functions

| Target | Missing Edge Cases |
|---|---|
| `TrimLeadingZeros` | `""` → `""`, `"abc"` → `"abc"`, `"0"` → `""`, `" 007"` (leading space) → `" 007"`, Null → type mismatch |
| `PadLeft` | exact-length `"007"` → `"007"`, empty string → `"000"`, Null → type mismatch |
| `PadString` | longer-than-size `"abcde"` → `"abcde"`, `""` → `"   "` |
| `CompressArray` | all-empty array, all-non-empty array, single-element array |
| `GetState` | `""` → `""` |

#### P2 — Low priority (loaded but trivially low-risk)

| Target | Test Cases | Note |
|---|---|---|
| `Assign` | scalar string, scalar number, empty string, zero | 5-line utility; tests are baseline documentation only |
| `Choice` | True branch, False branch, computed True/False | Calls `Assign`; tests document expected delegation |
| `CheckForFiles` deeper | Requires Chilkat CSV COM for valid-file path | Skip unless `ValidImportCSV` Chilkat investigation succeeds |

### Justification

`ValidImportCSV` is the import gate — every CSV import decision flows through it. Its column-count check (`NumColumns = 20`) is testable if `Chilkat_9_5_0.Csv` can be instantiated in the harness via `CreateObject`. `CheckStringDoesNotHaveForiegnCountries` and `GetState` document real behavior risks around case sensitivity and substring matching in production CSV data. `Assign`/`Choice` are downgraded to P2 — baseline documentation, not safety-critical coverage.

---

## Step 3: Generated Tests

### File Modified

`Tests/TrackingDataImport_TestHarness.vbs` — updated in-place (VBScript harness pattern, no new files required)

### Changes Applied

**New globals added:**
- `Dim objCSV` — makes Chilkat CSV available to `ValidImportCSV`
- `Set objFSO = fso` — ensures `objFSO` is set early for loaded functions
- `Dim chilkatAvailable` + COM probe block — skips `ValidImportCSV` tests gracefully if Chilkat not registered

**New entries in `functionNames` array:**
- `"CheckStringDoesNotHaveForiegnCountries"`
- `"ValidImportCSV"`

**New test assertions (38 new tests):**

| Priority | Function | Cases |
|---|---|---|
| P0 | `CheckStringDoesNotHaveForiegnCountries` | 7 (clean US, CANADA, JAPAN, Norway Ave, lowercase canada, empty, Null) |
| P0 | `GetState` | 2 (lowercase miss, empty) |
| P0 | `Choice` | 1 (Null condition) |
| P0 | `ValidImportCSV` | 3 (20-col accept, 19-col reject, empty reject) — conditional on Chilkat |
| P1 | `TrimLeadingZeros` | 4 (empty, non-numeric, single zero, leading space) |
| P1 | `PadLeft` | 2 (exact length, empty string) |
| P1 | `PadString` | 2 (longer-than-size, empty string) |
| P1 | `CompressArray` | 3 (all-empty, all-non-empty, single-element) |
| P2 | `Assign` | 4 (string, number, empty, zero) |
| P2 | `Choice` | 4 (True, False, computed True, computed False) |

**Total new tests: 32** (+ 3 conditional on Chilkat availability = 35 max)

### Test Count Summary

| | Count |
|---|---|
| Existing tests (before this pass) | 19 |
| New tests added | 32 (+3 conditional) |
| **Total (Chilkat available)** | **54** |
| **Total (Chilkat unavailable)** | **51** |

## Validation

### Checklist Result: ✅ PASS

All applicable items passed. Full checklist adapted for VBScript `cscript` harness (Playwright/TypeScript items marked N/A).

**Key verifications:**
- `Choice(Null, "yes", "no")` → `"no"` confirmed: VBScript `If Null Then` evaluates False
- `CheckStringDoesNotHaveForiegnCountries(Null)` → `True` confirmed: `InStr(Null, x)` returns Null (falsy in If)
- `ValidImportCSV` guard pattern correct: `chilkatAvailable` flag skips gracefully if COM absent
- All `Dim` declarations satisfy `Option Explicit` requirement
- No shared mutable state between test groups

### Assumptions and Risks

- `ValidImportCSV` tests depend on `Chilkat_9_5_0.Csv` COM registration on the machine running the harness. The guard skips them cleanly if absent.
- The orchestration path (`CheckForFiles` → `ConvertCsvToString` → `ValidImportCSV` → `SetupKit`) remains **without automated coverage** — this is the highest actual risk. Database-backed integration tests would require a seeded MDB fixture and are out of scope for the cscript harness pattern.
- `CheckStringDoesNotHaveForiegnCountries` substring and case-sensitivity tests are **behavior-documentation tests**, not defect tests. They document the assumption that upstream CSV data arrives pre-uppercased.
- `GetState` lowercase test documents a known production risk: mixed-case city/state lines in real CSV data silently return no state.

### How to Run

```
cscript Tests\TrackingDataImport_TestHarness.vbs
```

Expected output (Chilkat available): `Passed: 54, Failed: 0`
Expected output (Chilkat unavailable): `SKIP: ValidImportCSV...` then `Passed: 51, Failed: 0`

### Recommended Next Workflow

- `/bmad-tea-bmad-testarch-test-review` — review coverage quality and identify remaining gaps
- Optional follow-up: add seeded MDB integration tests for the `CheckForFiles` → `SetupKit` pipeline using a disposable MDB copy (highest actual risk, currently uncovered)
