Files
envr/TEST_PLAN.md

3.3 KiB

Test Coverage Plan

Current State

  • 101 tests, all passing
  • Strong coverage: crypto (100%), ssh (90%), db CRUD + env_file + update_dir, config save/load + paths, scan, features, cant_scan, parse_args
  • Misleading test files: cmd_check_test, cmd_list_test, cmd_nushell_completion_test don't test their namesake procs
  • Biggest remaining gap: all cmd_* handlers untested

Next: load_config / save_config path param + -c/--config-file flag

  • Refactor load_config(path: string = "") and save_config(cfg, force, path: string = "") — empty string defaults to ~/.envr/config.json
  • Add -c/--config-file to parse_args (now testable)
  • Wire through main.odin so commands receive the config path
  • Unblocks command handler tests with fixture configs

Command handlers (need DB + filesystem fixtures)

cmd_version (cmd_version.odin)

  • Test default output (prints VERSION)
  • Capture stdout, assert content

cmd_list (cmd_list.odin)

  • Test TTY path: fixture DB with rows, capture table output
  • Test non-TTY path: capture JSON output, unmarshal and verify keys/values
  • Test empty DB: verify clean output (empty table or [])

cmd_backup (cmd_backup.odin)

  • Test successful backup: valid path, verify db_insert called
  • Test missing file: verify error message
  • Test duplicate backup: verify rejection or update behavior

cmd_remove (cmd_remove.odin)

  • Test successful removal: existing entry, verify db_delete called
  • Test removal of non-existent entry: verify error or no-op

cmd_restore (cmd_restore.odin)

  • Test successful restore: entry exists in DB, verify file written to correct path
  • Test restore of missing entry: verify error
  • Test directory creation: restore to path with missing parent dirs

Hard to test (interactive / external deps)

cmd_deps (cmd_deps.odin)

  • Needs git and/or fd in PATH
  • Test TTY and non-TTY paths
  • Skip if dependencies not available (with #assert like TODO 28 suggests)

cmd_scan (cmd_scan.odin)

  • Needs fd installed
  • Test with fixture git repo containing .env files
  • Test find_unbacked integration (already partially tested in cmd_check_test.odin)
  • Non-TTY JSON output path

cmd_edit_config (cmd_edit_config.odin)

  • Needs refactoring: extract $EDITOR parsing into testable helper (TODO 12)
  • Test multi-word editor values ("code -w")
  • Test missing $EDITOR

cmd_init (cmd_init.odin)

  • Interactive prompt makes this hard
  • Needs refactoring: extract SSH key discovery and config generation into testable procs
  • Test --force flag behavior

prompt.odin

  • Needs refactoring to be testable
  • render_options could be tested if it accepted an io.Writer
  • read_key could be tested with a pipe/redirect instead of raw stdin
  • multi_select is end-to-end interactive, likely integration test only

Notes

  • All command handler tests will need stdout capture. Consider extracting a helper or using io.Writer injection.
  • DB integration tests should use in-memory SQLite (:memory:) where possible.
  • Temp dir fixtures should follow the pattern in scan_test.odin.
  • External dependency tests (fd, git) should use #assert to ensure the dependency is present rather than silently skipping (TODO 28).
  • Tests that manipulate the HOME env var must use a mutex to prevent races with parallel test execution.