# Map Columns — corpus

Acceptance fixtures for `src/core/column_mapper.py`. Each `.csv` under
`test_data/` is paired with assertions in
`tests/test_column_mapper_corpus.py`.

## Use cases (target client profiles)

| File | Buyer profile | Tested behaviour |
|------|---------------|------------------|
| `uc01_crm_import.csv` + `schemas/uc01_crm_target.json`         | Sales ops admin importing leads into Salesforce / HubSpot | Schema enforcement: rename via aliases, coerce types, drop extras, add `owner` default. |
| `uc02_vendor_{a,b,c}.csv` + `schemas/uc02_canonical.json`      | Operator unifying vendor exports                          | Multi-source unification: each vendor uses different headers; auto-inference resolves them all. |
| `uc03_type_coercion.csv` + `schemas/uc03_types.json`           | Analyst quick-fixing a mistyped CSV                       | Mixed-type coercion with documented per-column failure counts (bad rows survive as NaN). |

## Edge cases

| File | Stresses |
|------|----------|
| `ec01_duplicate_target.csv`     | Mapping two source columns to the same target → InputValidationError. |
| `ec02_unicode_columns.csv`      | Non-ASCII column names (Japanese) survive rename and coerce. |
| `ec03_whitespace_headers.csv`   | Leading/trailing whitespace in headers still fuzzy-matches the schema. |
| `ec04_no_match.csv`             | No source column scores above threshold → empty mapping, fallback unmapped strategy fires. |
| `ec05_required_missing.csv`     | Required target field has no source column → InputValidationError unless `enforce_required=False`. |
