@sebastienrousseau/dotfiles 0.2.481 → 0.2.499

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/docs/ARCHITECTURE.md +29 -196
  2. package/docs/COMPLIANCE.md +10 -10
  3. package/docs/COPYRIGHT +3 -4
  4. package/docs/OPERATIONS.md +38 -65
  5. package/docs/PLAN.md +3 -3
  6. package/docs/PR_DESCRIPTION.md +85 -84
  7. package/docs/ROADMAP.md +11 -11
  8. package/docs/ROADMAP_legacy.md +556 -0
  9. package/docs/SECURITY_CHECKLIST.md +1 -1
  10. package/docs/TASK.md +4 -4
  11. package/docs/WALKTHROUGH.md +33 -152
  12. package/package.json +17 -5
  13. package/scripts/backup.sh +142 -0
  14. package/scripts/banner.sh +20 -0
  15. package/scripts/benchmark.sh +20 -0
  16. package/scripts/build.sh +41 -0
  17. package/scripts/clean.sh +31 -0
  18. package/scripts/compile.sh +54 -0
  19. package/scripts/copy.sh +108 -0
  20. package/scripts/{tools/detect-collisions.py → detect-collisions.py} +1 -1
  21. package/scripts/doctor.sh +79 -0
  22. package/scripts/dotfiles.sh +63 -0
  23. package/scripts/download.sh +35 -0
  24. package/scripts/help.sh +57 -0
  25. package/scripts/lock-configs.sh +57 -0
  26. package/scripts/package.sh +46 -0
  27. package/scripts/ssh.sh +55 -0
  28. package/scripts/teleport.sh +23 -0
  29. package/scripts/{tests/test-aliases.sh → test-aliases.sh} +3 -3
  30. package/scripts/test_smoke.sh +88 -0
  31. package/scripts/unpack.sh +28 -0
  32. package/scripts/{diagnostics/verify_state.sh → verify_state.sh} +21 -21
  33. package/templates/projects/go/README.md +0 -4
  34. package/templates/projects/node/README.md +0 -4
  35. package/templates/projects/python/README.md +0 -4
  36. package/templates/projects/python/pyproject.toml +0 -15
  37. package/CHANGELOG.md +0 -285
  38. package/LICENSE +0 -1283
  39. package/README.md +0 -315
  40. package/docs/ALIASES.md +0 -128
  41. package/docs/FEATURES.md +0 -166
  42. package/docs/FONTS.md +0 -147
  43. package/docs/INSTALL.md +0 -119
  44. package/docs/KEYS.md +0 -40
  45. package/docs/KEY_ROTATION.md +0 -219
  46. package/docs/LEGACY_ROADMAP.md +0 -142
  47. package/docs/NEOVIM_IDE_GUIDE.md +0 -52
  48. package/docs/README.md +0 -269
  49. package/docs/REPO_AUDIT.md +0 -23
  50. package/docs/SCREENSHOTS.md +0 -116
  51. package/docs/SECRETS.md +0 -76
  52. package/docs/SECURITY.md +0 -30
  53. package/docs/TESTING.md +0 -190
  54. package/docs/TOOLS.md +0 -146
  55. package/docs/TROUBLESHOOTING.md +0 -112
  56. package/docs/UTILS.md +0 -105
  57. package/docs/WSL2_NIX_TROUBLESHOOTING.md +0 -723
  58. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -101
  59. package/docs/adr/ADR-002-shell-performance.md +0 -121
  60. package/docs/adr/ADR-003-security-first.md +0 -140
  61. package/docs/adr/ADR-004-cli-architecture.md +0 -157
  62. package/docs/adr/ADR-005-chezmoi-choice.md +0 -89
  63. package/docs/adr/ADR-006-shell-selection.md +0 -115
  64. package/docs/adr/README.md +0 -33
  65. package/docs/themes/README.md +0 -20
  66. package/dot_config/aider/aider.conf.yml +0 -32
  67. package/dot_config/alacritty/alacritty.toml.tmpl +0 -483
  68. package/dot_config/ansible/ansible.cfg.tmpl +0 -11
  69. package/dot_config/atuin/config.toml +0 -23
  70. package/dot_config/bat/config +0 -8
  71. package/dot_config/brave-flags.conf.tmpl +0 -7
  72. package/dot_config/btop/btop.conf +0 -16
  73. package/dot_config/btop/themes/tokyonight.theme +0 -34
  74. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  75. package/dot_config/claude/mcp_servers.json +0 -49
  76. package/dot_config/clippy.toml +0 -55
  77. package/dot_config/containers/containers.conf +0 -14
  78. package/dot_config/curl/dot_curlrc +0 -18
  79. package/dot_config/dlv/config.yml +0 -39
  80. package/dot_config/docker/config.json.tmpl +0 -15
  81. package/dot_config/dotfiles/boot/README.md +0 -11
  82. package/dot_config/dotfiles/grub/README.md +0 -11
  83. package/dot_config/dotfiles/lock/README.md +0 -11
  84. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  85. package/dot_config/duf/duf.conf +0 -6
  86. package/dot_config/duti/defaults.duti +0 -5
  87. package/dot_config/emoji/emoji.txt +0 -34
  88. package/dot_config/fastfetch/config.jsonc +0 -28
  89. package/dot_config/firefox/user.js +0 -8
  90. package/dot_config/flatpak/flatpak.list +0 -4
  91. package/dot_config/fontconfig/fonts.conf.tmpl +0 -44
  92. package/dot_config/gem/gemrc +0 -9
  93. package/dot_config/gh/config.yml +0 -12
  94. package/dot_config/ghostty/config.tmpl +0 -661
  95. package/dot_config/git/attributes +0 -12
  96. package/dot_config/git/config.tmpl +0 -77
  97. package/dot_config/git/ignore +0 -27
  98. package/dot_config/gnupg/gpg-agent.conf.tmpl +0 -11
  99. package/dot_config/go/aliases.sh +0 -61
  100. package/dot_config/go/env.sh +0 -24
  101. package/dot_config/go/golangci.yml +0 -118
  102. package/dot_config/go/gopls.json +0 -30
  103. package/dot_config/goose/config.yaml +0 -29
  104. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -305
  105. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -66
  106. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -309
  107. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -21
  108. package/dot_config/htop/htoprc +0 -20
  109. package/dot_config/ice/README.md +0 -13
  110. package/dot_config/inputrc +0 -2
  111. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  112. package/dot_config/just/justfile +0 -104
  113. package/dot_config/k9s/config.yaml.tmpl +0 -65
  114. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  115. package/dot_config/karabiner/karabiner.json +0 -14
  116. package/dot_config/kitty/kitty.conf.tmpl +0 -517
  117. package/dot_config/lazydocker/config.yml +0 -186
  118. package/dot_config/lazygit/config.yml +0 -23
  119. package/dot_config/lsd/config.yaml +0 -19
  120. package/dot_config/mas/masapps.txt +0 -5
  121. package/dot_config/minikube/config.json +0 -13
  122. package/dot_config/mise/config.toml +0 -41
  123. package/dot_config/mongosh/mongoshrc.js +0 -67
  124. package/dot_config/mycli/myclirc +0 -67
  125. package/dot_config/nano/nanorc +0 -28
  126. package/dot_config/ncdu/config +0 -12
  127. package/dot_config/nvim/init.lua +0 -4
  128. package/dot_config/nvim/lazy-lock.json +0 -27
  129. package/dot_config/nvim/lua/config/autocmds.lua +0 -63
  130. package/dot_config/nvim/lua/config/keymaps.lua +0 -87
  131. package/dot_config/nvim/lua/config/lazy.lua +0 -34
  132. package/dot_config/nvim/lua/config/options.lua +0 -48
  133. package/dot_config/nvim/lua/plugins/coding.lua +0 -234
  134. package/dot_config/nvim/lua/plugins/dap.lua +0 -201
  135. package/dot_config/nvim/lua/plugins/editor.lua +0 -59
  136. package/dot_config/nvim/lua/plugins/git.lua +0 -9
  137. package/dot_config/nvim/lua/plugins/lsp.lua +0 -221
  138. package/dot_config/nvim/lua/plugins/markdown.lua +0 -17
  139. package/dot_config/nvim/lua/plugins/rust.lua +0 -33
  140. package/dot_config/nvim/lua/plugins/sessions.lua +0 -32
  141. package/dot_config/nvim/lua/plugins/ui.lua +0 -537
  142. package/dot_config/nvim/snippets/all.lua +0 -9
  143. package/dot_config/nvim/snippets/python.lua +0 -16
  144. package/dot_config/pip/pip.conf.tmpl +0 -32
  145. package/dot_config/pypoetry/config.toml.tmpl +0 -6
  146. package/dot_config/pyrightconfig.json.tmpl +0 -5
  147. package/dot_config/raycast/README.md +0 -13
  148. package/dot_config/redis/redisclirc +0 -41
  149. package/dot_config/shell/00-container-detect.sh +0 -53
  150. package/dot_config/shell/00-core-paths.sh.tmpl +0 -95
  151. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  152. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  153. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -10
  154. package/dot_config/shell/90-theme-switch.sh +0 -70
  155. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -35
  156. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -23
  157. package/dot_config/shell/Brewfile +0 -207
  158. package/dot_config/shell/Brewfile.cask +0 -92
  159. package/dot_config/shell/Brewfile.cli +0 -119
  160. package/dot_config/shell/README.md +0 -267
  161. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  162. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  163. package/dot_config/sops/dot_sops.yaml +0 -23
  164. package/dot_config/starship.toml.tmpl +0 -124
  165. package/dot_config/task/Taskfile.yml +0 -86
  166. package/dot_config/tflint/tflint.hcl.tmpl +0 -9
  167. package/dot_config/tmux/tmux.conf.tmpl +0 -181
  168. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  169. package/dot_config/vscode/extensions.txt +0 -11
  170. package/dot_config/vscode/settings.json.tmpl +0 -123
  171. package/dot_config/waybar/style.css +0 -8
  172. package/dot_config/wezterm/wezterm.lua.tmpl +0 -236
  173. package/dot_config/wget/wgetrc +0 -12
  174. package/dot_config/yarn/yarnrc.yml.tmpl +0 -36
  175. package/dot_config/yazi/yazi.toml +0 -40
  176. package/dot_config/zellij/config.kdl +0 -79
  177. package/dot_config/zsh/dot_zprofile +0 -13
  178. package/dot_config/zsh/dot_zshenv +0 -6
  179. package/dot_config/zsh/dot_zshrc.tmpl +0 -199
  180. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -5
  181. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  182. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  183. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -123
  184. package/dot_config/zsh/rc.d/40-bell.zsh.tmpl +0 -20
  185. package/dot_config/zsh/rc.d/50-login-fortune.zsh.tmpl +0 -9
  186. package/dot_local/bin/executable_ai_core +0 -130
  187. package/dot_local/bin/executable_b64 +0 -59
  188. package/dot_local/bin/executable_dot +0 -178
  189. package/dot_local/bin/executable_dot_completion +0 -55
  190. package/dot_local/bin/executable_epoch +0 -62
  191. package/dot_local/bin/executable_extract +0 -108
  192. package/dot_local/bin/executable_git-ai-commit +0 -160
  193. package/dot_local/bin/executable_git-ai-diff +0 -154
  194. package/dot_local/bin/executable_hash +0 -123
  195. package/dot_local/bin/executable_hex +0 -79
  196. package/dot_local/bin/executable_ip +0 -37
  197. package/dot_local/bin/executable_jsonv +0 -54
  198. package/dot_local/bin/executable_jwt +0 -78
  199. package/dot_local/bin/executable_kill-port +0 -59
  200. package/dot_local/bin/executable_lorem +0 -103
  201. package/dot_local/bin/executable_regex +0 -96
  202. package/dot_local/bin/executable_tmux-sessionizer +0 -187
  203. package/dot_local/bin/executable_tour +0 -137
  204. package/dot_local/bin/executable_update +0 -108
  205. package/dot_local/bin/executable_uuid +0 -57
  206. package/dot_local/bin/executable_yamlv +0 -39
  207. package/dot_local/bin/executable_zig-install +0 -89
  208. package/dot_local/bin/voice_ops +0 -7
  209. package/dot_local/share/bash-completion/completions/dot +0 -54
  210. package/dot_local/share/zsh/completions/.keep +0 -0
  211. package/install.sh +0 -255
  212. package/scripts/ci/validate-ci-config.sh +0 -222
  213. package/scripts/demo/record.sh +0 -41
  214. package/scripts/diagnostics/benchmark.sh +0 -201
  215. package/scripts/diagnostics/doctor.sh +0 -115
  216. package/scripts/diagnostics/drift-dashboard.sh +0 -26
  217. package/scripts/diagnostics/health.sh +0 -356
  218. package/scripts/diagnostics/history-analysis.sh +0 -77
  219. package/scripts/diagnostics/security-score.sh +0 -392
  220. package/scripts/dot/commands/appearance.sh +0 -63
  221. package/scripts/dot/commands/core.sh +0 -130
  222. package/scripts/dot/commands/diagnostics.sh +0 -100
  223. package/scripts/dot/commands/meta.sh +0 -117
  224. package/scripts/dot/commands/restore.sh +0 -209
  225. package/scripts/dot/commands/secrets.sh +0 -81
  226. package/scripts/dot/commands/security.sh +0 -73
  227. package/scripts/dot/commands/tools.sh +0 -228
  228. package/scripts/dot/lib/utils.sh +0 -72
  229. package/scripts/fonts/install-nerd-fonts.sh +0 -59
  230. package/scripts/fonts/patch-fonts.sh +0 -34
  231. package/scripts/ops/chezmoi-apply.sh +0 -42
  232. package/scripts/ops/chezmoi-diff.sh +0 -14
  233. package/scripts/ops/chezmoi-remove.sh +0 -43
  234. package/scripts/ops/chezmoi-update.sh +0 -16
  235. package/scripts/ops/heal.sh +0 -466
  236. package/scripts/ops/health-check.sh +0 -380
  237. package/scripts/ops/rollback.sh +0 -531
  238. package/scripts/ops/teleport.sh +0 -32
  239. package/scripts/secrets/age-init.sh +0 -69
  240. package/scripts/secrets/create-secrets-file.sh +0 -44
  241. package/scripts/secrets/encrypt-ssh-key.sh +0 -42
  242. package/scripts/security/backup.sh +0 -17
  243. package/scripts/security/dns-doh.sh +0 -29
  244. package/scripts/security/encryption-check.sh +0 -39
  245. package/scripts/security/enforce-policies.sh +0 -339
  246. package/scripts/security/firewall.sh +0 -34
  247. package/scripts/security/lock-configs.sh +0 -57
  248. package/scripts/security/lock-screen.sh +0 -33
  249. package/scripts/security/manage-secrets.sh +0 -415
  250. package/scripts/security/telemetry-kill.sh +0 -28
  251. package/scripts/security/usb-safety.sh +0 -29
  252. package/scripts/tests/README.md +0 -241
  253. package/scripts/tests/benchmark.sh +0 -91
  254. package/scripts/tests/framework/assertions.sh +0 -283
  255. package/scripts/tests/framework/mocks.sh +0 -201
  256. package/scripts/tests/framework/test_runner.sh +0 -189
  257. package/scripts/tests/integration/test_install.sh +0 -237
  258. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  259. package/scripts/tests/performance/regression_check.sh +0 -73
  260. package/scripts/tests/performance/stress_test.sh +0 -65
  261. package/scripts/tests/test-docker.sh +0 -48
  262. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  263. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  264. package/scripts/tests/unit/test_backup.sh +0 -227
  265. package/scripts/tests/unit/test_case_functions.sh +0 -238
  266. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  267. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  268. package/scripts/tests/unit/test_encode64.sh +0 -67
  269. package/scripts/tests/unit/test_environment.sh +0 -78
  270. package/scripts/tests/unit/test_extract.sh +0 -163
  271. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  272. package/scripts/tests/unit/test_genpass.sh +0 -298
  273. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  274. package/scripts/tests/unit/test_installers.sh +0 -172
  275. package/scripts/tests/unit/test_keygen.sh +0 -68
  276. package/scripts/tests/unit/test_logging.sh +0 -96
  277. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  278. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  279. package/scripts/tests/unit/test_prependpath.sh +0 -66
  280. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  281. package/scripts/tests/unit/test_rd.sh +0 -230
  282. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  283. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  284. package/scripts/tests/unit/test_template_validation.sh +0 -238
  285. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  286. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  287. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  288. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  289. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  290. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  291. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  292. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  293. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  294. package/scripts/tests/unit/test_zipf.sh +0 -76
  295. package/scripts/theme/apply-gnome-theme.sh +0 -297
  296. package/scripts/theme/install-boot-logo.sh +0 -61
  297. package/scripts/theme/install-catppuccin-themes.sh +0 -346
  298. package/scripts/theme/install-cursors.sh +0 -24
  299. package/scripts/theme/install-file-icons.sh +0 -25
  300. package/scripts/theme/install-grub-theme.sh +0 -51
  301. package/scripts/theme/install-lock-icon.sh +0 -29
  302. package/scripts/theme/switch.sh +0 -250
  303. package/scripts/theme/wallpaper-rotate.sh +0 -82
  304. package/scripts/theme/wallpaper-sync.sh +0 -42
  305. package/scripts/tools/cmatrix.sh +0 -20
  306. package/scripts/tools/emoji-picker.sh +0 -45
  307. package/scripts/tools/figlet-banner.sh +0 -17
  308. package/scripts/tools/log-rotate.sh +0 -29
  309. package/scripts/tools/lolcat-wrap.sh +0 -18
  310. package/scripts/tools/pipes.sh +0 -47
  311. package/scripts/tuning/linux.sh +0 -175
  312. package/scripts/tuning/macos.sh +0 -46
  313. package/templates/projects/molecule/README.md +0 -7
  314. package/templates/projects/molecule/converge.yml +0 -7
  315. package/templates/projects/molecule/molecule.yml +0 -16
  316. package/templates/projects/packer/README.md +0 -15
  317. package/templates/projects/packer/main.pkr.hcl +0 -15
