| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- #!/bin/bash
- # Functional tests for git-workflow skill
- # Tests gh (GitHub CLI) and delta
- set -euo pipefail
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- PROJECT_ROOT="$SCRIPT_DIR/../../.."
- # Colors
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m'
- PASSED=0
- FAILED=0
- SKIPPED=0
- pass() { ((PASSED++)); echo -e "${GREEN}✓${NC} $1"; }
- fail() { ((FAILED++)); echo -e "${RED}✗${NC} $1: $2"; }
- skip() { ((SKIPPED++)); echo -e "${YELLOW}○${NC} $1 (skipped: $2)"; }
- check_prereqs() {
- local missing=()
- command -v gh >/dev/null 2>&1 || missing+=("gh")
- command -v delta >/dev/null 2>&1 || missing+=("delta")
- if [[ ${#missing[@]} -gt 0 ]]; then
- echo -e "${YELLOW}Missing tools: ${missing[*]}${NC}"
- echo "Install with: brew install ${missing[*]}"
- echo "Some tests will be skipped."
- echo ""
- fi
- }
- # === gh Tests ===
- test_gh_version() {
- if ! command -v gh >/dev/null 2>&1; then
- skip "gh: version check" "gh not installed"
- return
- fi
- local result
- result=$(gh --version 2>/dev/null | head -1)
- if [[ "$result" == *"gh version"* ]]; then
- pass "gh: version command works"
- else
- fail "gh: version" "unexpected output: $result"
- fi
- }
- test_gh_auth_status() {
- if ! command -v gh >/dev/null 2>&1; then
- skip "gh: auth status" "gh not installed"
- return
- fi
- local result exit_code
- result=$(gh auth status 2>&1) || exit_code=$?
- if [[ "$result" == *"Logged in"* ]]; then
- pass "gh: authenticated"
- elif [[ "$result" == *"not logged"* ]]; then
- skip "gh: auth status" "not authenticated (run 'gh auth login')"
- else
- fail "gh: auth status" "unexpected: $result"
- fi
- }
- test_gh_repo_view() {
- if ! command -v gh >/dev/null 2>&1; then
- skip "gh: repo view" "gh not installed"
- return
- fi
- # Check if we're in a git repo with a remote
- if ! git remote get-url origin >/dev/null 2>&1; then
- skip "gh: repo view" "no git remote configured"
- return
- fi
- local result
- result=$(gh repo view --json name 2>/dev/null | jq -r '.name' 2>/dev/null || echo "")
- if [[ -n "$result" && "$result" != "null" ]]; then
- pass "gh: repo view (name: $result)"
- else
- skip "gh: repo view" "not a GitHub repo or not authenticated"
- fi
- }
- test_gh_api() {
- if ! command -v gh >/dev/null 2>&1; then
- skip "gh: API access" "gh not installed"
- return
- fi
- local result
- result=$(gh api user --jq '.login' 2>/dev/null || echo "")
- if [[ -n "$result" ]]; then
- pass "gh: API access works (user: $result)"
- else
- skip "gh: API access" "not authenticated"
- fi
- }
- # === delta Tests ===
- test_delta_version() {
- if ! command -v delta >/dev/null 2>&1; then
- skip "delta: version check" "delta not installed"
- return
- fi
- local result
- result=$(delta --version 2>/dev/null)
- if [[ "$result" == *"delta"* ]]; then
- pass "delta: version command works"
- else
- fail "delta: version" "unexpected output"
- fi
- }
- test_delta_diff() {
- if ! command -v delta >/dev/null 2>&1; then
- skip "delta: diff formatting" "delta not installed"
- return
- fi
- local file1 file2 result
- file1=$(mktemp)
- file2=$(mktemp)
- echo "line 1" > "$file1"
- echo "line 2" > "$file2"
- result=$(diff -u "$file1" "$file2" | delta 2>/dev/null || true)
- rm -f "$file1" "$file2"
- if [[ -n "$result" ]]; then
- pass "delta: formats diff output"
- else
- fail "delta: diff formatting" "no output"
- fi
- }
- test_delta_git_diff() {
- if ! command -v delta >/dev/null 2>&1; then
- skip "delta: git diff" "delta not installed"
- return
- fi
- # Check if we're in a git repo
- if ! git rev-parse --git-dir >/dev/null 2>&1; then
- skip "delta: git diff" "not in a git repository"
- return
- fi
- # This just verifies delta can process git diff output
- local result
- result=$(git diff HEAD~1 --stat 2>/dev/null | delta 2>/dev/null || echo "ok")
- pass "delta: processes git diff"
- }
- # === lazygit Tests ===
- test_lazygit_version() {
- if ! command -v lazygit >/dev/null 2>&1; then
- skip "lazygit: version check" "lazygit not installed"
- return
- fi
- local result
- result=$(lazygit --version 2>/dev/null)
- if [[ -n "$result" ]]; then
- pass "lazygit: version command works"
- else
- fail "lazygit: version" "no output"
- fi
- }
- # === Run Tests ===
- main() {
- echo "=== git-workflow functional tests ==="
- echo ""
- check_prereqs
- echo "--- gh (GitHub CLI) tests ---"
- test_gh_version
- test_gh_auth_status
- test_gh_repo_view
- test_gh_api
- echo ""
- echo "--- delta tests ---"
- test_delta_version
- test_delta_diff
- test_delta_git_diff
- echo ""
- echo "--- lazygit tests ---"
- test_lazygit_version
- echo ""
- echo "=== Results ==="
- echo -e "Passed: ${GREEN}$PASSED${NC}"
- echo -e "Failed: ${RED}$FAILED${NC}"
- echo -e "Skipped: ${YELLOW}$SKIPPED${NC}"
- [[ $FAILED -eq 0 ]]
- }
- main "$@"
|