package doctor import ( "os" "path/filepath" "testing" ) func TestNewTownGitCheck(t *testing.T) { check := NewTownGitCheck() if check.Name() != "town-git" { t.Errorf("expected name 'town-git', got %q", check.Name()) } if check.Description() == "" { t.Error("expected non-empty description") } if check.CanFix() { t.Error("expected CanFix() to return false") } } func TestTownGitCheck_NoGitDir(t *testing.T) { // Create temp directory without .git tmpDir, err := os.MkdirTemp("", "town-git-test-*") if err != nil { t.Fatalf("failed to create temp dir: %v", err) } defer os.RemoveAll(tmpDir) ctx := &CheckContext{TownRoot: tmpDir} check := NewTownGitCheck() result := check.Run(ctx) if result.Status != StatusWarning { t.Errorf("expected StatusWarning, got %v", result.Status) } if result.FixHint == "" { t.Error("expected non-empty FixHint") } } func TestTownGitCheck_WithGitDir(t *testing.T) { // Create temp directory with .git tmpDir, err := os.MkdirTemp("", "town-git-test-*") if err != nil { t.Fatalf("failed to create temp dir: %v", err) } defer os.RemoveAll(tmpDir) gitDir := filepath.Join(tmpDir, ".git") if err := os.Mkdir(gitDir, 0755); err != nil { t.Fatalf("failed to create .git dir: %v", err) } ctx := &CheckContext{TownRoot: tmpDir} check := NewTownGitCheck() result := check.Run(ctx) if result.Status != StatusOK { t.Errorf("expected StatusOK, got %v", result.Status) } } func TestTownGitCheck_GitIsFile(t *testing.T) { // Create temp directory with .git as a file (worktree case) tmpDir, err := os.MkdirTemp("", "town-git-test-*") if err != nil { t.Fatalf("failed to create temp dir: %v", err) } defer os.RemoveAll(tmpDir) gitFile := filepath.Join(tmpDir, ".git") if err := os.WriteFile(gitFile, []byte("gitdir: /some/path"), 0644); err != nil { t.Fatalf("failed to create .git file: %v", err) } ctx := &CheckContext{TownRoot: tmpDir} check := NewTownGitCheck() result := check.Run(ctx) if result.Status != StatusWarning { t.Errorf("expected StatusWarning for .git file, got %v", result.Status) } }