package store_test import ( "context" "testing" "github.com/syonad/clonepack/internal/store" ) func newPendingStore(t *testing.T) (*store.SQLitePendingPackageStore, int64) { t.Helper() db := newTestDB(t) repoID := insertTestRepo(t, db) return store.NewPendingPackageStore(db), repoID } func makePending(repoID int64, name, version, location string) store.PendingPackage { return store.PendingPackage{ RepoID: repoID, Name: name, Version: version, Arch: "amd64", Location: location, Checksum: "abc123", ChecksumType: "sha256", Size: 1024, } } func TestUpsertAndListPending(t *testing.T) { s, repoID := newPendingStore(t) ctx := context.Background() pkgs := []store.PendingPackage{ makePending(repoID, "curl", "7.88", "Packages/curl.rpm"), makePending(repoID, "wget", "1.21", "Packages/wget.rpm"), } if err := s.UpsertPending(ctx, pkgs); err != nil { t.Fatalf("UpsertPending: %v", err) } listed, err := s.ListPending(ctx, repoID) if err != nil { t.Fatalf("ListPending: %v", err) } if len(listed) != 2 { t.Fatalf("expected 2 pending, got %d", len(listed)) } if listed[0].Name != "curl" { t.Errorf("expected curl first, got %q", listed[0].Name) } } func TestUpsertPending_idempotent(t *testing.T) { s, repoID := newPendingStore(t) ctx := context.Background() pkg := makePending(repoID, "curl", "7.88", "Packages/curl.rpm") s.UpsertPending(ctx, []store.PendingPackage{pkg}) // Insert same package again — INSERT OR IGNORE, should not duplicate. s.UpsertPending(ctx, []store.PendingPackage{pkg}) listed, _ := s.ListPending(ctx, repoID) if len(listed) != 1 { t.Errorf("expected 1 after double upsert, got %d", len(listed)) } } func TestDeletePending_byIDs(t *testing.T) { s, repoID := newPendingStore(t) ctx := context.Background() pkgs := []store.PendingPackage{ makePending(repoID, "curl", "7.88", "Packages/curl.rpm"), makePending(repoID, "wget", "1.21", "Packages/wget.rpm"), makePending(repoID, "vim", "9.0", "Packages/vim.rpm"), } s.UpsertPending(ctx, pkgs) listed, _ := s.ListPending(ctx, repoID) if len(listed) != 3 { t.Fatalf("setup: expected 3, got %d", len(listed)) } // Delete first two. ids := []int64{listed[0].ID, listed[1].ID} if err := s.DeletePending(ctx, ids); err != nil { t.Fatalf("DeletePending: %v", err) } remaining, _ := s.ListPending(ctx, repoID) if len(remaining) != 1 { t.Fatalf("expected 1 remaining, got %d", len(remaining)) } if remaining[0].Name != "vim" { t.Errorf("expected vim remaining, got %q", remaining[0].Name) } } func TestDeletePending_empty(t *testing.T) { s, _ := newPendingStore(t) // Should not error on empty slice. if err := s.DeletePending(context.Background(), nil); err != nil { t.Errorf("DeletePending(nil): %v", err) } if err := s.DeletePending(context.Background(), []int64{}); err != nil { t.Errorf("DeletePending([]): %v", err) } } func TestDeleteAllPending(t *testing.T) { s, repoID := newPendingStore(t) ctx := context.Background() s.UpsertPending(ctx, []store.PendingPackage{ makePending(repoID, "curl", "7.88", "Packages/curl.rpm"), makePending(repoID, "wget", "1.21", "Packages/wget.rpm"), }) if err := s.DeleteAllPending(ctx, repoID); err != nil { t.Fatalf("DeleteAllPending: %v", err) } remaining, _ := s.ListPending(ctx, repoID) if len(remaining) != 0 { t.Errorf("expected 0 after DeleteAll, got %d", len(remaining)) } } func TestListPending_empty(t *testing.T) { s, repoID := newPendingStore(t) listed, err := s.ListPending(context.Background(), repoID) if err != nil { t.Fatalf("ListPending: %v", err) } if len(listed) != 0 { t.Errorf("expected 0, got %d", len(listed)) } }