package sheet
import (
"os"
"path/filepath"
"strings"
"testing"
)
// The saved sheet is what makes a review resumable, so it has to survive being
// written and read back exactly.
func TestStoreRoundTrips(t *testing.T) {
dir := t.TempDir()
s := Store{Dir: filepath.Join(dir, "review")}
album := filepath.Join(dir, "staging", "Boards of Canada - Geogaddi")
before := sample()
if _, ok, err := s.Load(album); err != nil || ok {
t.Fatalf("an album with no saved sheet should report none: %v %v", ok, err)
}
path, err := s.Save(album, Render(before))
if err != nil {
t.Fatal(err)
}
if !strings.HasPrefix(filepath.Base(path), "boards-of-canada-geogaddi-") {
t.Errorf("the stored name %q is not readable", filepath.Base(path))
}
text, ok, err := s.Load(album)
if err != nil || !ok {
t.Fatalf("Load: %v %v", ok, err)
}
got, err := Parse(text, before)
if err != nil {
t.Fatal(err)
}
if got.ChangedFrom(before).Any() || len(got.Tracks) != len(before.Tracks) {
t.Errorf("the round trip changed the sheet: %+v", got)
}
s.Delete(album)
if _, ok, _ := s.Load(album); ok {
t.Error("Delete left the sheet behind")
}
}
// Two albums with the same folder name in different places must not share a
// saved sheet.
func TestStoreKeepsSameNamedAlbumsApart(t *testing.T) {
dir := t.TempDir()
s := Store{Dir: dir}
a := filepath.Join(dir, "one", "Boards of Canada - Geogaddi")
b := filepath.Join(dir, "two", "Boards of Canada - Geogaddi")
if s.Path(a) == s.Path(b) {
t.Fatalf("both albums map to %s", s.Path(a))
}
if _, err := s.Save(a, "album: One\n"); err != nil {
t.Fatal(err)
}
if _, err := s.Save(b, "album: Two\n"); err != nil {
t.Fatal(err)
}
ta, _, _ := s.Load(a)
tb, _, _ := s.Load(b)
if !strings.Contains(ta, "One") || !strings.Contains(tb, "Two") {
t.Errorf("the two sheets got mixed up: %q and %q", ta, tb)
}
}
// A store with nowhere to write is not an error: a configuration without a state
// directory simply has no resumable reviews.
func TestStoreWithNoDirectory(t *testing.T) {
s := Store{}
if _, err := s.Save("/x", "y"); err != nil {
t.Errorf("Save: %v", err)
}
if _, ok, err := s.Load("/x"); err != nil || ok {
t.Errorf("Load: %v %v", ok, err)
}
s.Delete("/x")
if p := s.Path("/x"); !strings.HasPrefix(p, "x-") || !strings.HasSuffix(p, ".txt") {
t.Errorf("Path = %q", p)
}
// Nothing was created anywhere.
if _, err := os.Stat(filepath.Join(os.TempDir(), "review")); err == nil {
t.Error("a store with no directory wrote something")
}
}