package lock import ( "os" "path/filepath" "strings" "testing" ) // Locks written before visibility was recorded have three fields, and must keep // loading: a repository does not get to stop working because the tool learned // something new. func TestLoadsThreeAndFourFieldRecords(t *testing.T) { root := t.TempDir() p := Path(root) if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil { t.Fatal(err) } body := "# comment\n\nh/o/r/old.md\thttps://h/old\t\"1\"\n" + "h/o/r/new.md\thttps://h/new\t\"2\"\tnot-public\n" if err := os.WriteFile(p, []byte(body), 0o644); err != nil { t.Fatal(err) } s, err := Load(root) if err != nil { t.Fatal(err) } old, _ := s.Get("h/o/r/old.md") if old.Visibility != "" { t.Errorf("a three-field record should have unknown visibility, got %q", old.Visibility) } nw, _ := s.Get("h/o/r/new.md") if nw.Visibility != NotPublic { t.Errorf("visibility = %q, want %q", nw.Visibility, NotPublic) } // And unknown must survive a round trip rather than being written as a value. if err := s.Save(); err != nil { t.Fatal(err) } out, _ := os.ReadFile(p) for _, line := range strings.Split(string(out), "\n") { if strings.HasPrefix(line, "h/o/r/old.md") && strings.Count(line, "\t") != 2 { t.Errorf("unknown visibility was written as a field: %q", line) } } } func TestRejectsAMalformedRecord(t *testing.T) { root := t.TempDir() p := Path(root) os.MkdirAll(filepath.Dir(p), 0o755) os.WriteFile(p, []byte("h/o/r/x.md\thttps://h/x\n"), 0o644) if _, err := Load(root); err == nil { t.Error("a two-field record should be an error, not a silently empty ETag") } }