git@cosmocr.at/gitweb.git @ HEAD · summary refs log
HEAD / internal / store / store_test.go /
internal/store/store_test.go · 2.7 KiB · raw
view: SourceMarkdown ☑ force

package store

import ( "os" "path/filepath" "testing" "time" )

func TestLocalStoreSeqChangesOnEdit(t *testing.T) { root := t.TempDir() user := "u@d.com" dir := filepath.Join(root, user, "repo") if err := os.MkdirAll(dir, 0o755); err != nil { t.Fatal(err) } f := filepath.Join(dir, "a.txt") if err := os.WriteFile(f, []byte("hello"), 0o644); err != nil { t.Fatal(err) }

s := NewLocalStore(root)
seq1, err := s.Seq(user + "/repo")
if err != nil {
	t.Fatalf("Seq: %v", err)
}
if seq1 == 0 {
	t.Fatal("expected non-zero seq")
}

// Touch a file under the dir with a strictly later mtime; Seq must change.
later := time.Now().Add(2 * time.Second)
if err := os.Chtimes(f, later, later); err != nil {
	t.Fatal(err)
}
seq2, err := s.Seq(user + "/repo")
if err != nil {
	t.Fatalf("Seq: %v", err)
}
if seq2 == seq1 {
	t.Fatalf("expected Seq to change after edit: %d == %d", seq1, seq2)
}

}

func TestLocalStoreSeqNotFound(t *testing.T) { s := NewLocalStore(t.TempDir()) if _, err := s.Seq("u@d.com/missing"); err != ErrNotFound { t.Fatalf("want ErrNotFound, got %v", err) } }

func TestLocalStorePutCreatesParents(t *testing.T) { s := NewLocalStore(t.TempDir()) p := "u@d.com/repo.git/objects/pack/pack-abc.pack" if err := s.Put(p, []byte("data")); err != nil { t.Fatalf("Put: %v", err) } got, err := s.Get(p) if err != nil { t.Fatalf("Get after Put: %v", err) } if string(got) != "data" { t.Fatalf("got %q, want %q", got, "data") } // The parent directory must have been created. if isDir, err := s.Stat("u@d.com/repo.git/objects/pack"); err != nil || !isDir { t.Fatalf("parent dir Stat: isDir=%v err=%v", isDir, err) } }

func TestLocalStorePutOverwrites(t *testing.T) { s := NewLocalStore(t.TempDir()) p := "u@d.com/repo.git/HEAD" if err := s.Put(p, []byte("ref: refs/heads/main\n")); err != nil { t.Fatal(err) } if err := s.Put(p, []byte("ref: refs/heads/dev\n")); err != nil { t.Fatal(err) } got, err := s.Get(p) if err != nil { t.Fatal(err) } if string(got) != "ref: refs/heads/dev\n" { t.Fatalf("overwrite failed: got %q", got) } }

func TestLocalStoreDelete(t *testing.T) { s := NewLocalStore(t.TempDir()) p := "u@d.com/repo.git/refs/heads/tmp" if err := s.Put(p, []byte("hash")); err != nil { t.Fatal(err) } if err := s.Delete(p); err != nil { t.Fatalf("Delete: %v", err) } if _, err := s.Get(p); err != ErrNotFound { t.Fatalf("want ErrNotFound after delete, got %v", err) } // Deleting a missing path reports ErrNotFound. if err := s.Delete(p); err != ErrNotFound { t.Fatalf("delete-missing: want ErrNotFound, got %v", err) } }

// Both concrete stores must satisfy WriteStore. var ( _ WriteStore = (*LocalStore)(nil) _ WriteStore = (*UpspinStore)(nil) )