@@ -1,144 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for utility functions: hostinfo, size, banner, stopwatch
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
- source "$SCRIPT_DIR/../framework/mocks.sh"
10
-
11
- FUNCS_DIR="$REPO_ROOT/.chezmoitemplates/functions"
12
-
13
- echo "Testing utility functions..."
14
-
15
- # ============ hostinfo ============
16
-
17
- if [[ -f "$FUNCS_DIR/hostinfo.sh" ]]; then
18
- source "$FUNCS_DIR/hostinfo.sh"
19
- fi
20
-
21
- test_start "hostinfo_function_exists"
22
- assert_true "type hostinfo &>/dev/null" "hostinfo function should exist"
23
-
24
- test_start "hostinfo_help"
25
- if type hostinfo &>/dev/null; then
26
- output=$(hostinfo --help 2>&1)
27
- if [[ "$output" == *"Usage:"* ]]; then
28
- ((TESTS_PASSED++))
29
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage"
30
- else
31
- ((TESTS_FAILED++))
32
- echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage"
33
- fi
34
- fi
35
-
36
- test_start "hostinfo_help_exit_code"
37
- if type hostinfo &>/dev/null; then
38
- hostinfo --help >/dev/null 2>&1
39
- assert_equals "0" "$?" "hostinfo --help should exit 0"
40
- fi
41
-
42
- test_start "hostinfo_shows_username"
43
- if type hostinfo &>/dev/null; then
44
- # Use timeout to avoid network-dependent delays (hostinfo fetches public IP)
45
- set +e
46
- output=$(timeout 5 bash -c 'source "'"$FUNCS_DIR/hostinfo.sh"'" && hostinfo' 2>&1)
47
- set -e
48
- if [[ "$output" == *"Username"* ]]; then
49
- ((TESTS_PASSED++))
50
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains Username"
51
- else
52
- ((TESTS_FAILED++))
53
- echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain Username"
54
- echo -e " Output: ${output:0:200}"
55
- fi
56
- fi
57
-
58
- test_start "hostinfo_shows_hostname"
59
- if type hostinfo &>/dev/null; then
60
- set +e
61
- output=$(timeout 5 bash -c 'source "'"$FUNCS_DIR/hostinfo.sh"'" && hostinfo' 2>&1)
62
- set -e
63
- if [[ "$output" == *"Hostname"* ]]; then
64
- ((TESTS_PASSED++))
65
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: output contains Hostname"
66
- else
67
- ((TESTS_FAILED++))
68
- echo -e " ${RED}✗${NC} $CURRENT_TEST: output should contain Hostname"
69
- fi
70
- fi
71
-
72
- # ============ size ============
73
-
74
- if [[ -f "$FUNCS_DIR/size.sh" ]]; then
75
- source "$FUNCS_DIR/size.sh"
76
- fi
77
-
78
- test_start "size_function_exists"
79
- assert_true "type size &>/dev/null" "size function should exist"
80
-
81
- test_start "size_no_args"
82
- if type size &>/dev/null; then
83
- set +e
84
- output=$(size 2>&1)
85
- ec=$?
86
- set -e
87
- assert_equals "1" "$ec" "size with no args should fail"
88
- fi
89
-
90
- test_start "size_with_file"
91
- if type size &>/dev/null; then
92
- test_dir=$(mock_dir "size_test")
93
- echo "test content" >"$test_dir/test.txt"
94
- output=$(size "$test_dir/test.txt" 2>&1) || true
95
- if [[ "$output" == *"INFO"* ]] || [[ "$output" == *"bytes"* ]] || [[ "$output" == *"size"* ]]; then
96
- ((TESTS_PASSED++))
97
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows size information"
98
- else
99
- ((TESTS_FAILED++))
100
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should show size information"
101
- echo -e " Output: $output"
102
- fi
103
- rm -rf "$test_dir"
104
- fi
105
-
106
- # ============ banner ============
107
-
108
- if [[ -f "$FUNCS_DIR/banner.sh" ]]; then
109
- source "$FUNCS_DIR/banner.sh"
110
- fi
111
-
112
- test_start "banner_function_exists"
113
- assert_true "type banner &>/dev/null" "banner function should exist"
114
-
115
- test_start "banner_no_script_error"
116
- if type banner &>/dev/null; then
117
- # Without the figlet-banner.sh script, banner should fail gracefully
118
- set +e
119
- DOTFILES_DIR="/nonexistent" output=$(banner "test" 2>&1)
120
- ec=$?
121
- set -e
122
- if [[ $ec -ne 0 ]] || [[ "$output" == *"not found"* ]] || [[ "$output" == *"ERROR"* ]]; then
123
- ((TESTS_PASSED++))
124
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: graceful error when script missing"
125
- else
126
- ((TESTS_PASSED++))
127
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: banner handled missing script"
128
- fi
129
- fi
130
-
131
- # ============ Cross-cutting: error path tests ============
132
-
133
- test_start "size_too_many_args"
134
- if type size &>/dev/null; then
135
- set +e
136
- output=$(size "arg1" "arg2" 2>&1)
137
- ec=$?
138
- set -e
139
- assert_equals "1" "$ec" "size with 2 args should fail"
140
- fi
141
-
142
- echo ""
143
- echo "Utility function tests completed."
144
- print_summary
@@ -1,132 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034,SC2016
3
- # Unit tests for Wave 1: Eager/Lazy alias split (90/91 templates)
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- EAGER_TMPL="$REPO_ROOT/dot_config/shell/90-ux-aliases.sh.tmpl"
11
- LAZY_TMPL="$REPO_ROOT/dot_config/shell/91-ux-aliases-lazy.sh.tmpl"
12
-
13
- echo "Testing Wave 1: Eager/Lazy alias split..."
14
-
15
- # --- Eager template (90) ---
16
-
17
- test_start "eager_template_exists"
18
- assert_file_exists "$EAGER_TMPL" "90-ux-aliases.sh.tmpl should exist"
19
-
20
- test_start "eager_template_has_shebang"
21
- first_line=$(head -n 1 "$EAGER_TMPL")
22
- if [[ "$first_line" == "#!/usr/bin/env bash" ]]; then
23
- ((TESTS_PASSED++))
24
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has proper shebang"
25
- else
26
- ((TESTS_FAILED++))
27
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should have #!/usr/bin/env bash shebang"
28
- fi
29
-
30
- test_start "eager_template_defines_core_categories"
31
- assert_file_contains "$EAGER_TMPL" 'coreCategories' "should define coreCategories list"
32
-
33
- test_start "eager_template_includes_cd"
34
- assert_file_contains "$EAGER_TMPL" '"cd"' "should include cd in core categories"
35
-
36
- test_start "eager_template_includes_git"
37
- assert_file_contains "$EAGER_TMPL" '"git"' "should include git in core categories"
38
-
39
- test_start "eager_template_includes_editor"
40
- assert_file_contains "$EAGER_TMPL" '"editor"' "should include editor in core categories"
41
-
42
- test_start "eager_template_includes_sudo"
43
- assert_file_contains "$EAGER_TMPL" '"sudo"' "should include sudo in core categories"
44
-
45
- test_start "eager_template_includes_modern"
46
- assert_file_contains "$EAGER_TMPL" '"modern"' "should include modern in core categories"
47
-
48
- test_start "eager_template_filters_isCore"
49
- assert_file_contains "$EAGER_TMPL" 'if and $isCore' "should filter by isCore == true"
50
-
51
- test_start "eager_template_excludes_macOS_inline"
52
- assert_file_contains "$EAGER_TMPL" 'not (contains "/macOS/" $name)' "should exclude macOS aliases from main loop"
53
-
54
- test_start "eager_template_has_macos_section"
55
- assert_file_contains "$EAGER_TMPL" 'eq .chezmoi.os "darwin"' "should have OS-specific macOS section"
56
-
57
- test_start "eager_template_uses_glob"
58
- assert_file_contains "$EAGER_TMPL" 'glob $globPattern' "should discover aliases via glob"
59
-
60
- test_start "eager_template_has_bash_compat"
61
- assert_file_contains "$EAGER_TMPL" 'expand_aliases' "should enable expand_aliases for bash compatibility"
62
-
63
- # Count expected core categories (14)
64
- test_start "eager_template_has_14_core_categories"
65
- core_count=$(grep -oE '"[a-z]+"' "$EAGER_TMPL" | head -14 | wc -l)
66
- if [[ $core_count -eq 14 ]]; then
67
- ((TESTS_PASSED++))
68
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has 14 core categories"
69
- else
70
- ((TESTS_FAILED++))
71
- echo -e " ${RED}✗${NC} $CURRENT_TEST: expected 14 core categories, found $core_count"
72
- fi
73
-
74
- # --- Lazy template (91) ---
75
-
76
- test_start "lazy_template_exists"
77
- assert_file_exists "$LAZY_TMPL" "91-ux-aliases-lazy.sh.tmpl should exist"
78
-
79
- test_start "lazy_template_has_shebang"
80
- first_line=$(head -n 1 "$LAZY_TMPL")
81
- if [[ "$first_line" == "#!/usr/bin/env bash" ]]; then
82
- ((TESTS_PASSED++))
83
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: has proper shebang"
84
- else
85
- ((TESTS_FAILED++))
86
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should have #!/usr/bin/env bash shebang"
87
- fi
88
-
89
- test_start "lazy_template_defines_core_categories"
90
- assert_file_contains "$LAZY_TMPL" 'coreCategories' "should define coreCategories for exclusion"
91
-
92
- test_start "lazy_template_excludes_core"
93
- assert_file_contains "$LAZY_TMPL" 'not $isCore' "should filter by NOT isCore"
94
-
95
- test_start "lazy_template_excludes_macOS"
96
- assert_file_contains "$LAZY_TMPL" 'not (contains "/macOS/" $name)' "should exclude macOS aliases"
97
-
98
- test_start "lazy_template_has_bash_compat"
99
- assert_file_contains "$LAZY_TMPL" 'expand_aliases' "should enable expand_aliases for bash compatibility"
100
-
101
- test_start "lazy_template_uses_glob"
102
- assert_file_contains "$LAZY_TMPL" 'glob $globPattern' "should discover aliases via glob"
103
-
104
- # Verify both templates use the same coreCategories list
105
- test_start "templates_share_core_categories"
106
- eager_cats=$(grep 'coreCategories' "$EAGER_TMPL" | head -1)
107
- lazy_cats=$(grep 'coreCategories' "$LAZY_TMPL" | head -1)
108
- if [[ "$eager_cats" == "$lazy_cats" ]]; then
109
- ((TESTS_PASSED++))
110
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: eager and lazy templates use identical coreCategories"
111
- else
112
- ((TESTS_FAILED++))
113
- echo -e " ${RED}✗${NC} $CURRENT_TEST: coreCategories differ between templates"
114
- echo -e " Eager: $eager_cats"
115
- echo -e " Lazy: $lazy_cats"
116
- fi
117
-
118
- # Verify both templates use the same glob pattern
119
- test_start "templates_share_glob_pattern"
120
- eager_glob=$(grep 'globPattern' "$EAGER_TMPL" | head -1)
121
- lazy_glob=$(grep 'globPattern' "$LAZY_TMPL" | head -1)
122
- if [[ "$eager_glob" == "$lazy_glob" ]]; then
123
- ((TESTS_PASSED++))
124
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: eager and lazy templates use identical globPattern"
125
- else
126
- ((TESTS_FAILED++))
127
- echo -e " ${RED}✗${NC} $CURRENT_TEST: globPattern differs between templates"
128
- fi
129
-
130
- echo ""
131
- echo "Wave 1 alias split tests completed."
132
- print_summary
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for Wave 1: CI chezmoi version pinning
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- CI_FILE="$REPO_ROOT/.github/workflows/ci.yml"
11
-
12
- echo "Testing Wave 1: CI chezmoi version pinning..."
13
-
14
- test_start "ci_yml_exists"
15
- assert_file_exists "$CI_FILE" "ci.yml should exist"
16
-
17
- test_start "ci_chezmoi_version_env"
18
- assert_file_contains "$CI_FILE" "CHEZMOI_VERSION:" "should define CHEZMOI_VERSION env variable"
19
-
20
- test_start "ci_chezmoi_version_pinned"
21
- # Verify the version is a proper semver (not 'latest')
22
- if grep -q 'CHEZMOI_VERSION:.*"[0-9]' "$CI_FILE"; then
23
- ((TESTS_PASSED++))
24
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: CHEZMOI_VERSION is pinned to a semver"
25
- else
26
- ((TESTS_FAILED++))
27
- echo -e " ${RED}✗${NC} $CURRENT_TEST: CHEZMOI_VERSION should be pinned to a semver"
28
- fi
29
-
30
- test_start "ci_chezmoi_not_latest"
31
- if grep -q 'CHEZMOI_VERSION.*latest' "$CI_FILE" 2>/dev/null; then
32
- ((TESTS_FAILED++))
33
- echo -e " ${RED}✗${NC} $CURRENT_TEST: CHEZMOI_VERSION should not be 'latest'"
34
- else
35
- ((TESTS_PASSED++))
36
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: CHEZMOI_VERSION is not 'latest'"
37
- fi
38
-
39
- test_start "ci_chezmoi_uses_tag_flag"
40
- # get.chezmoi.io uses -t flag, not -v
41
- if grep -q 'get.chezmoi.io.*-v ' "$CI_FILE" 2>/dev/null; then
42
- ((TESTS_FAILED++))
43
- echo -e " ${RED}✗${NC} $CURRENT_TEST: get.chezmoi.io should use -t flag, not -v"
44
- else
45
- ((TESTS_PASSED++))
46
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: get.chezmoi.io does not use incorrect -v flag"
47
- fi
48
-
49
- test_start "ci_chezmoi_tag_format"
50
- # Should use -t vX.Y.Z format
51
- if grep -q '\-t v' "$CI_FILE"; then
52
- ((TESTS_PASSED++))
53
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses -t v prefix for chezmoi tag"
54
- else
55
- ((TESTS_FAILED++))
56
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use -t vX.Y.Z format"
57
- fi
58
-
59
- echo ""
60
- echo "Wave 1 CI pinning tests completed."
61
- print_summary
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for Wave 1: gitleaks configuration
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- GITLEAKS_CONF="$REPO_ROOT/config/gitleaks.toml"
11
-
12
- echo "Testing Wave 1: gitleaks configuration..."
13
-
14
- test_start "gitleaks_config_exists"
15
- assert_file_exists "$GITLEAKS_CONF" ".gitleaks.toml should exist"
16
-
17
- test_start "gitleaks_extends_default"
18
- assert_file_contains "$GITLEAKS_CONF" "useDefault = true" "should extend default gitleaks config"
19
-
20
- test_start "gitleaks_has_allowlist"
21
- assert_file_contains "$GITLEAKS_CONF" "[allowlist]" "should have allowlist section"
22
-
23
- test_start "gitleaks_allows_gpg_key"
24
- assert_file_contains "$GITLEAKS_CONF" "CHEZMOI_GPG_KEY=" "should allowlist GPG key variable"
25
-
26
- test_start "gitleaks_has_path_ignores"
27
- assert_file_contains "$GITLEAKS_CONF" "paths = [" "should have path-based ignores"
28
-
29
- test_start "gitleaks_ignores_docs"
30
- assert_file_contains "$GITLEAKS_CONF" "docs/" "should ignore docs directory"
31
-
32
- test_start "gitleaks_has_commit_allowlist"
33
- assert_file_contains "$GITLEAKS_CONF" "commits = [" "should have commit allowlist"
34
-
35
- test_start "gitleaks_has_stopwords"
36
- assert_file_contains "$GITLEAKS_CONF" "stopwords = [" "should have stopwords list"
37
-
38
- test_start "gitleaks_has_custom_rules"
39
- assert_file_contains "$GITLEAKS_CONF" "[[rules]]" "should define custom detection rules"
40
-
41
- test_start "gitleaks_aws_rule"
42
- assert_file_contains "$GITLEAKS_CONF" "aws-session-token" "should detect AWS session tokens"
43
-
44
- test_start "gitleaks_gcp_rule"
45
- assert_file_contains "$GITLEAKS_CONF" "gcp-api-key" "should detect GCP API keys"
46
-
47
- test_start "gitleaks_azure_rule"
48
- assert_file_contains "$GITLEAKS_CONF" "azure-connection-string" "should detect Azure connection strings"
49
-
50
- echo ""
51
- echo "Wave 1 gitleaks configuration tests completed."
52
- print_summary
@@ -1,97 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034
3
- # Unit tests for Wave 1: heal.sh shellcheck and shfmt fixes
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- HEAL_SCRIPT="$REPO_ROOT/scripts/ops/heal.sh"
11
-
12
- echo "Testing Wave 1: heal.sh fixes..."
13
-
14
- test_start "heal_exists"
15
- assert_file_exists "$HEAL_SCRIPT" "heal.sh should exist"
16
-
17
- test_start "heal_syntax"
18
- assert_exit_code 0 "bash -n '$HEAL_SCRIPT'"
19
-
20
- test_start "heal_strict_mode"
21
- assert_file_contains "$HEAL_SCRIPT" "set -euo pipefail" "should use strict mode"
22
-
23
- test_start "heal_no_sc2015_pattern"
24
- # SC2015: A && B || C is not if-then-else. Should use proper if/then.
25
- # Check that the backup loop does NOT use && ... || pattern
26
- backup_block=$(sed -n '/create_pre_heal_backup/,/^}/p' "$HEAL_SCRIPT")
27
- if echo "$backup_block" | grep -q '&&.*cp.*||' 2>/dev/null; then
28
- ((TESTS_FAILED++))
29
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should not use A && B || C pattern (SC2015)"
30
- else
31
- ((TESTS_PASSED++))
32
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no SC2015 pattern in backup block"
33
- fi
34
-
35
- test_start "heal_backup_uses_if"
36
- # The backup file copy should use proper if/then
37
- if echo "$backup_block" | grep -q 'if \[\[.*-f.*\]\]; then' 2>/dev/null; then
38
- ((TESTS_PASSED++))
39
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup uses proper if/then for file copy"
40
- else
41
- ((TESTS_PASSED++))
42
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: backup block refactored (no A&&B||C)"
43
- fi
44
-
45
- test_start "heal_shfmt_case_spacing"
46
- # Verify case branch formatting (should not have extra spaces like "brew) ")
47
- if grep -qP 'brew\)\s{3,}' "$HEAL_SCRIPT" 2>/dev/null; then
48
- ((TESTS_FAILED++))
49
- echo -e " ${RED}✗${NC} $CURRENT_TEST: case branches should not have extra spaces"
50
- else
51
- ((TESTS_PASSED++))
52
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: case branch spacing is correct"
53
- fi
54
-
55
- test_start "heal_shfmt_pipe_spacing"
56
- # Verify pipe spacing in case patterns (should be "apt | dnf" not "apt|dnf")
57
- if grep -qP 'apt\|dnf' "$HEAL_SCRIPT" 2>/dev/null; then
58
- ((TESTS_FAILED++))
59
- echo -e " ${RED}✗${NC} $CURRENT_TEST: case pipes should have spaces (apt | dnf)"
60
- else
61
- ((TESTS_PASSED++))
62
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: case pipe spacing is correct"
63
- fi
64
-
65
- test_start "heal_has_help_flag"
66
- if grep -qF -- "--help" "$HEAL_SCRIPT"; then
67
- ((TESTS_PASSED++))
68
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --help flag"
69
- else
70
- ((TESTS_FAILED++))
71
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --help flag"
72
- fi
73
-
74
- test_start "heal_has_dry_run"
75
- if grep -qF -- "--dry-run" "$HEAL_SCRIPT"; then
76
- ((TESTS_PASSED++))
77
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --dry-run flag"
78
- else
79
- ((TESTS_FAILED++))
80
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --dry-run flag"
81
- fi
82
-
83
- test_start "heal_has_force"
84
- if grep -qF -- "--force" "$HEAL_SCRIPT"; then
85
- ((TESTS_PASSED++))
86
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: should support --force flag"
87
- else
88
- ((TESTS_FAILED++))
89
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should support --force flag"
90
- fi
91
-
92
- test_start "heal_persist_log"
93
- assert_file_contains "$HEAL_SCRIPT" "persist_log" "should log actions persistently"
94
-
95
- echo ""
96
- echo "Wave 1 heal.sh fix tests completed."
97
- print_summary
@@ -1,35 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2016,SC2034
3
- # Unit tests for Wave 1: install.sh chezmoi installation strategy
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- INSTALL_SCRIPT="$REPO_ROOT/install.sh"
11
-
12
- echo "Testing Wave 1: install.sh chezmoi installation..."
13
-
14
- test_start "install_brew_chezmoi"
15
- assert_file_contains "$INSTALL_SCRIPT" "brew install chezmoi" "should install chezmoi via Homebrew when available"
16
-
17
- test_start "install_fallback_get_chezmoi"
18
- assert_file_contains "$INSTALL_SCRIPT" "get.chezmoi.io" "should fall back to get.chezmoi.io"
19
-
20
- test_start "install_chezmoi_already_installed"
21
- assert_file_contains "$INSTALL_SCRIPT" "chezmoi already installed" "should detect existing chezmoi"
22
-
23
- test_start "install_local_bin_path"
24
- assert_file_contains "$INSTALL_SCRIPT" 'bin_dir="$HOME/.local/bin"' "should install to ~/.local/bin as fallback"
25
-
26
- test_start "install_version_pinned"
27
- # VERSION is used for the dotfiles tag, not chezmoi binary
28
- assert_file_contains "$INSTALL_SCRIPT" 'VERSION=' "should pin dotfiles version"
29
-
30
- test_start "install_source_dir_defined"
31
- assert_file_contains "$INSTALL_SCRIPT" 'SOURCE_DIR="$HOME/.dotfiles"' "should define source directory"
32
-
33
- echo ""
34
- echo "Wave 1 install.sh chezmoi installation tests completed."
35
- print_summary
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env bash
2
- # shellcheck disable=SC1090,SC1091,SC2034,SC2016
3
- # Unit tests for Wave 1: dot_zshenv PATH entries
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
- REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
8
- source "$SCRIPT_DIR/../framework/assertions.sh"
9
-
10
- ZSHENV="$REPO_ROOT/dot_zshenv"
11
-
12
- echo "Testing Wave 1: dot_zshenv PATH entries..."
13
-
14
- test_start "zshenv_exists"
15
- assert_file_exists "$ZSHENV" "dot_zshenv should exist"
16
-
17
- test_start "zshenv_xdg_config"
18
- assert_file_contains "$ZSHENV" 'XDG_CONFIG_HOME' "should set XDG_CONFIG_HOME"
19
-
20
- test_start "zshenv_xdg_cache"
21
- assert_file_contains "$ZSHENV" 'XDG_CACHE_HOME' "should set XDG_CACHE_HOME"
22
-
23
- test_start "zshenv_xdg_data"
24
- assert_file_contains "$ZSHENV" 'XDG_DATA_HOME' "should set XDG_DATA_HOME"
25
-
26
- test_start "zshenv_xdg_state"
27
- assert_file_contains "$ZSHENV" 'XDG_STATE_HOME' "should set XDG_STATE_HOME"
28
-
29
- test_start "zshenv_local_bin_path"
30
- assert_file_contains "$ZSHENV" '.local/bin' "should add ~/.local/bin to PATH"
31
-
32
- test_start "zshenv_local_bin_guard"
33
- # Should use idempotent guard (check before adding)
34
- if grep -qF 'PATH' "$ZSHENV" && grep -qF '.local/bin' "$ZSHENV"; then
35
- ((TESTS_PASSED++)) || true
36
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: ~/.local/bin has PATH guard"
37
- else
38
- ((TESTS_FAILED++)) || true
39
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use idempotent guard for ~/.local/bin"
40
- fi
41
-
42
- test_start "zshenv_local_bin_dir_check"
43
- # grep -qF interprets -d as a flag, so use -- separator
44
- if grep -qF -- '-d "${HOME}/.local/bin"' "$ZSHENV"; then
45
- ((TESTS_PASSED++)) || true
46
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks ~/.local/bin directory exists"
47
- else
48
- ((TESTS_FAILED++)) || true
49
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should check ~/.local/bin directory exists"
50
- fi
51
-
52
- test_start "zshenv_homebrew_path"
53
- assert_file_contains "$ZSHENV" '/opt/homebrew/bin' "should add /opt/homebrew/bin to PATH"
54
-
55
- test_start "zshenv_homebrew_guard"
56
- # Should use idempotent guard for Homebrew
57
- if grep -qF '/opt/homebrew/bin' "$ZSHENV" && grep -qF 'PATH' "$ZSHENV"; then
58
- ((TESTS_PASSED++)) || true
59
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: /opt/homebrew/bin has PATH guard"
60
- else
61
- ((TESTS_FAILED++)) || true
62
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should use idempotent guard for /opt/homebrew/bin"
63
- fi
64
-
65
- test_start "zshenv_homebrew_dir_check"
66
- if grep -qF -- '-d "/opt/homebrew/bin"' "$ZSHENV"; then
67
- ((TESTS_PASSED++)) || true
68
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: checks /opt/homebrew/bin directory exists"
69
- else
70
- ((TESTS_FAILED++)) || true
71
- echo -e " ${RED}✗${NC} $CURRENT_TEST: should check /opt/homebrew/bin directory exists"
72
- fi
73
-
74
- test_start "zshenv_zdotdir"
75
- assert_file_contains "$ZSHENV" 'ZDOTDIR' "should set ZDOTDIR"
76
-
77
- test_start "zshenv_no_heavy_init"
78
- # zshenv should NOT contain eval statements (heavy init belongs in zshrc)
79
- if grep -q '^eval ' "$ZSHENV" 2>/dev/null; then
80
- ((TESTS_FAILED++)) || true
81
- echo -e " ${RED}✗${NC} $CURRENT_TEST: zshenv should not contain eval (heavy init)"
82
- else
83
- ((TESTS_PASSED++)) || true
84
- echo -e " ${GREEN}✓${NC} $CURRENT_TEST: no heavy eval in zshenv"
85
- fi
86
-
87
- echo ""
88
- echo "Wave 1 dot_zshenv PATH tests completed."
89
- print_summary