internal/library/metacache_test.go

main
gallery/internal/library/metacache_test.go history · blame · raw

85 lines · 2034 bytes

 1package library
 2
 3import (
 4	"io/fs"
 5	"os"
 6	"path/filepath"
 7	"testing"
 8	"time"
 9
10	"gitbay.org/cmc/gallery/internal/format"
11)
12
13func statFile(t *testing.T, body string) (string, fs.FileInfo) {
14	t.Helper()
15	p := filepath.Join(t.TempDir(), "a.jpg")
16	if err := os.WriteFile(p, []byte(body), 0o644); err != nil {
17		t.Fatal(err)
18	}
19	fi, err := os.Stat(p)
20	if err != nil {
21		t.Fatal(err)
22	}
23	return p, fi
24}
25
26func TestMetaCacheRoundTrip(t *testing.T) {
27	path := filepath.Join(t.TempDir(), "sub", "meta.json")
28	c, err := OpenMetaCache(path)
29	if err != nil {
30		t.Fatal(err)
31	}
32	_, fi := statFile(t, "x")
33	m := format.Meta{Width: 3, Height: 2, Camera: "X-T5", Taken: time.Date(2025, 3, 1, 0, 0, 0, 0, time.UTC)}
34	c.put("tokyo/a.jpg", fi, m)
35	c.put("gone/b.jpg", fi, m)
36	if err := c.save(map[string]bool{"tokyo/a.jpg": true}); err != nil {
37		t.Fatal(err)
38	}
39
40	c2, err := OpenMetaCache(path)
41	if err != nil {
42		t.Fatal(err)
43	}
44	got, ok := c2.get("tokyo/a.jpg", fi)
45	if !ok || !got.Taken.Equal(m.Taken) || got.Camera != "X-T5" || got.Width != 3 {
46		t.Fatalf("get = %+v, %v", got, ok)
47	}
48	if _, ok := c2.get("gone/b.jpg", fi); ok {
49		t.Fatal("entry outside keep survived save")
50	}
51}
52
53func TestMetaCacheMissOnChange(t *testing.T) {
54	c, _ := OpenMetaCache(filepath.Join(t.TempDir(), "meta.json"))
55	p, fi := statFile(t, "x")
56	c.put("a.jpg", fi, format.Meta{Width: 1, Height: 1})
57
58	if err := os.WriteFile(p, []byte("longer"), 0o644); err != nil {
59		t.Fatal(err)
60	}
61	fi2, _ := os.Stat(p)
62	if _, ok := c.get("a.jpg", fi2); ok {
63		t.Fatal("size change should miss")
64	}
65
66	later := fi.ModTime().Add(time.Hour)
67	os.WriteFile(p, []byte("x"), 0o644)
68	os.Chtimes(p, later, later)
69	fi3, _ := os.Stat(p)
70	if _, ok := c.get("a.jpg", fi3); ok {
71		t.Fatal("mtime change should miss")
72	}
73}
74
75func TestMetaCacheCorruptStartsEmpty(t *testing.T) {
76	path := filepath.Join(t.TempDir(), "meta.json")
77	os.WriteFile(path, []byte("{nope"), 0o644)
78	c, err := OpenMetaCache(path)
79	if err != nil {
80		t.Fatal(err)
81	}
82	if len(c.entries) != 0 {
83		t.Fatalf("entries = %v", c.entries)
84	}
85}