# Test Coverage Plans Baseline: 51.0% total statements (2026-10-03, after PRs #41-#43). Now: 80.0% total (no live DBs). All 8 plans done; most deferred readers/writers covered. Scope: pgsql, sqlexec, template, plus non-reader/writer packages. ## Order | # | Plan | Package(s) | Now | |---|------|-----------|-----| | 1 | [pgsql.md](pgsql.md) | readers/pgsql, writers/pgsql, pkg/pgsql | 92.4 / 86.5 / 87.8 (done, live) | | 2 | [sqlexec.md](sqlexec.md) | writers/sqlexec | 99.0 (done, live) | | 3 | [template.md](template.md) | writers/template | 98.9 (done) | | 4 | [models.md](models.md) | pkg/models | 99.1 (done) | | 5 | [cmd.md](cmd.md) | cmd/relspec, pkg/jobs | 71.3 / 96.6 (done) | | 6 | [ui.md](ui.md) | pkg/ui | 69.9 (done) | | 7 | [diff-merge.md](diff-merge.md) | pkg/diff, pkg/merge | 92.1 / 98.1 (done) | | 8 | [sqltypes.md](sqltypes.md) | pkg/sqltypes | 87.0 (done) | ## Beyond the plans (previously deferred) | Package | Before | Now | |---------|--------|-----| | writers/prisma | 2.0 | 96.5 | | readers/prisma | 37.5 | 97.5 | | readers/typeorm | 5.5 | 97.0 | | writers/typeorm | 55.5 | 98.4 | | writers/drizzle | 49.1 | 92.8 | | writers/mssql | 38.3 | 89.1 | | writers/mysql | 49.5 | 89.8 | | writers/sqlite | 63.2 | 90.1 | | readers/drizzle | 0 | 77.9 | | readers/gorm | 65.6 | 88.5 | | readers/bun | 72.5 | 87.0 | | writers/gorm | 76.2 | 87.9 | | writers/bun | 79.3 | 89.6 | | pkg/writers | 26.6 | 97.2 | | pkg/transform | 0 | 100.0 | | pkg/updatecheck (new, #32) | - | 100.0 | | cmd/relspec `update` (new, #32) | - | tested | ## Remaining - `writers/dctx` (77.1): `WriteDatabase`, `WriteTable`, `mapDataType`. - Live DB (need containers): `readers/mssql` (2.6), `readers/mysql` (2.5), `readers/pgsql` (19.0 without DB), `writers/sqlexec` (24.3 without DB), live MSSQL execute path. - Untested: NSIS script `windows/installer.nsi` (needs `makensis` / Windows). - `drawdb`, `dbml`, `graphql`, `json`, `yaml`, `drizzle` reader: 77-87, above target but not specifically planned. ## Conventions - Same package as code under test; table-driven; must pass `-race`. - Existing data first: `tests/assets/*`, `examples/*.dbml`, `tests/postgres/init.sql`, `tests/postgres/issue21`. Generate new data only where listed under "Data needed". - New fixtures go in `tests/assets//` or package `testdata/`. - Live-DB tests: skip unless the env var is set (pattern in `pkg/readers/pgsql/reader_test.go`). Use `tests/dbtest/dbtest.sh` (podman/docker; see `tests/dbtest/README.md`): - `dbtest.sh up|down ` - `eval "$(dbtest.sh env postgres)"` sets `RELSPEC_TEST_PG_CONN` (mssql: `RELSPEC_TEST_MSSQL_CONN`, mysql: `RELSPEC_TEST_MYSQL_CONN`) - `dbtest.sh test [pkgs]` runs up, `go test`, down - Fixtures for live DBs: postgres `tests/postgres/init.sql`, mssql `test_data/mssql/test_schema.sql`, mysql `tests/dbtest/init/mysql.sql`. - Prerequisite: working container networking (currently blocked until reboot into matching kernel; `tun` module). - Prefer pure-function tests over DB tests wherever the logic can be isolated. - Output assertions must not depend on map order (see memory: map iteration determinism). ## Targets | Package | Target | |---------|--------| | pgsql (all three) | >= 85 | | sqlexec | >= 80 | | template | >= 85 | | models | >= 80 | | cmd/relspec | >= 65 | | jobs | >= 85 | | ui | >= 40 (data ops/pure helpers; screens via smoke tests) | | diff, merge | >= 85 | | sqltypes | >= 85 | ## Verify - `go test -race -coverprofile=c.out ./pkg//` then `go tool cover -func=c.out` - `make test` before commit