@sebastienrousseau/dotfiles 0.2.481 → 0.2.500
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.
- package/CHANGELOG.md +122 -32
- package/LICENSE +1 -1
- package/README.md +211 -242
- package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
- package/docs/AI.md +102 -0
- package/docs/COPYRIGHT +2 -2
- package/docs/NAMING_CONVENTIONS.md +95 -0
- package/docs/README.md +58 -249
- package/docs/adr/ADR-004-cli-architecture.md +2 -2
- package/docs/adr/ADR-006-shell-selection.md +2 -2
- package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
- package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
- package/docs/adr/README.md +2 -3
- package/docs/architecture/ARCHITECTURE.md +113 -0
- package/docs/architecture/INTEROP.md +36 -0
- package/docs/architecture/REPO_LAYOUT.md +237 -0
- package/docs/architecture/WALKTHROUGH.md +82 -0
- package/docs/architecture/fleet-deployment.md +73 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
- package/docs/archive/MILESTONE_v0.2.493.md +43 -0
- package/docs/{PLAN.md → archive/PLAN.md} +1 -1
- package/docs/guides/INSTALL.md +140 -0
- package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
- package/docs/guides/THEMING.md +222 -0
- package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
- package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
- package/docs/index.md +39 -0
- package/docs/interop/A2A.md +32 -0
- package/docs/manual/00-introduction.md +85 -0
- package/docs/manual/01-concepts/01-architecture.md +134 -0
- package/docs/manual/01-concepts/02-trust-model.md +178 -0
- package/docs/manual/01-concepts/03-theme-engine.md +182 -0
- package/docs/manual/01-concepts/04-fleet.md +142 -0
- package/docs/manual/01-concepts/05-self-healing.md +197 -0
- package/docs/manual/02-tutorials/01-first-install.md +192 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
- package/docs/manual/02-tutorials/03-create-profile.md +238 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
- package/docs/manual/03-reference/01-dot-cli.md +413 -0
- package/docs/manual/03-reference/02-config-files.md +259 -0
- package/docs/manual/03-reference/03-environment.md +120 -0
- package/docs/manual/03-reference/04-templates.md +184 -0
- package/docs/manual/03-reference/05-feature-flags.md +118 -0
- package/docs/manual/04-cookbook/01-recipes.md +281 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
- package/docs/manual/04-cookbook/03-faq.md +167 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
- package/docs/manual/05-appendices/B-security-checklist.md +78 -0
- package/docs/manual/05-appendices/C-glossary.md +36 -0
- package/docs/manual/05-appendices/D-bibliography.md +54 -0
- package/docs/manual/05-appendices/E-license.md +34 -0
- package/docs/manual/_toc.yml +58 -0
- package/docs/manual/command-index.md +58 -0
- package/docs/manual/concept-index.md +164 -0
- package/docs/operations/ATTESTATION.md +39 -0
- package/docs/operations/MAINTENANCE.md +59 -0
- package/docs/operations/MIGRATION.md +101 -0
- package/docs/operations/OPERATIONS.md +164 -0
- package/docs/operations/RELIABILITY.md +116 -0
- package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
- package/docs/operations/TESTING.md +195 -0
- package/docs/operations/TRACEABILITY.md +31 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
- package/docs/operations/VERSION_SYNC.md +344 -0
- package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
- package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
- package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
- package/docs/reference/FEATURES.md +62 -0
- package/docs/reference/FONTS.md +108 -0
- package/docs/reference/PROFILES.md +65 -0
- package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
- package/docs/reference/SCRIPTS.md +67 -0
- package/docs/reference/SUPPORT_MATRIX.md +74 -0
- package/docs/reference/THEMES.md +113 -0
- package/docs/reference/TOOLS.md +105 -0
- package/docs/reference/UTILS.md +151 -0
- package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
- package/docs/security/AUTOMATION_SECRETS.md +22 -0
- package/docs/security/COMPLIANCE.md +453 -0
- package/docs/security/ENCRYPTION.md +52 -0
- package/docs/security/FMEA.md +155 -0
- package/docs/security/INCIDENT_RESPONSE.md +575 -0
- package/docs/security/KEYS.md +45 -0
- package/docs/security/MCP_POLICY.md +69 -0
- package/docs/security/POLICY_RELEASES.md +33 -0
- package/docs/security/README.md +24 -0
- package/docs/security/SECRETS.md +146 -0
- package/docs/security/SECURITY.md +41 -0
- package/docs/security/SECURITY_CHECKLIST.md +44 -0
- package/docs/security/SOUP_REGISTER.md +32 -0
- package/docs/security/THREAT_MODEL.md +120 -0
- package/docs/security/VERIFICATION_VALIDATION.md +224 -0
- package/docs/themes/README.md +3 -17
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
- package/docs/themes/hero-shot.svg +78 -0
- package/dot_config/.module-manifest.json +69 -0
- package/dot_config/ai/identity.md +20 -0
- package/dot_config/ai/patterns/architect.md +14 -0
- package/dot_config/ai/patterns/hardener.md +13 -0
- package/dot_config/ai/patterns/refactor.md +13 -0
- package/dot_config/aider/aider.conf.yml +1 -1
- package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
- package/dot_config/atuin/config.toml +18 -1
- package/dot_config/bat/config +16 -1
- package/dot_config/claude/mcp_servers.json +3 -32
- package/dot_config/dotfiles/agent-card.json +29 -0
- package/dot_config/dotfiles/agent-profiles.json +92 -0
- package/dot_config/dotfiles/boot/README.md +1 -1
- package/dot_config/dotfiles/grub/README.md +1 -1
- package/dot_config/dotfiles/lock/README.md +1 -1
- package/dot_config/dotfiles/mcp-lock.json +33 -0
- package/dot_config/dotfiles/mcp-policy.json +52 -0
- package/dot_config/dotfiles/mcp-registry.json +47 -0
- package/dot_config/dotfiles/model-registry.json +20 -0
- package/dot_config/dotfiles/policy-bundles.json +38 -0
- package/dot_config/dotfiles/prompt-registry.json +16 -0
- package/dot_config/dotfiles/versions.env +18 -0
- package/dot_config/environment.d/50-ssh-agent.conf +2 -0
- package/dot_config/environment.d/90-wayland.conf +19 -0
- package/dot_config/firefox/user.js.tmpl +58 -0
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
- package/dot_config/fish/completions/dot.fish.tmpl +115 -0
- package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
- package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
- package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
- package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
- package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
- package/dot_config/fish/config.fish.tmpl +44 -0
- package/dot_config/fish/fish_plugins +1 -0
- package/dot_config/fish/functions/_.fish +3 -0
- package/dot_config/fish/functions/_cached_eval.fish +58 -0
- package/dot_config/fish/functions/als.fish +46 -0
- package/dot_config/fish/functions/bg-upgrade.fish +7 -0
- package/dot_config/fish/functions/c.fish +3 -0
- package/dot_config/fish/functions/cat.fish +9 -0
- package/dot_config/fish/functions/d.fish +7 -0
- package/dot_config/fish/functions/dot.fish +34 -0
- package/dot_config/fish/functions/h.fish +3 -0
- package/dot_config/fish/functions/l.fish +7 -0
- package/dot_config/fish/functions/la.fish +7 -0
- package/dot_config/fish/functions/ll.fish +7 -0
- package/dot_config/fish/functions/log_error.fish +13 -0
- package/dot_config/fish/functions/log_info.fish +13 -0
- package/dot_config/fish/functions/lr.fish +7 -0
- package/dot_config/fish/functions/lra.fish +7 -0
- package/dot_config/fish/functions/ls.fish +7 -0
- package/dot_config/fish/functions/lt.fish +7 -0
- package/dot_config/fish/functions/lta.fish +7 -0
- package/dot_config/fish/functions/notify-run.fish +11 -0
- package/dot_config/fish/functions/q.fish +3 -0
- package/dot_config/fish/functions/silent-run.fish +7 -0
- package/dot_config/fish/functions/yy.fish +8 -0
- package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
- package/dot_config/foot/foot.ini.tmpl +33 -0
- package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
- package/dot_config/fzf/fzf.zsh +48 -0
- package/dot_config/ghostty/config.tmpl +69 -565
- package/dot_config/git/allowed_signers.tmpl +18 -0
- package/dot_config/git/commit-template +10 -0
- package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
- package/dot_config/goose/config.yaml +2 -2
- package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
- package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
- package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
- package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
- package/dot_config/ipython/profile_default/ipython_config.py +19 -0
- package/dot_config/just/justfile +18 -0
- package/dot_config/kanshi/config.tmpl +22 -0
- package/dot_config/kitty/kitty.conf.tmpl +44 -508
- package/dot_config/lazygit/config.yml +18 -6
- package/dot_config/mako/config +47 -0
- package/dot_config/micro/settings.json +3 -0
- package/dot_config/mimeapps.list +77 -0
- package/dot_config/mise/config.toml +63 -5
- package/dot_config/mongosh/mongoshrc.js +1 -0
- package/dot_config/mpv/input.conf +47 -0
- package/dot_config/mpv/mpv.conf +47 -0
- package/dot_config/niri/config.kdl.tmpl +327 -0
- package/dot_config/nushell/aliases.nu +18 -0
- package/dot_config/nushell/completions.nu.tmpl +52 -0
- package/dot_config/nushell/config.nu.tmpl +86 -0
- package/dot_config/nushell/env.nu.tmpl +94 -0
- package/dot_config/nushell/functions.nu.tmpl +17 -0
- package/dot_config/nvim/init.lua +14 -0
- package/dot_config/nvim/lazy-lock.json +45 -14
- package/dot_config/nvim/lua/config/autocmds.lua +45 -1
- package/dot_config/nvim/lua/config/keymaps.lua +13 -8
- package/dot_config/nvim/lua/config/lazy.lua +22 -12
- package/dot_config/nvim/lua/config/options.lua +1 -0
- package/dot_config/nvim/lua/plugins/ai.lua +75 -0
- package/dot_config/nvim/lua/plugins/coding.lua +11 -29
- package/dot_config/nvim/lua/plugins/completion.lua +60 -0
- package/dot_config/nvim/lua/plugins/dap.lua +215 -4
- package/dot_config/nvim/lua/plugins/editor.lua +6 -10
- package/dot_config/nvim/lua/plugins/git.lua +1 -0
- package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
- package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
- package/dot_config/nvim/lua/plugins/rust.lua +1 -0
- package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
- package/dot_config/nvim/lua/plugins/ui.lua +23 -51
- package/dot_config/paru/paru.conf +10 -0
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
- package/dot_config/pueue/pueue.yml +34 -0
- package/dot_config/raycast/README.md +1 -1
- package/dot_config/ripgrep/ripgreprc +21 -0
- package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
- package/dot_config/shell/05-core-safety.sh +47 -0
- package/dot_config/shell/10-secrets.sh +40 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
- package/dot_config/shell/40-ls-colors.sh +48 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
- package/dot_config/shell/Brewfile.cli +8 -0
- package/dot_config/shell/README.md +9 -9
- package/dot_config/shell/als_data.txt.tmpl +65 -0
- package/dot_config/shell/custom/auto_ls.zsh +20 -0
- package/dot_config/shell/custom/context_suggest.zsh +50 -50
- package/dot_config/shell/custom/error_analysis.zsh +29 -29
- package/dot_config/starship.toml.tmpl +85 -7
- package/dot_config/swaylock/config +43 -0
- package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
- package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
- package/dot_config/systemd/user/pueued.service +12 -0
- package/dot_config/systemd/user/ssh-agent.service +12 -0
- package/dot_config/tmux/tmux.conf.tmpl +80 -38
- package/dot_config/topgrade.toml.tmpl +54 -0
- package/dot_config/user-dirs.dirs +9 -0
- package/dot_config/vscode/settings.json.tmpl +9 -50
- package/dot_config/waybar/config.jsonc.tmpl +90 -0
- package/dot_config/waybar/style.css.tmpl +211 -0
- package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
- package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
- package/dot_config/yazi/keymap.toml +67 -0
- package/dot_config/yazi/theme.toml +102 -0
- package/dot_config/zathura/zathurarc +52 -0
- package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
- package/dot_config/zsh/dot_zprofile +1 -7
- package/dot_config/zsh/dot_zshenv +2 -3
- package/dot_config/zsh/dot_zshrc.tmpl +368 -69
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
- package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
- package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
- package/dot_local/bin/executable_ai-update +195 -0
- package/dot_local/bin/executable_ai_core +113 -91
- package/dot_local/bin/executable_antigravity +11 -0
- package/dot_local/bin/executable_b64 +61 -36
- package/dot_local/bin/executable_bm +77 -0
- package/dot_local/bin/executable_cb +39 -0
- package/dot_local/bin/executable_dot +543 -132
- package/dot_local/bin/executable_dot-ai +36 -0
- package/dot_local/bin/executable_dot-bootstrap +77 -0
- package/dot_local/bin/executable_dot-launch-or-focus +52 -0
- package/dot_local/bin/executable_dot-load-benchmark +31 -0
- package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
- package/dot_local/bin/executable_dot-theme-sync +952 -0
- package/dot_local/bin/executable_dot_completion +2 -0
- package/dot_local/bin/executable_dtags +28 -0
- package/dot_local/bin/executable_epoch +43 -38
- package/dot_local/bin/executable_extract +32 -99
- package/dot_local/bin/executable_gbd +52 -0
- package/dot_local/bin/executable_gd +42 -0
- package/dot_local/bin/executable_git-ai-commit +35 -20
- package/dot_local/bin/executable_git-ai-diff +33 -18
- package/dot_local/bin/executable_gl +101 -0
- package/dot_local/bin/executable_hash +56 -18
- package/dot_local/bin/executable_hashsum +160 -0
- package/dot_local/bin/executable_hex +44 -8
- package/dot_local/bin/executable_jsonv +34 -10
- package/dot_local/bin/executable_jwt +22 -6
- package/dot_local/bin/executable_kill-port +18 -2
- package/dot_local/bin/executable_lorem +21 -6
- package/dot_local/bin/executable_mkscript +35 -0
- package/dot_local/bin/executable_monitor +56 -0
- package/dot_local/bin/{executable_ip → executable_myip} +16 -2
- package/dot_local/bin/executable_notify +22 -0
- package/dot_local/bin/executable_open +36 -0
- package/dot_local/bin/executable_pw +27 -0
- package/dot_local/bin/executable_rec-start +46 -0
- package/dot_local/bin/executable_rec-stop +35 -0
- package/dot_local/bin/executable_regex +49 -13
- package/dot_local/bin/executable_start-niri +8 -0
- package/dot_local/bin/executable_tmux-sessionizer +276 -149
- package/dot_local/bin/executable_tour +112 -74
- package/dot_local/bin/executable_up +21 -0
- package/dot_local/bin/executable_update +45 -11
- package/dot_local/bin/executable_uuid +37 -7
- package/dot_local/bin/executable_win +32 -0
- package/dot_local/bin/executable_yamlv +25 -7
- package/dot_local/share/bash-completion/completions/dot +62 -44
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +149 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
- package/dot_local/share/zsh/completions/_dot +283 -0
- package/install.sh +297 -210
- package/package.json +17 -5
- package/scripts/ci/check-copyright-headers.sh +96 -0
- package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
- package/scripts/ci/install-chezmoi-verified.sh +64 -0
- package/scripts/ci/validate-ci-config.sh +41 -39
- package/scripts/demo/record.sh +3 -2
- package/scripts/diagnostics/a2a-conformance.sh +162 -0
- package/scripts/diagnostics/alias-governance.sh +137 -0
- package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
- package/scripts/diagnostics/aliases-manifest.sh +31 -0
- package/scripts/diagnostics/benchmark.sh +209 -29
- package/scripts/diagnostics/conflicts.sh +72 -0
- package/scripts/diagnostics/doctor-unified.sh +38 -0
- package/scripts/diagnostics/doctor.sh +491 -65
- package/scripts/diagnostics/drift-dashboard.sh +17 -6
- package/scripts/diagnostics/health.sh +351 -110
- package/scripts/diagnostics/history-analysis.sh +12 -4
- package/scripts/diagnostics/mcp-doctor.sh +575 -0
- package/scripts/diagnostics/perf.sh +225 -0
- package/scripts/diagnostics/scorecard.sh +118 -0
- package/scripts/diagnostics/secret-governance.sh +58 -0
- package/scripts/diagnostics/security-score.sh +139 -93
- package/scripts/diagnostics/smoke-test.sh +87 -0
- package/scripts/diagnostics/snapshot.sh +89 -0
- package/scripts/diagnostics/verify.sh +107 -0
- package/scripts/diagnostics/verify_state.sh +2 -2
- package/scripts/diagnostics/version-locks.sh +79 -0
- package/scripts/diagnostics/workstation-attestation.sh +181 -0
- package/scripts/docs/build-manual.sh +883 -0
- package/scripts/docs/check-manual.sh +213 -0
- package/scripts/dot/commands/agent.sh +465 -0
- package/scripts/dot/commands/ai.sh +416 -0
- package/scripts/dot/commands/aliases.sh +250 -0
- package/scripts/dot/commands/appearance.sh +21 -4
- package/scripts/dot/commands/core.sh +59 -4
- package/scripts/dot/commands/diagnostics.sh +132 -3
- package/scripts/dot/commands/fleet.sh +399 -0
- package/scripts/dot/commands/lint.sh +177 -0
- package/scripts/dot/commands/manual.sh +168 -0
- package/scripts/dot/commands/meta.sh +148 -17
- package/scripts/dot/commands/patterns.sh +54 -0
- package/scripts/dot/commands/restore.sh +57 -35
- package/scripts/dot/commands/secrets.sh +151 -9
- package/scripts/dot/commands/security.sh +3 -0
- package/scripts/dot/commands/tools.sh +268 -27
- package/scripts/dot/data/alias-deprecations.tsv +2 -0
- package/scripts/dot/lib/bento.sh +49 -0
- package/scripts/dot/lib/log.sh +194 -0
- package/scripts/dot/lib/platform.sh +98 -0
- package/scripts/dot/lib/ui.sh +507 -0
- package/scripts/dot/lib/utils.sh +318 -18
- package/scripts/fonts/install-nerd-fonts.sh +19 -10
- package/scripts/fonts/patch-fonts.sh +1 -0
- package/scripts/git-hooks/install.sh +11 -0
- package/scripts/git-hooks/pre-commit +12 -0
- package/scripts/git-hooks/pre-commit-audit.sh +145 -0
- package/scripts/git-hooks/pre-push +29 -0
- package/scripts/git-hooks/prepare-commit-msg +29 -0
- package/scripts/lib/secrets_provider.sh +158 -0
- package/scripts/maintenance/check-updates.sh +131 -0
- package/scripts/ops/ai-setup.sh +55 -0
- package/scripts/ops/bundle.sh +77 -0
- package/scripts/ops/chaos.sh +49 -0
- package/scripts/ops/chezmoi-apply.sh +245 -17
- package/scripts/ops/chezmoi-diff.sh +1 -0
- package/scripts/ops/chezmoi-remove.sh +2 -0
- package/scripts/ops/chezmoi-update.sh +34 -2
- package/scripts/ops/heal-chezmoi.sh +51 -0
- package/scripts/ops/heal-system.sh +128 -0
- package/scripts/ops/heal-tools.sh +340 -0
- package/scripts/ops/heal.sh +98 -342
- package/scripts/ops/post-apply-repair.sh +106 -0
- package/scripts/ops/prewarm.sh +127 -0
- package/scripts/ops/release.sh +252 -0
- package/scripts/ops/rollback.sh +86 -28
- package/scripts/ops/setup.sh +137 -0
- package/scripts/ops/teleport.sh +2 -1
- package/scripts/qa/coverage-baseline.sh +60 -0
- package/scripts/qa/docs-coverage.sh +111 -0
- package/scripts/qa/reliability-audit.sh +138 -0
- package/scripts/qa/traceability-coverage.sh +116 -0
- package/scripts/qa/validate-examples.sh +26 -0
- package/scripts/qa/wsl-contract.sh +11 -0
- package/scripts/release/package-policy-bundles.sh +125 -0
- package/scripts/secrets/age-init.sh +1 -0
- package/scripts/secrets/create-secrets-file.sh +1 -0
- package/scripts/secrets/encrypt-ssh-key.sh +1 -0
- package/scripts/security/backup.sh +44 -4
- package/scripts/security/dns-doh.sh +36 -14
- package/scripts/security/encryption-check.sh +27 -12
- package/scripts/security/enforce-policies.sh +11 -16
- package/scripts/security/firewall.sh +76 -20
- package/scripts/security/lock-configs.sh +2 -2
- package/scripts/security/lock-screen.sh +40 -18
- package/scripts/security/manage-secrets.sh +42 -29
- package/scripts/security/ssh-cert.sh +203 -0
- package/scripts/security/telemetry-kill.sh +40 -18
- package/scripts/security/usb-safety.sh +37 -15
- package/scripts/theme/apply-gnome-theme.sh +87 -56
- package/scripts/theme/extract-theme.py +677 -0
- package/scripts/theme/install-boot-logo.sh +1 -0
- package/scripts/theme/install-catppuccin-themes.sh +57 -33
- package/scripts/theme/install-cursors.sh +1 -0
- package/scripts/theme/install-file-icons.sh +1 -0
- package/scripts/theme/install-grub-theme.sh +11 -1
- package/scripts/theme/install-lock-icon.sh +1 -0
- package/scripts/theme/merge-wallpaper.sh +141 -0
- package/scripts/theme/rebuild-themes.sh +309 -0
- package/scripts/theme/switch.sh +308 -137
- package/scripts/theme/wallpaper-rotate.sh +66 -12
- package/scripts/theme/wallpaper-sync.sh +386 -31
- package/scripts/tools/cmatrix.sh +1 -0
- package/scripts/tools/detect-collisions.py +1 -1
- package/scripts/tools/emoji-picker.sh +4 -1
- package/scripts/tools/figlet-banner.sh +1 -0
- package/scripts/tools/log-rotate.sh +2 -1
- package/scripts/tools/lolcat-wrap.sh +1 -0
- package/scripts/tools/pipes.sh +1 -0
- package/scripts/tuning/linux.sh +23 -13
- package/scripts/tuning/macos.sh +13 -4
- package/scripts/uninstall.sh +85 -0
- package/scripts/version-sync.sh +487 -0
- package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
- package/templates/chezmoi-data/mac-m1.toml.example +16 -0
- package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
- package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
- package/templates/projects/go/.github/workflows/ci.yml +31 -0
- package/templates/projects/go/README.md +1 -1
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +1 -1
- package/templates/projects/node/.github/workflows/ci.yml +30 -0
- package/templates/projects/node/README.md +1 -1
- package/templates/projects/node/package-lock.json +12 -0
- package/templates/projects/node/src/index.js +1 -0
- package/templates/projects/packer/README.md +1 -1
- package/templates/projects/python/.github/workflows/ci.yml +34 -0
- package/templates/projects/python/README.md +1 -1
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
- package/templates/projects/python/tests/test_basic.py +1 -0
- package/docs/ARCHITECTURE.md +0 -229
- package/docs/COMPLIANCE.md +0 -47
- package/docs/FEATURES.md +0 -166
- package/docs/FONTS.md +0 -147
- package/docs/INSTALL.md +0 -119
- package/docs/KEYS.md +0 -40
- package/docs/OPERATIONS.md +0 -130
- package/docs/PR_DESCRIPTION.md +0 -149
- package/docs/SECRETS.md +0 -76
- package/docs/SECURITY.md +0 -30
- package/docs/SECURITY_CHECKLIST.md +0 -25
- package/docs/TASK.md +0 -99
- package/docs/TESTING.md +0 -190
- package/docs/TOOLS.md +0 -146
- package/docs/UTILS.md +0 -105
- package/docs/WALKTHROUGH.md +0 -165
- package/dot_config/clippy.toml +0 -55
- package/dot_config/dotfiles/versions.env.tmpl +0 -19
- package/dot_config/firefox/user.js +0 -8
- package/dot_config/git/config.tmpl +0 -77
- package/dot_config/go/aliases.sh +0 -61
- package/dot_config/go/env.sh +0 -24
- package/dot_config/ice/README.md +0 -13
- package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
- package/dot_config/lsd/config.yaml +0 -19
- package/dot_config/nvim/snippets/all.lua +0 -9
- package/dot_config/nvim/snippets/python.lua +0 -16
- package/dot_config/shell/00-container-detect.sh +0 -53
- package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
- package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
- package/dot_config/shell/90-theme-switch.sh +0 -70
- package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
- package/dot_config/waybar/style.css +0 -8
- package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
- package/dot_local/bin/executable_zig-install +0 -89
- package/dot_local/bin/voice_ops +0 -7
- package/scripts/ops/health-check.sh +0 -380
- package/scripts/tests/README.md +0 -241
- package/scripts/tests/benchmark.sh +0 -91
- package/scripts/tests/framework/assertions.sh +0 -283
- package/scripts/tests/framework/mocks.sh +0 -201
- package/scripts/tests/framework/test_runner.sh +0 -189
- package/scripts/tests/integration/test_install.sh +0 -237
- package/scripts/tests/performance/benchmark_runner.sh +0 -156
- package/scripts/tests/performance/regression_check.sh +0 -73
- package/scripts/tests/performance/stress_test.sh +0 -65
- package/scripts/tests/test-aliases.sh +0 -25
- package/scripts/tests/test-docker.sh +0 -48
- package/scripts/tests/unit/test_ai_aliases.sh +0 -158
- package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
- package/scripts/tests/unit/test_backup.sh +0 -227
- package/scripts/tests/unit/test_case_functions.sh +0 -238
- package/scripts/tests/unit/test_cd_aliases.sh +0 -367
- package/scripts/tests/unit/test_dot_cli.sh +0 -217
- package/scripts/tests/unit/test_encode64.sh +0 -67
- package/scripts/tests/unit/test_environment.sh +0 -78
- package/scripts/tests/unit/test_extract.sh +0 -163
- package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
- package/scripts/tests/unit/test_genpass.sh +0 -298
- package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
- package/scripts/tests/unit/test_installers.sh +0 -172
- package/scripts/tests/unit/test_keygen.sh +0 -68
- package/scripts/tests/unit/test_logging.sh +0 -96
- package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
- package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
- package/scripts/tests/unit/test_prependpath.sh +0 -66
- package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
- package/scripts/tests/unit/test_rd.sh +0 -230
- package/scripts/tests/unit/test_security_fixes.sh +0 -130
- package/scripts/tests/unit/test_security_scripts.sh +0 -87
- package/scripts/tests/unit/test_template_validation.sh +0 -238
- package/scripts/tests/unit/test_utility_functions.sh +0 -144
- package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
- package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
- package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
- package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
- package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
- package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
- package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
- package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
- package/scripts/tests/unit/test_zipf.sh +0 -76
- /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
- /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
- /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
- /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
- /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
- /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
- /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
- /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
- /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
- /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
- /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
- /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC1090,SC1091,SC2016
|
|
3
|
-
# Unit tests for .chezmoitemplates/functions/environment.sh
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
|
|
7
|
-
source "$SCRIPT_DIR/../framework/assertions.sh"
|
|
8
|
-
|
|
9
|
-
FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/environment.sh"
|
|
10
|
-
|
|
11
|
-
echo "Testing environment function..."
|
|
12
|
-
|
|
13
|
-
# Test: environment.sh exists
|
|
14
|
-
test_start "environment_file_exists"
|
|
15
|
-
assert_file_exists "$FUNC_FILE" "environment.sh should exist"
|
|
16
|
-
|
|
17
|
-
# Test: environment.sh has valid syntax
|
|
18
|
-
test_start "environment_syntax"
|
|
19
|
-
assert_exit_code 0 "bash -n '$FUNC_FILE'"
|
|
20
|
-
|
|
21
|
-
# Source the function
|
|
22
|
-
if [[ -f "$FUNC_FILE" ]]; then
|
|
23
|
-
source "$FUNC_FILE"
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
# Test: environment returns non-empty result
|
|
27
|
-
test_start "environment_returns_value"
|
|
28
|
-
result=$(environment 2>/dev/null)
|
|
29
|
-
assert_not_empty "$result" "environment should return a value"
|
|
30
|
-
|
|
31
|
-
# Test: environment returns one of the expected values
|
|
32
|
-
test_start "environment_valid_output"
|
|
33
|
-
result=$(environment 2>/dev/null)
|
|
34
|
-
if [[ "$result" == "mac" || "$result" == "linux" || "$result" == "win" || "$result" == "other" ]]; then
|
|
35
|
-
((TESTS_PASSED++)) || true
|
|
36
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: returns valid OS ($result)"
|
|
37
|
-
else
|
|
38
|
-
((TESTS_FAILED++)) || true
|
|
39
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should return mac/linux/win/other"
|
|
40
|
-
echo -e " Actual: $result"
|
|
41
|
-
fi
|
|
42
|
-
|
|
43
|
-
# Test: environment --help shows help
|
|
44
|
-
test_start "environment_help"
|
|
45
|
-
output=$(environment --help 2>&1)
|
|
46
|
-
if [[ "$output" == *"Environment Detector"* ]]; then
|
|
47
|
-
((TESTS_PASSED++)) || true
|
|
48
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows help text"
|
|
49
|
-
else
|
|
50
|
-
((TESTS_FAILED++)) || true
|
|
51
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show help text"
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Test: environment uses case statement (no repeated uname calls)
|
|
55
|
-
test_start "environment_single_uname"
|
|
56
|
-
assert_file_contains "$FUNC_FILE" 'case "$os_name"' "should use case statement for single uname call"
|
|
57
|
-
|
|
58
|
-
# Test: on macOS, environment returns "mac"
|
|
59
|
-
test_start "environment_macos_detection"
|
|
60
|
-
if [[ "$(uname -s)" == "Darwin" ]]; then
|
|
61
|
-
result=$(environment 2>/dev/null)
|
|
62
|
-
assert_equals "mac" "$result" "should return 'mac' on macOS"
|
|
63
|
-
else
|
|
64
|
-
((TESTS_PASSED++)) || true
|
|
65
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: skipped (not macOS)"
|
|
66
|
-
fi
|
|
67
|
-
|
|
68
|
-
# Test: on Linux, environment returns "linux"
|
|
69
|
-
test_start "environment_linux_detection"
|
|
70
|
-
if [[ "$(uname -s)" == "Linux" ]]; then
|
|
71
|
-
result=$(environment 2>/dev/null)
|
|
72
|
-
assert_equals "linux" "$result" "should return 'linux' on Linux"
|
|
73
|
-
else
|
|
74
|
-
((TESTS_PASSED++)) || true
|
|
75
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: skipped (not Linux)"
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
|
-
print_summary
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC1090,SC1091
|
|
3
|
-
# Unit tests for the extract function
|
|
4
|
-
# Tests archive extraction with various formats and edge cases
|
|
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
|
-
# Source the function being tested
|
|
12
|
-
FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/extract.sh"
|
|
13
|
-
if [[ -f "$FUNC_FILE" ]]; then
|
|
14
|
-
source "$FUNC_FILE"
|
|
15
|
-
else
|
|
16
|
-
echo "Warning: extract.sh not found at $FUNC_FILE"
|
|
17
|
-
fi
|
|
18
|
-
|
|
19
|
-
# Test: extract with --help flag shows help
|
|
20
|
-
test_start "extract_help"
|
|
21
|
-
output=$(
|
|
22
|
-
set +u
|
|
23
|
-
extract --help 2>&1
|
|
24
|
-
)
|
|
25
|
-
if [[ "$output" == *"Usage:"* && "$output" == *"extract"* ]]; then
|
|
26
|
-
((TESTS_PASSED++))
|
|
27
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage information"
|
|
28
|
-
else
|
|
29
|
-
((TESTS_FAILED++))
|
|
30
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage information"
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
# Test: extract with --help returns exit code 0
|
|
34
|
-
test_start "extract_help_exit_code"
|
|
35
|
-
(
|
|
36
|
-
set +u
|
|
37
|
-
extract --help >/dev/null 2>&1
|
|
38
|
-
)
|
|
39
|
-
assert_equals "0" "$?" "exit code should be 0 for --help"
|
|
40
|
-
|
|
41
|
-
# Test: extract with no arguments shows error
|
|
42
|
-
test_start "extract_no_args"
|
|
43
|
-
(
|
|
44
|
-
set +u
|
|
45
|
-
extract 2>&1
|
|
46
|
-
)
|
|
47
|
-
exit_code=$?
|
|
48
|
-
assert_equals "1" "$exit_code" "exit code should be 1 for no args"
|
|
49
|
-
|
|
50
|
-
# Test: extract with no arguments shows error message
|
|
51
|
-
test_start "extract_no_args_message"
|
|
52
|
-
output=$(
|
|
53
|
-
set +u
|
|
54
|
-
extract 2>&1
|
|
55
|
-
)
|
|
56
|
-
if [[ "$output" == *"ERROR"* || "$output" == *"argument"* ]]; then
|
|
57
|
-
((TESTS_PASSED++))
|
|
58
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error message for no arguments"
|
|
59
|
-
else
|
|
60
|
-
((TESTS_FAILED++))
|
|
61
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error message for no arguments"
|
|
62
|
-
echo -e " Output: $output"
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
# Test: extract with nonexistent file shows error
|
|
66
|
-
test_start "extract_nonexistent_file"
|
|
67
|
-
output=$(extract "/nonexistent/file.tar.gz" 2>&1)
|
|
68
|
-
exit_code=$?
|
|
69
|
-
assert_equals "1" "$exit_code" "exit code should be 1 for nonexistent file"
|
|
70
|
-
|
|
71
|
-
# Test: extract with nonexistent file shows appropriate error
|
|
72
|
-
test_start "extract_nonexistent_file_message"
|
|
73
|
-
output=$(extract "/nonexistent/file.tar.gz" 2>&1)
|
|
74
|
-
if [[ "$output" == *"ERROR"* || "$output" == *"not a valid file"* ]]; then
|
|
75
|
-
((TESTS_PASSED++))
|
|
76
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows error for nonexistent file"
|
|
77
|
-
else
|
|
78
|
-
((TESTS_FAILED++))
|
|
79
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should show error for nonexistent file"
|
|
80
|
-
echo -e " Output: $output"
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
# Test: extract with too many arguments shows error
|
|
84
|
-
test_start "extract_too_many_args"
|
|
85
|
-
output=$(extract "file1.tar" "file2.tar" 2>&1)
|
|
86
|
-
exit_code=$?
|
|
87
|
-
assert_equals "1" "$exit_code" "exit code should be 1 for too many arguments"
|
|
88
|
-
|
|
89
|
-
# Test: extract with actual tar.gz file (if tar is available)
|
|
90
|
-
test_start "extract_tar_gz"
|
|
91
|
-
if command -v tar >/dev/null 2>&1; then
|
|
92
|
-
# Create a test directory and archive
|
|
93
|
-
test_dir=$(mock_dir "extract_test")
|
|
94
|
-
mkdir -p "$test_dir/content"
|
|
95
|
-
echo "test content" >"$test_dir/content/testfile.txt"
|
|
96
|
-
|
|
97
|
-
# Create archive
|
|
98
|
-
archive_file="$test_dir/test.tar.gz"
|
|
99
|
-
(cd "$test_dir" && tar czf test.tar.gz content)
|
|
100
|
-
|
|
101
|
-
# Remove original content
|
|
102
|
-
rm -rf "$test_dir/content"
|
|
103
|
-
|
|
104
|
-
# Extract
|
|
105
|
-
extract_output_dir="$test_dir/extract_output"
|
|
106
|
-
mkdir -p "$extract_output_dir"
|
|
107
|
-
(cd "$extract_output_dir" && extract "$archive_file" >/dev/null 2>&1)
|
|
108
|
-
|
|
109
|
-
# Check if extraction created the content
|
|
110
|
-
if [[ -f "$extract_output_dir/content/testfile.txt" ]]; then
|
|
111
|
-
((TESTS_PASSED++))
|
|
112
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: tar.gz extraction works"
|
|
113
|
-
else
|
|
114
|
-
((TESTS_FAILED++))
|
|
115
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: tar.gz extraction did not produce expected file"
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
rm -rf "$test_dir"
|
|
119
|
-
else
|
|
120
|
-
((TESTS_PASSED++))
|
|
121
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (tar not available)"
|
|
122
|
-
fi
|
|
123
|
-
|
|
124
|
-
# Test: extract recognizes unsupported extension
|
|
125
|
-
test_start "extract_unsupported_extension"
|
|
126
|
-
# Create a file with unsupported extension
|
|
127
|
-
test_file=$(mock_file "test content")
|
|
128
|
-
mv "$test_file" "${test_file}.unsupported"
|
|
129
|
-
output=$(extract "${test_file}.unsupported" 2>&1)
|
|
130
|
-
if [[ "$output" == *"cannot be extracted"* ]] || [[ "$output" == *"ERROR"* ]]; then
|
|
131
|
-
((TESTS_PASSED++))
|
|
132
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: unsupported extension handled"
|
|
133
|
-
else
|
|
134
|
-
((TESTS_FAILED++))
|
|
135
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should report unsupported extension"
|
|
136
|
-
echo -e " Output: $output"
|
|
137
|
-
fi
|
|
138
|
-
rm -f "${test_file}.unsupported"
|
|
139
|
-
|
|
140
|
-
# Test: extract with directory instead of file
|
|
141
|
-
test_start "extract_directory"
|
|
142
|
-
test_dir=$(mock_dir "extract_dir_test")
|
|
143
|
-
output=$(extract "$test_dir" 2>&1)
|
|
144
|
-
exit_code=$?
|
|
145
|
-
# Should fail because directories are not files
|
|
146
|
-
if [[ "$exit_code" -ne 0 ]] || [[ "$output" == *"ERROR"* ]] || [[ "$output" == *"not a valid file"* ]]; then
|
|
147
|
-
((TESTS_PASSED++))
|
|
148
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: directory correctly rejected"
|
|
149
|
-
else
|
|
150
|
-
((TESTS_FAILED++))
|
|
151
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should reject directories"
|
|
152
|
-
fi
|
|
153
|
-
rm -rf "$test_dir"
|
|
154
|
-
|
|
155
|
-
# Test: extract with empty filename
|
|
156
|
-
test_start "extract_empty_filename"
|
|
157
|
-
output=$(extract "" 2>&1)
|
|
158
|
-
exit_code=$?
|
|
159
|
-
assert_equals "1" "$exit_code" "exit code should be 1 for empty filename"
|
|
160
|
-
|
|
161
|
-
echo ""
|
|
162
|
-
echo "Extract function tests completed."
|
|
163
|
-
echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC1090,SC1091,SC2034
|
|
3
|
-
# Unit tests for the test framework itself (assertions.sh edge cases)
|
|
4
|
-
# Ensures assertion functions handle empty strings, special chars, etc.
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}"
|
|
9
|
-
source "$SCRIPT_DIR/../framework/assertions.sh"
|
|
10
|
-
source "$SCRIPT_DIR/../framework/mocks.sh"
|
|
11
|
-
|
|
12
|
-
echo "Testing assertion framework edge cases..."
|
|
13
|
-
|
|
14
|
-
# ============ assert_equals edge cases ============
|
|
15
|
-
|
|
16
|
-
test_start "assert_equals_empty_strings"
|
|
17
|
-
# Both empty strings should be equal
|
|
18
|
-
assert_equals "" "" "empty strings should be equal"
|
|
19
|
-
|
|
20
|
-
test_start "assert_equals_special_chars"
|
|
21
|
-
assert_equals "hello\nworld" "hello\nworld" "strings with backslash-n should match"
|
|
22
|
-
|
|
23
|
-
test_start "assert_equals_spaces"
|
|
24
|
-
assert_equals "hello world" "hello world" "strings with spaces should match"
|
|
25
|
-
|
|
26
|
-
test_start "assert_equals_tabs"
|
|
27
|
-
assert_equals "hello world" "hello world" "strings with tabs should match"
|
|
28
|
-
|
|
29
|
-
# ============ assert_not_equals edge cases ============
|
|
30
|
-
|
|
31
|
-
test_start "assert_not_equals_different"
|
|
32
|
-
assert_not_equals "hello" "world" "different strings should not be equal"
|
|
33
|
-
|
|
34
|
-
test_start "assert_not_equals_empty_vs_nonempty"
|
|
35
|
-
assert_not_equals "" "hello" "empty and non-empty should differ"
|
|
36
|
-
|
|
37
|
-
# ============ assert_empty / assert_not_empty edge cases ============
|
|
38
|
-
|
|
39
|
-
test_start "assert_empty_with_empty"
|
|
40
|
-
assert_empty "" "empty string should be empty"
|
|
41
|
-
|
|
42
|
-
test_start "assert_not_empty_with_value"
|
|
43
|
-
assert_not_empty "hello" "non-empty string should not be empty"
|
|
44
|
-
|
|
45
|
-
test_start "assert_not_empty_with_space"
|
|
46
|
-
assert_not_empty " " "space should not be empty"
|
|
47
|
-
|
|
48
|
-
# ============ assert_file_exists / assert_file_not_exists ============
|
|
49
|
-
|
|
50
|
-
test_start "assert_file_exists_real_file"
|
|
51
|
-
test_file=$(mock_file "test content")
|
|
52
|
-
assert_file_exists "$test_file" "mock file should exist"
|
|
53
|
-
|
|
54
|
-
test_start "assert_file_not_exists_missing"
|
|
55
|
-
assert_file_not_exists "/nonexistent/file_99999.txt" "nonexistent file should not exist"
|
|
56
|
-
|
|
57
|
-
# ============ assert_dir_exists / assert_dir_not_exists ============
|
|
58
|
-
|
|
59
|
-
test_start "assert_dir_exists_real_dir"
|
|
60
|
-
test_dir=$(mock_dir "framework_test")
|
|
61
|
-
assert_dir_exists "$test_dir" "mock directory should exist"
|
|
62
|
-
rm -rf "$test_dir"
|
|
63
|
-
|
|
64
|
-
test_start "assert_dir_not_exists_missing"
|
|
65
|
-
assert_dir_not_exists "/nonexistent/dir_99999" "nonexistent directory should not exist"
|
|
66
|
-
|
|
67
|
-
# ============ assert_file_contains edge cases ============
|
|
68
|
-
|
|
69
|
-
test_start "assert_file_contains_literal_dots"
|
|
70
|
-
test_file=$(mock_file "version=1.2.3")
|
|
71
|
-
assert_file_contains "$test_file" "1.2.3" "should find literal dots (not regex)"
|
|
72
|
-
|
|
73
|
-
test_start "assert_file_contains_special_chars"
|
|
74
|
-
test_file=$(mock_file 'hello [world] (test)')
|
|
75
|
-
assert_file_contains "$test_file" "[world]" "should find literal brackets"
|
|
76
|
-
|
|
77
|
-
# ============ assert_exit_code edge cases ============
|
|
78
|
-
|
|
79
|
-
test_start "assert_exit_code_success"
|
|
80
|
-
assert_exit_code 0 "true"
|
|
81
|
-
|
|
82
|
-
test_start "assert_exit_code_failure"
|
|
83
|
-
assert_exit_code 1 "false"
|
|
84
|
-
|
|
85
|
-
# ============ assert_output_contains edge cases ============
|
|
86
|
-
|
|
87
|
-
test_start "assert_output_contains_simple"
|
|
88
|
-
assert_output_contains "hello" "echo hello world"
|
|
89
|
-
|
|
90
|
-
test_start "assert_output_contains_stderr"
|
|
91
|
-
assert_output_contains "error" "echo error >&2"
|
|
92
|
-
|
|
93
|
-
# ============ assert_output_not_contains ============
|
|
94
|
-
|
|
95
|
-
test_start "assert_output_not_contains_simple"
|
|
96
|
-
assert_output_not_contains "xyz" "echo hello world"
|
|
97
|
-
|
|
98
|
-
# ============ assert_output_matches ============
|
|
99
|
-
|
|
100
|
-
test_start "assert_output_matches_regex"
|
|
101
|
-
assert_output_matches "[0-9]+" "echo 'test123'"
|
|
102
|
-
|
|
103
|
-
# ============ print_summary validation ============
|
|
104
|
-
|
|
105
|
-
test_start "test_counters_consistent"
|
|
106
|
-
# test_start already incremented TESTS_RUN for this test, so account for it
|
|
107
|
-
# TESTS_RUN should equal TESTS_PASSED + TESTS_FAILED + 1 (current unresolved)
|
|
108
|
-
expected_total=$((TESTS_PASSED + TESTS_FAILED + 1))
|
|
109
|
-
assert_equals "$TESTS_RUN" "$expected_total" "TESTS_RUN should equal PASSED + FAILED + 1 (current)"
|
|
110
|
-
|
|
111
|
-
echo ""
|
|
112
|
-
echo "Framework edge case tests completed."
|
|
113
|
-
print_summary
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# shellcheck disable=SC1090,SC1091,SC2034
|
|
3
|
-
# Unit tests for the genpass function
|
|
4
|
-
# Tests password generation with various options
|
|
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
|
-
# Source the function being tested
|
|
12
|
-
FUNC_FILE="$REPO_ROOT/.chezmoitemplates/functions/genpass.sh"
|
|
13
|
-
if [[ -f "$FUNC_FILE" ]]; then
|
|
14
|
-
source "$FUNC_FILE"
|
|
15
|
-
else
|
|
16
|
-
echo "Warning: genpass.sh not found at $FUNC_FILE"
|
|
17
|
-
fi
|
|
18
|
-
|
|
19
|
-
# Check if openssl is available
|
|
20
|
-
if ! command -v openssl >/dev/null 2>&1; then
|
|
21
|
-
echo "Warning: openssl not available, some tests may fail"
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
# Mock clipboard tools to prevent blocking in non-interactive environments
|
|
25
|
-
mock_init
|
|
26
|
-
mock_command "xclip" ""
|
|
27
|
-
mock_command "wl-copy" ""
|
|
28
|
-
mock_command "pbcopy" ""
|
|
29
|
-
mock_command "clip" ""
|
|
30
|
-
|
|
31
|
-
# Test: genpass with --help flag shows help
|
|
32
|
-
test_start "genpass_help"
|
|
33
|
-
output=$(
|
|
34
|
-
set +u
|
|
35
|
-
genpass --help 2>&1
|
|
36
|
-
)
|
|
37
|
-
if [[ "$output" == *"Usage:"* || "$output" == *"genpass"* ]]; then
|
|
38
|
-
((TESTS_PASSED++))
|
|
39
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: --help shows usage information"
|
|
40
|
-
else
|
|
41
|
-
((TESTS_FAILED++))
|
|
42
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: --help should show usage information"
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# Test: genpass with --help returns exit code 0
|
|
46
|
-
test_start "genpass_help_exit_code"
|
|
47
|
-
(
|
|
48
|
-
set +u
|
|
49
|
-
genpass --help >/dev/null 2>&1
|
|
50
|
-
)
|
|
51
|
-
assert_equals "0" "$?" "exit code should be 0 for --help"
|
|
52
|
-
|
|
53
|
-
# Test: genpass default (no arguments) generates password
|
|
54
|
-
test_start "genpass_default"
|
|
55
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
56
|
-
output=$(
|
|
57
|
-
set +u
|
|
58
|
-
genpass 2>&1
|
|
59
|
-
)
|
|
60
|
-
if [[ "$output" == *"Generated password:"* ]]; then
|
|
61
|
-
((TESTS_PASSED++))
|
|
62
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates password with default settings"
|
|
63
|
-
else
|
|
64
|
-
((TESTS_FAILED++))
|
|
65
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should generate password"
|
|
66
|
-
echo -e " Output: $output"
|
|
67
|
-
fi
|
|
68
|
-
else
|
|
69
|
-
((TESTS_PASSED++))
|
|
70
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
71
|
-
fi
|
|
72
|
-
|
|
73
|
-
# Test: genpass default generates 3 blocks
|
|
74
|
-
test_start "genpass_default_blocks"
|
|
75
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
76
|
-
output=$(
|
|
77
|
-
set +u
|
|
78
|
-
genpass 2>&1
|
|
79
|
-
)
|
|
80
|
-
# Extract password from output
|
|
81
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
82
|
-
# Count dashes (separators) - default should have 2 dashes for 3 blocks
|
|
83
|
-
dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
|
|
84
|
-
|
|
85
|
-
if [[ "$dash_count" -eq 2 ]]; then
|
|
86
|
-
((TESTS_PASSED++))
|
|
87
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: default generates 3 blocks"
|
|
88
|
-
else
|
|
89
|
-
((TESTS_PASSED++)) # Acceptable variation
|
|
90
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated (block count may vary)"
|
|
91
|
-
fi
|
|
92
|
-
else
|
|
93
|
-
((TESTS_PASSED++))
|
|
94
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
# Test: genpass with custom block count
|
|
98
|
-
test_start "genpass_custom_blocks"
|
|
99
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
100
|
-
output=$(
|
|
101
|
-
set +u
|
|
102
|
-
genpass 5 2>&1
|
|
103
|
-
)
|
|
104
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
105
|
-
# 5 blocks should have 4 separators
|
|
106
|
-
dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
|
|
107
|
-
|
|
108
|
-
if [[ "$dash_count" -eq 4 ]]; then
|
|
109
|
-
((TESTS_PASSED++))
|
|
110
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates 5 blocks correctly"
|
|
111
|
-
else
|
|
112
|
-
((TESTS_PASSED++)) # Function worked
|
|
113
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated with custom blocks"
|
|
114
|
-
fi
|
|
115
|
-
else
|
|
116
|
-
((TESTS_PASSED++))
|
|
117
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
|
-
# Test: genpass with single block
|
|
121
|
-
test_start "genpass_single_block"
|
|
122
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
123
|
-
output=$(
|
|
124
|
-
set +u
|
|
125
|
-
genpass 1 2>&1
|
|
126
|
-
)
|
|
127
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
128
|
-
# Single block should have no separators
|
|
129
|
-
dash_count=$(echo "$password" | tr -cd '-' | wc -c | tr -d ' ')
|
|
130
|
-
|
|
131
|
-
if [[ "$dash_count" -eq 0 ]]; then
|
|
132
|
-
((TESTS_PASSED++))
|
|
133
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: single block has no separator"
|
|
134
|
-
else
|
|
135
|
-
((TESTS_PASSED++)) # Function worked
|
|
136
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated"
|
|
137
|
-
fi
|
|
138
|
-
else
|
|
139
|
-
((TESTS_PASSED++))
|
|
140
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
141
|
-
fi
|
|
142
|
-
|
|
143
|
-
# Test: genpass with custom separator
|
|
144
|
-
test_start "genpass_custom_separator"
|
|
145
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
146
|
-
output=$(
|
|
147
|
-
set +u
|
|
148
|
-
genpass 3 "/" 2>&1
|
|
149
|
-
)
|
|
150
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
151
|
-
|
|
152
|
-
if [[ "$password" == *"/"* ]]; then
|
|
153
|
-
((TESTS_PASSED++))
|
|
154
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses custom separator '/'"
|
|
155
|
-
else
|
|
156
|
-
((TESTS_FAILED++))
|
|
157
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should use custom separator"
|
|
158
|
-
echo -e " Password: $password"
|
|
159
|
-
fi
|
|
160
|
-
else
|
|
161
|
-
((TESTS_PASSED++))
|
|
162
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
163
|
-
fi
|
|
164
|
-
|
|
165
|
-
# Test: genpass with colon separator
|
|
166
|
-
test_start "genpass_colon_separator"
|
|
167
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
168
|
-
output=$(
|
|
169
|
-
set +u
|
|
170
|
-
genpass 2 ":" 2>&1
|
|
171
|
-
)
|
|
172
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
173
|
-
|
|
174
|
-
if [[ "$password" == *":"* ]]; then
|
|
175
|
-
((TESTS_PASSED++))
|
|
176
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: uses colon separator"
|
|
177
|
-
else
|
|
178
|
-
((TESTS_FAILED++))
|
|
179
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should use colon separator"
|
|
180
|
-
echo -e " Password: $password"
|
|
181
|
-
fi
|
|
182
|
-
else
|
|
183
|
-
((TESTS_PASSED++))
|
|
184
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
185
|
-
fi
|
|
186
|
-
|
|
187
|
-
# Test: genpass returns exit code 0
|
|
188
|
-
test_start "genpass_exit_code"
|
|
189
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
190
|
-
(
|
|
191
|
-
set +u
|
|
192
|
-
genpass >/dev/null 2>&1
|
|
193
|
-
)
|
|
194
|
-
assert_equals "0" "$?" "exit code should be 0"
|
|
195
|
-
else
|
|
196
|
-
((TESTS_PASSED++))
|
|
197
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
198
|
-
fi
|
|
199
|
-
|
|
200
|
-
# Test: genpass shows INFO message
|
|
201
|
-
test_start "genpass_info_message"
|
|
202
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
203
|
-
output=$(
|
|
204
|
-
set +u
|
|
205
|
-
genpass 2>&1
|
|
206
|
-
)
|
|
207
|
-
if [[ "$output" == *"INFO"* ]]; then
|
|
208
|
-
((TESTS_PASSED++))
|
|
209
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: shows INFO message"
|
|
210
|
-
else
|
|
211
|
-
((TESTS_FAILED++))
|
|
212
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: should show INFO message"
|
|
213
|
-
fi
|
|
214
|
-
else
|
|
215
|
-
((TESTS_PASSED++))
|
|
216
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
217
|
-
fi
|
|
218
|
-
|
|
219
|
-
# Test: genpass passwords are unique
|
|
220
|
-
test_start "genpass_unique_passwords"
|
|
221
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
222
|
-
pass1=$( (
|
|
223
|
-
set +u
|
|
224
|
-
genpass 2>&1
|
|
225
|
-
) | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
226
|
-
pass2=$( (
|
|
227
|
-
set +u
|
|
228
|
-
genpass 2>&1
|
|
229
|
-
) | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
230
|
-
|
|
231
|
-
if [[ "$pass1" != "$pass2" ]]; then
|
|
232
|
-
((TESTS_PASSED++))
|
|
233
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: generates unique passwords"
|
|
234
|
-
else
|
|
235
|
-
((TESTS_FAILED++))
|
|
236
|
-
echo -e " ${RED}✗${NC} $CURRENT_TEST: passwords should be unique"
|
|
237
|
-
fi
|
|
238
|
-
else
|
|
239
|
-
((TESTS_PASSED++))
|
|
240
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
241
|
-
fi
|
|
242
|
-
|
|
243
|
-
# Test: genpass password length with blocks
|
|
244
|
-
test_start "genpass_password_length"
|
|
245
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
246
|
-
output=$(
|
|
247
|
-
set +u
|
|
248
|
-
genpass 3 2>&1
|
|
249
|
-
)
|
|
250
|
-
password=$(echo "$output" | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
251
|
-
# Remove separators to count actual characters
|
|
252
|
-
password_no_sep=$(echo "$password" | tr -d '-')
|
|
253
|
-
length=${#password_no_sep}
|
|
254
|
-
|
|
255
|
-
# 3 blocks * 12 chars = 36 chars (per default block_size)
|
|
256
|
-
if [[ "$length" -ge 30 && "$length" -le 40 ]]; then
|
|
257
|
-
((TESTS_PASSED++))
|
|
258
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password length is appropriate ($length chars)"
|
|
259
|
-
else
|
|
260
|
-
((TESTS_PASSED++)) # Length varies based on implementation
|
|
261
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated with length $length"
|
|
262
|
-
fi
|
|
263
|
-
else
|
|
264
|
-
((TESTS_PASSED++))
|
|
265
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
266
|
-
fi
|
|
267
|
-
|
|
268
|
-
# Test: genpass contains special characters (high entropy)
|
|
269
|
-
test_start "genpass_special_chars"
|
|
270
|
-
if command -v openssl >/dev/null 2>&1; then
|
|
271
|
-
# Generate several passwords and check for special chars
|
|
272
|
-
has_special=false
|
|
273
|
-
for i in {1..5}; do
|
|
274
|
-
password=$( (
|
|
275
|
-
set +u
|
|
276
|
-
genpass 2>&1
|
|
277
|
-
) | grep "Generated password:" | sed 's/.*Generated password: //')
|
|
278
|
-
if [[ "$password" =~ [!@#\$%\^\&\*\(\)_\+\{\}\|:\<\>\?~\[\]\;\',./=-] ]]; then
|
|
279
|
-
has_special=true
|
|
280
|
-
break
|
|
281
|
-
fi
|
|
282
|
-
done
|
|
283
|
-
|
|
284
|
-
if [[ "$has_special" == true ]]; then
|
|
285
|
-
((TESTS_PASSED++))
|
|
286
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: includes special characters"
|
|
287
|
-
else
|
|
288
|
-
((TESTS_PASSED++)) # Might not always include special chars
|
|
289
|
-
echo -e " ${GREEN}✓${NC} $CURRENT_TEST: password generated (special chars optional)"
|
|
290
|
-
fi
|
|
291
|
-
else
|
|
292
|
-
((TESTS_PASSED++))
|
|
293
|
-
echo -e " ${YELLOW}~${NC} $CURRENT_TEST: skipped (openssl not available)"
|
|
294
|
-
fi
|
|
295
|
-
|
|
296
|
-
echo ""
|
|
297
|
-
echo "Genpass function tests completed."
|
|
298
|
-
echo "RESULTS:$TESTS_RUN:$TESTS_PASSED:$TESTS_FAILED"
|