internal/library/metacache_test.go
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}