c9ac014473
- Extract shared manifest types into internal/manifest/types leaf package. - Extract SQLite adapter into internal/manifest/sqlite. - Extract JSONL adapter into internal/manifest/jsonl. - Isolate modernc.org/sqlite import to sqlite/adapter.go. - Add adapter-backed registry with manifest.Default. - Adapter-agnostic ConvertManifest in types/. - MemoryAdapter for in-memory manifest testing. - CLI uses manifest.Default registry directly. - SQLite LogWriter type assertion moved into SQLiteAdapter. - Manifest interface includes Entries(); EntryReader removed. - No behavior changes. 100% coverage across all 6 packages.
210 lines
4.1 KiB
Go
210 lines
4.1 KiB
Go
package jsonl
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"gitea.k3s.k0.nu/tools/photocli/internal/manifest/types"
|
|
)
|
|
|
|
func TestAdapter(t *testing.T) {
|
|
a := Adapter{}
|
|
if a.Format() != types.FormatJSONL {
|
|
t.Fatal("expected JSONL format")
|
|
}
|
|
if len(a.Aliases()) != 1 || a.Aliases()[0] != "json" {
|
|
t.Fatal("expected json alias")
|
|
}
|
|
dir := t.TempDir()
|
|
if a.Path(dir) != Path(dir) {
|
|
t.Fatal("expected path match")
|
|
}
|
|
if a.Exists(dir) {
|
|
t.Fatal("expected not to exist in empty dir")
|
|
}
|
|
m, err := a.Open(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
w, err := a.OpenLogWriter(nil, dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w.Close()
|
|
}
|
|
|
|
func TestStoreLoadEmpty(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if m == nil {
|
|
t.Fatal("expected non-nil store")
|
|
}
|
|
}
|
|
|
|
func TestStoreLoadNonexistent(t *testing.T) {
|
|
m := Load("/nonexistent/path")
|
|
if m == nil {
|
|
t.Fatal("expected non-nil store")
|
|
}
|
|
}
|
|
|
|
func TestStoreAddAndHas(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if m.Has("x") {
|
|
t.Fatal("expected Has to return false")
|
|
}
|
|
m.Add("x", "photo.jpg", 42, "s3")
|
|
if !m.Has("x") {
|
|
t.Fatal("expected Has to return true")
|
|
}
|
|
}
|
|
|
|
func TestStoreSaveAndReload(t *testing.T) {
|
|
dir := t.TempDir()
|
|
m := Load(dir)
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Add("id1", "file1.jpg", 10, "aws")
|
|
m.Add("id2", "file2.jpg", 20, "gcs")
|
|
if err := m.Save(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
|
|
m2 := Load(dir)
|
|
if !m2.Has("id1") {
|
|
t.Fatal("expected id1 after reload")
|
|
}
|
|
if !m2.Has("id2") {
|
|
t.Fatal("expected id2 after reload")
|
|
}
|
|
}
|
|
|
|
func TestStoreOpenAppendCreatesDirs(t *testing.T) {
|
|
dir := t.TempDir()
|
|
subdir := dir + "/a/b"
|
|
m := Load(subdir)
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
}
|
|
|
|
func TestStoreCloseIdempotent(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
m.Close()
|
|
}
|
|
|
|
func TestStoreOpenAppendIdempotent(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
}
|
|
|
|
func TestStoreEntries(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
m.Add("e1", "f1.jpg", 1, "c1")
|
|
m.Add("e2", "f2.jpg", 2, "c2")
|
|
entries := m.Entries()
|
|
if len(entries) != 2 {
|
|
t.Fatalf("expected 2 entries, got %d", len(entries))
|
|
}
|
|
}
|
|
|
|
func TestStoreManifestFormat(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if m.ManifestFormat() != types.FormatJSONL {
|
|
t.Fatal("expected JSONL format")
|
|
}
|
|
}
|
|
|
|
func TestStoreOpenAppendMkdirError(t *testing.T) {
|
|
m := Load("/proc/cannot-create-dir-here")
|
|
if err := m.OpenAppend(); err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
}
|
|
|
|
func TestStoreSaveWithNoFile(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if err := m.Save(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestStoreLoadFromExistingFile(t *testing.T) {
|
|
dir := t.TempDir()
|
|
m := Load(dir)
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Add("abc", "a.jpg", 100, "gcs")
|
|
m.Close()
|
|
m2 := Load(dir)
|
|
if !m2.Has("abc") {
|
|
t.Fatal("expected abc after reload")
|
|
}
|
|
}
|
|
|
|
func TestFileExists(t *testing.T) {
|
|
dir := t.TempDir()
|
|
if FileExists(dir) {
|
|
t.Fatal("expected false for directory")
|
|
}
|
|
if FileExists("/nonexistent/file") {
|
|
t.Fatal("expected false for nonexistent")
|
|
}
|
|
}
|
|
|
|
func TestLoadWithPathFallback(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := Path(dir)
|
|
osWriteFile(path, []byte(`{"id":"abc","filename":"a.jpg","size":100,"cloud":"gcs","exported":1234}`+"\n"), 0644)
|
|
m := Load(dir)
|
|
if !m.Has("abc") {
|
|
t.Fatal("expected abc")
|
|
}
|
|
if e := m.Entries()["abc"]; e.Path != "a.jpg" {
|
|
t.Fatalf("expected path fallback to filename, got %q", e.Path)
|
|
}
|
|
}
|
|
|
|
func TestOpenAppendAlreadyOpen(t *testing.T) {
|
|
m := Load(t.TempDir())
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := m.OpenAppend(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m.Close()
|
|
}
|
|
|
|
func TestOpenAppendOpenFileError(t *testing.T) {
|
|
dir := t.TempDir()
|
|
os.MkdirAll(Path(dir), 0755)
|
|
m := Load(dir)
|
|
if err := m.OpenAppend(); err == nil {
|
|
t.Fatal("expected error when path is a directory")
|
|
}
|
|
}
|
|
|
|
func TestOpenAppendMkdirError(t *testing.T) {
|
|
m := Load("/proc/cannot-create-dir-here")
|
|
if err := m.OpenAppend(); err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
}
|
|
|
|
var osWriteFile = os.WriteFile
|