@@ -3,6 +3,7 @@ package app
33import (
44 "bytes"
55 "context"
6+ "database/sql"
67 "encoding/json"
78 "os"
89 "os/exec"
@@ -55,6 +56,50 @@ func TestRepoInitAndShow(t *testing.T) {
5556 }
5657}
5758
59+ func TestRepoShowRepairsMissingRepositoryRecord (t * testing.T ) {
60+ repoRoot , worktreePath := createTestRepo (t )
61+
62+ var initOut bytes.Buffer
63+ var initErr bytes.Buffer
64+ if err := runRepoInit ([]string {"--repo" , repoRoot , "--main-worktree" , worktreePath }, & initOut , & initErr ); err != nil {
65+ t .Fatalf ("runRepoInit returned error: %v" , err )
66+ }
67+
68+ layout , err := git .DiscoverRepositoryLayout (repoRoot )
69+ if err != nil {
70+ t .Fatalf ("DiscoverRepositoryLayout: %v" , err )
71+ }
72+ statePath := state .DefaultPath (layout .GitDir )
73+ db , err := sql .Open ("sqlite" , statePath )
74+ if err != nil {
75+ t .Fatalf ("sql.Open: %v" , err )
76+ }
77+ defer db .Close ()
78+ if _ , err := db .Exec (`DELETE FROM repositories` ); err != nil {
79+ t .Fatalf ("DELETE repositories: %v" , err )
80+ }
81+
82+ var showOut bytes.Buffer
83+ var showErr bytes.Buffer
84+ if err := runRepoShow ([]string {"--repo" , repoRoot }, & showOut , & showErr ); err != nil {
85+ t .Fatalf ("runRepoShow returned error: %v" , err )
86+ }
87+
88+ output := showOut .String ()
89+ if ! strings .Contains (output , "State path: " + statePath ) {
90+ t .Fatalf ("expected state path after record repair, got %q" , output )
91+ }
92+
93+ store := state .NewStore (statePath )
94+ record , err := store .GetRepositoryByPath (context .Background (), layout .RepositoryRoot )
95+ if err != nil {
96+ t .Fatalf ("GetRepositoryByPath after repair: %v" , err )
97+ }
98+ if record .CanonicalPath != layout .RepositoryRoot {
99+ t .Fatalf ("expected repaired canonical path %q, got %+v" , layout .RepositoryRoot , record )
100+ }
101+ }
102+
58103func TestRepoInitSupportsJSONOutput (t * testing.T ) {
59104 repoRoot , worktreePath := createTestRepo (t )
60105
@@ -115,6 +160,45 @@ func TestDoctorDetectsDirtyProtectedBranch(t *testing.T) {
115160 }
116161}
117162
163+ func TestDoctorRepairsMissingRepositoryRecord (t * testing.T ) {
164+ repoRoot , worktreePath := createTestRepo (t )
165+
166+ var initOut bytes.Buffer
167+ var initErr bytes.Buffer
168+ if err := runRepoInit ([]string {"--repo" , repoRoot , "--main-worktree" , worktreePath }, & initOut , & initErr ); err != nil {
169+ t .Fatalf ("runRepoInit returned error: %v" , err )
170+ }
171+
172+ layout , err := git .DiscoverRepositoryLayout (repoRoot )
173+ if err != nil {
174+ t .Fatalf ("DiscoverRepositoryLayout: %v" , err )
175+ }
176+ statePath := state .DefaultPath (layout .GitDir )
177+ db , err := sql .Open ("sqlite" , statePath )
178+ if err != nil {
179+ t .Fatalf ("sql.Open: %v" , err )
180+ }
181+ defer db .Close ()
182+ if _ , err := db .Exec (`DELETE FROM repositories` ); err != nil {
183+ t .Fatalf ("DELETE repositories: %v" , err )
184+ }
185+
186+ var doctorOut bytes.Buffer
187+ var doctorErr bytes.Buffer
188+ if err := runDoctor ([]string {"--repo" , repoRoot }, & doctorOut , & doctorErr ); err != nil {
189+ t .Fatalf ("runDoctor returned error: %v" , err )
190+ }
191+
192+ store := state .NewStore (statePath )
193+ record , err := store .GetRepositoryByPath (context .Background (), layout .RepositoryRoot )
194+ if err != nil {
195+ t .Fatalf ("GetRepositoryByPath after doctor repair: %v" , err )
196+ }
197+ if record .CanonicalPath != layout .RepositoryRoot {
198+ t .Fatalf ("expected repaired canonical path %q, got %+v" , layout .RepositoryRoot , record )
199+ }
200+ }
201+
118202func TestDoctorDetectsMissingCanonicalWorktree (t * testing.T ) {
119203 repoRoot , _ := createTestRepo (t )
120204 missingWorktree := filepath .Join (repoRoot , "missing-main-worktree" )
0 commit comments