package gitea_test import ( "os" "path/filepath" "strings" "testing" "git.noodles.cam/claude-skills/marketplace/cli/internal/gitea" "git.noodles.cam/claude-skills/marketplace/cli/internal/wire" ) func TestRemoteMapRoundTrips(t *testing.T) { root := filepath.Join(t.TempDir(), "issues") key := wire.Key{Repo: wire.Repo{Owner: "acme", Name: "widgets"}, Number: 42} m := gitea.RemoteMap{} m.Set(key, "wire-sqlc-appclick") if err := m.Save(root); err != nil { t.Fatalf("Save: %v", err) } path := gitea.RemoteMapPath(root) if want := filepath.Join(root, ".remote.json"); path != want { t.Errorf("the ledger is at %s, want %s — beside the issues it indexes", path, want) } raw, err := os.ReadFile(path) if err != nil { t.Fatalf("reading the ledger: %v", err) } if !strings.Contains(string(raw), `"acme/widgets#42": "wire-sqlc-appclick"`) { t.Errorf("the ledger is not readable by a human:\n%s", raw) } back := gitea.LoadRemoteMap(root) if got := back.Slug(key); got != "wire-sqlc-appclick" { t.Errorf("the key came back as %q, want wire-sqlc-appclick", got) } if got := back.Slug(wire.Key{Repo: key.Repo, Number: 7}); got != "" { t.Errorf("an unrecorded key answered %q", got) } // A rebuild is a merge and never a replacement: what is already recorded // survives an entry added on top of it. This is what makes a pull of a // number whose file was deleted by a push land on the same slug. second := wire.Key{Repo: key.Repo, Number: 43} back.Set(second, "drop-the-wiki") if err := back.Save(root); err != nil { t.Fatalf("Save: %v", err) } again := gitea.LoadRemoteMap(root) if again.Slug(key) != "wire-sqlc-appclick" || again.Slug(second) != "drop-the-wiki" { t.Errorf("a second save lost an entry: %v", again) } } // The ledger is a cache of markers the tracker holds, so an unreadable one must // not stop the pull that would rebuild it. func TestRemoteMapSurvivesAMissingOrMangledFile(t *testing.T) { root := t.TempDir() if got := gitea.LoadRemoteMap(filepath.Join(root, "nowhere")); len(got) != 0 { t.Errorf("a missing ledger loaded as %v", got) } if err := os.WriteFile(gitea.RemoteMapPath(root), []byte("{ not json at all"), 0o644); err != nil { t.Fatal(err) } got := gitea.LoadRemoteMap(root) if len(got) != 0 { t.Errorf("a mangled ledger loaded as %v", got) } // Still writable afterwards: an unreadable ledger costs a re-pull, not a run. got.Set(wire.Key{Repo: wire.Repo{Owner: "acme", Name: "widgets"}, Number: 1}, "first") if err := got.Save(root); err != nil { t.Fatalf("Save over a mangled ledger: %v", err) } if gitea.LoadRemoteMap(root).Slug(wire.Key{Repo: wire.Repo{Owner: "acme", Name: "widgets"}, Number: 1}) != "first" { t.Error("the ledger did not come back after being rewritten") } }