v0.5.0: manifests, filters, logging, docs
pipeline / build (push) Has been cancelled
pipeline / test (push) Has been cancelled

This commit is contained in:
Ein Anderssono
2026-06-15 00:00:06 +02:00
parent 3d3c4a4742
commit 2e73d01b40
33 changed files with 7238 additions and 512 deletions
+266 -25
View File
@@ -35,9 +35,9 @@ func TestParseAlbumsJSON(t *testing.T) {
wantErr: true,
},
{
name: "missing albums key",
json: `{}`,
want: []Album{},
name: "missing albums key",
json: `{}`,
want: []Album{},
},
}
@@ -66,23 +66,23 @@ func TestParseAlbumsJSON(t *testing.T) {
func TestParseAssetsJSON(t *testing.T) {
tests := []struct {
name string
json string
want []Asset
name string
json string
want []Asset
wantTotal int
wantErr bool
errMsg string
wantErr bool
errMsg string
}{
{
name: "empty assets",
json: `{"assets":[],"total":0}`,
want: []Asset{},
name: "empty assets",
json: `{"assets":[],"total":0}`,
want: []Asset{},
wantTotal: 0,
},
{
name: "single asset",
json: `{"assets":[{"id":"asset1","filename":"IMG_0001.JPG"}],"total":1}`,
want: []Asset{{ID: "asset1", Filename: "IMG_0001.JPG"}},
name: "single asset",
json: `{"assets":[{"id":"asset1","filename":"IMG_0001.JPG"}],"total":1}`,
want: []Asset{{ID: "asset1", Filename: "IMG_0001.JPG"}},
wantTotal: 1,
},
{
@@ -106,9 +106,9 @@ func TestParseAssetsJSON(t *testing.T) {
wantTotal: 1,
},
{
name: "multiple assets",
json: `{"assets":[{"id":"a1","filename":"a.jpg"},{"id":"a2","filename":"b.jpg"},{"id":"a3","filename":"c.jpg"}],"total":3}`,
want: []Asset{{ID: "a1", Filename: "a.jpg"}, {ID: "a2", Filename: "b.jpg"}, {ID: "a3", Filename: "c.jpg"}},
name: "multiple assets",
json: `{"assets":[{"id":"a1","filename":"a.jpg"},{"id":"a2","filename":"b.jpg"},{"id":"a3","filename":"c.jpg"}],"total":3}`,
want: []Asset{{ID: "a1", Filename: "a.jpg"}, {ID: "a2", Filename: "b.jpg"}, {ID: "a3", Filename: "c.jpg"}},
wantTotal: 3,
},
{
@@ -132,9 +132,9 @@ func TestParseAssetsJSON(t *testing.T) {
wantErr: true,
},
{
name: "empty error is not an error",
json: `{"error":"","assets":[{"id":"a1","filename":"IMG.JPG"}],"total":1}`,
want: []Asset{{ID: "a1", Filename: "IMG.JPG"}},
name: "empty error is not an error",
json: `{"error":"","assets":[{"id":"a1","filename":"IMG.JPG"}],"total":1}`,
want: []Asset{{ID: "a1", Filename: "IMG.JPG"}},
wantTotal: 1,
},
}
@@ -407,11 +407,11 @@ func TestErrBridgeNilMessage(t *testing.T) {
func TestParseExportResultJSON(t *testing.T) {
tests := []struct {
name string
json string
want ExportResult
wantErr bool
errMsg string
name string
json string
want ExportResult
wantErr bool
errMsg string
}{
{
name: "success",
@@ -488,3 +488,244 @@ func equalAsset(a, b Asset) bool {
}
return true
}
func TestCgoBridgeExportPreviewViaStub(t *testing.T) {
SetTestExportPreviewJSON(`{"filename":"0001_img.jpg","size":2048,"cloud":"local"}`)
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
result, err := bridge.ExportPreview("asset-1", "/tmp", 1024, 85, 0)
if err != nil {
t.Fatal(err)
}
if result.Filename != "0001_img.jpg" {
t.Errorf("got filename %q, want %q", result.Filename, "0001_img.jpg")
}
if result.Size != 2048 {
t.Errorf("got size %d, want %d", result.Size, 2048)
}
if result.Cloud != "local" {
t.Errorf("got cloud %q, want %q", result.Cloud, "local")
}
}
func TestCgoBridgeExportPreviewWithSlotViaStub(t *testing.T) {
SetTestExportPreviewJSON(`{"filename":"slot_img.jpg","size":4096,"cloud":"cloud"}`)
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
result, err := bridge.ExportPreviewWithSlot("asset-1", "/tmp", 2048, 85, 0, 1)
if err != nil {
t.Fatal(err)
}
if result.Filename != "slot_img.jpg" {
t.Errorf("got filename %q", result.Filename)
}
if result.Cloud != "cloud" {
t.Errorf("got cloud %q, want %q", result.Cloud, "cloud")
}
}
func TestCgoBridgeExportOriginalViaStub(t *testing.T) {
SetTestExportOriginalJSON(`{"filename":"original.jpg","size":8192,"cloud":"local"}`)
defer SetTestExportOriginalJSON(`{"filename":"test.jpg","size":2048,"cloud":"cloud"}`)
bridge := &CgoBridge{}
result, err := bridge.ExportOriginal("asset-1", "/tmp", 0)
if err != nil {
t.Fatal(err)
}
if result.Filename != "original.jpg" {
t.Errorf("got filename %q, want %q", result.Filename, "original.jpg")
}
if result.Size != 8192 {
t.Errorf("got size %d, want %d", result.Size, 8192)
}
}
func TestCgoBridgeExportOriginalWithSlotViaStub(t *testing.T) {
SetTestExportOriginalJSON(`{"filename":"slot_orig.heic","size":16384,"cloud":"local"}`)
defer SetTestExportOriginalJSON(`{"filename":"test.jpg","size":2048,"cloud":"cloud"}`)
bridge := &CgoBridge{}
result, err := bridge.ExportOriginalWithSlot("asset-1", "/tmp", 0, 2)
if err != nil {
t.Fatal(err)
}
if result.Filename != "slot_orig.heic" {
t.Errorf("got filename %q", result.Filename)
}
}
func TestCgoBridgeExportPreviewErrorViaStub(t *testing.T) {
SetTestExportPreviewJSON(`{"error":"disk full","cloud":"local"}`)
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportPreview("asset-1", "/tmp", 1024, 85, 0)
if err == nil {
t.Fatal("expected error")
}
if err.Error() != "disk full" {
t.Errorf("got error %q, want %q", err.Error(), "disk full")
}
}
func TestCgoBridgeExportOriginalErrorViaStub(t *testing.T) {
SetTestExportOriginalJSON(`{"error":"write failed","cloud":"local"}`)
defer SetTestExportOriginalJSON(`{"filename":"test.jpg","size":2048,"cloud":"cloud"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportOriginal("asset-1", "/tmp", 0)
if err == nil {
t.Fatal("expected error")
}
if err.Error() != "write failed" {
t.Errorf("got error %q, want %q", err.Error(), "write failed")
}
}
func TestCgoBridgeExportSkippedResult(t *testing.T) {
SetTestExportPreviewJSON(`{"filename":"skip.jpg","size":0,"cloud":"local","skipped":true}`)
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
result, err := bridge.ExportPreview("asset-1", "/tmp", 1024, 85, 0)
if err != nil {
t.Fatal(err)
}
if !result.Skipped {
t.Error("expected Skipped to be true")
}
}
func TestCgoBridgeCancelAndIsCancelled(t *testing.T) {
bridge := &CgoBridge{}
if bridge.IsCancelled() {
t.Error("should not be cancelled initially")
}
bridge.Cancel()
if !bridge.IsCancelled() {
t.Error("should be cancelled after Cancel()")
}
}
func TestGetProgressSlotsReturnsSlots(t *testing.T) {
slots := GetProgressSlots()
if slots == nil {
t.Errorf("GetProgressSlots should return slots in test build")
}
if len(slots) != 16 {
t.Errorf("GetProgressSlots should return 16 slots, got %d", len(slots))
}
}
func TestResetProgressSlotsNoPanic(t *testing.T) {
ResetProgressSlots()
}
func TestGetProgressSlotCount(t *testing.T) {
count := GetProgressSlotCount()
if count != 16 {
t.Errorf("expected 16, got %d", count)
}
}
func TestCgoBridgeExportPreviewNilStub(t *testing.T) {
SetTestExportPreviewJSONNull()
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportPreview("asset-1", "/tmp", 1024, 85, 0)
if err == nil {
t.Fatal("expected errBridgeNil")
}
if err != errBridgeNil {
t.Errorf("got %v, want %v", err, errBridgeNil)
}
}
func TestCgoBridgeExportOriginalNilStub(t *testing.T) {
SetTestExportOriginalJSONNull()
defer SetTestExportOriginalJSON(`{"filename":"test.jpg","size":2048,"cloud":"cloud"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportOriginal("asset-1", "/tmp", 0)
if err == nil {
t.Fatal("expected errBridgeNil")
}
if err != errBridgeNil {
t.Errorf("got %v, want %v", err, errBridgeNil)
}
}
func TestCgoBridgeExportPreviewWithSlotNilStub(t *testing.T) {
SetTestExportPreviewJSONNull()
defer SetTestExportPreviewJSON(`{"filename":"0000_test.jpg","size":1024,"cloud":"local"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportPreviewWithSlot("asset-1", "/tmp", 1024, 85, 0, 0)
if err == nil {
t.Fatal("expected errBridgeNil")
}
if err != errBridgeNil {
t.Errorf("got %v, want %v", err, errBridgeNil)
}
}
func TestCgoBridgeExportOriginalWithSlotNilStub(t *testing.T) {
SetTestExportOriginalJSONNull()
defer SetTestExportOriginalJSON(`{"filename":"test.jpg","size":2048,"cloud":"cloud"}`)
bridge := &CgoBridge{}
_, err := bridge.ExportOriginalWithSlot("asset-1", "/tmp", 0, 0)
if err == nil {
t.Fatal("expected errBridgeNil")
}
if err != errBridgeNil {
t.Errorf("got %v, want %v", err, errBridgeNil)
}
}
func TestGetProgressSlotsWithActiveSlot(t *testing.T) {
ResetProgressSlots()
slots := GetProgressSlots()
if len(slots) != 16 {
t.Errorf("expected 16 slots, got %d", len(slots))
}
for i, s := range slots {
if s.Active {
t.Errorf("slot %d should not be active after reset", i)
}
}
}
func TestResetProgressSlotsClearsState(t *testing.T) {
ResetProgressSlots()
slots := GetProgressSlots()
if len(slots) > 0 && slots[0].Active {
t.Errorf("slot should be inactive after reset")
}
}
func TestGetProgressSlotsZeroCount(t *testing.T) {
SetTestProgressSlotCount(0)
defer SetTestProgressSlotCount(3)
slots := GetProgressSlots()
if slots != nil {
t.Errorf("expected nil with zero count, got %v", slots)
}
}
func TestGetProgressSlotsNullPointer(t *testing.T) {
SetTestProgressSlotsNull(1)
defer SetTestProgressSlotsNull(0)
slots := GetProgressSlots()
if slots != nil {
t.Errorf("expected nil with null pointer, got %v", slots)
}
}
func TestExportProgressSlotType(t *testing.T) {
slot := ExportProgressSlot{
Active: true,
Progress: 0.75,
BytesDone: 512,
BytesTotal: 1024,
}
if !slot.Active {
t.Error("expected Active to be true")
}
if slot.Progress != 0.75 {
t.Errorf("expected Progress 0.75, got %f", slot.Progress)
}
}