package auth import ( "crypto/sha256" "encoding/hex" "testing" ) func hashHex(token string) string { h := sha256.Sum256([]byte(token)) return hex.EncodeToString(h[:]) } func TestPATVerify(t *testing.T) { const user = "u@d.com" file := "# my tokens\n" + hashHex("goodtoken") + " laptop\n" + hashHex("second") + "\n" + "garbage line that is not hex\n" st := writeTree(t, map[string]string{ user + "/gitweb/tokens": file, }) v := NewPATVerifier(st) cases := []struct { token string want bool }{ {"goodtoken", true}, {"second", true}, {"wrong", false}, {"", false}, } for _, c := range cases { got, err := v.Verify(user, c.token) if err != nil { t.Fatalf("Verify(%q): %v", c.token, err) } if got != c.want { t.Errorf("Verify(%q) = %v, want %v", c.token, got, c.want) } } } func TestPATVerifyNoFile(t *testing.T) { st := writeTree(t, map[string]string{ "u@d.com/other": "x", // no tokens file }) v := NewPATVerifier(st) got, err := v.Verify("u@d.com", "anything") if err != nil { t.Fatalf("Verify: %v", err) } if got { t.Error("Verify with no tokens file = true, want false") } } func TestParseTokenFileSkipsMalformed(t *testing.T) { data := []byte("#c\n\n \nnothex\n" + hashHex("x") + " label\n" + "abcd\n") // too short got := parseTokenFile(data) if len(got) != 1 { t.Fatalf("parsed %d hashes, want 1", len(got)) } }