package wire_test import ( "testing" "git.noodles.cam/claude-skills/marketplace/cli/internal/wire" ) func TestParseKey(t *testing.T) { acme := wire.Repo{Owner: "acme", Name: "widgets"} for _, tc := range []struct { in string want wire.Key }{ {"42", wire.Key{Number: 42}}, {"#42", wire.Key{Number: 42}}, {" acme/widgets#42 ", wire.Key{Repo: acme, Number: 42}}, {"https://git.example.test/acme/widgets/issues/42", wire.Key{Repo: acme, Number: 42}}, {"https://git.example.test/acme/widgets/issues/42/", wire.Key{Repo: acme, Number: 42}}, } { got, err := wire.ParseKey(tc.in) if err != nil { t.Errorf("ParseKey(%q): %v", tc.in, err) continue } if got != tc.want { t.Errorf("ParseKey(%q) = %v, want %v", tc.in, got, tc.want) } } // What is not a key has to be refused as one. `o/r#-3` is the case a bare // strconv.Atoi accepts and nobody ever wrote: a key read back out of a // metadata line somebody hand-edited must come back as "not a key", never // as issue -3. for _, bad := range []string{"not an issue", "o/r#-3", "o/r#4x", "o/r#", "o/r", ""} { if got, err := wire.ParseKey(bad); err == nil { t.Errorf("ParseKey(%q) = %v, want a refusal", bad, got) } } if got := (wire.Key{Repo: acme, Number: 42}).String(); got != "acme/widgets#42" { t.Errorf("a qualified key formatted as %q", got) } if got := (wire.Key{Number: 42}).In(acme).String(); got != "acme/widgets#42" { t.Errorf("an unqualified key filled in as %q", got) } }