package shopify import ( "errors" "strings" "testing" "github.com/google/uuid" ) func TestApplyProductSyncScope(t *testing.T) { opt := SyncOptions{SyncLimit: defaultSyncLimit} id := uuid.New().String() err := applyProductSyncScope(&opt, ProductSyncScope{ Limit: 50, Status: "Completed", Category: " Lamps ", ProductIDs: []string{id, id, " "}, }) if err != nil { t.Fatal(err) } if opt.SyncLimit != 50 { t.Fatalf("limit=%d", opt.SyncLimit) } if opt.SyncFilterStatus != "completed" { t.Fatalf("status=%q", opt.SyncFilterStatus) } if opt.SyncFilterCategory != "Lamps" { t.Fatalf("category=%q", opt.SyncFilterCategory) } if len(opt.SyncOnlyIDs) != 1 || opt.SyncOnlyIDs[0] != id { t.Fatalf("ids=%v", opt.SyncOnlyIDs) } err = applyProductSyncScope(&opt, ProductSyncScope{Status: "nope"}) if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("want ErrInvalidSyncScope, got %v", err) } err = applyProductSyncScope(&opt, ProductSyncScope{Limit: maxSyncLimit + 1}) if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("want ErrInvalidSyncScope for limit, got %v", err) } err = applyProductSyncScope(&opt, ProductSyncScope{ProductIDs: []string{"not-a-uuid"}}) if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("want ErrInvalidSyncScope for ids, got %v", err) } err = applyProductSyncScope(&opt, ProductSyncScope{Category: strings.Repeat("c", maxCategoryFilterLen+1)}) if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("want ErrInvalidSyncScope for category length, got %v", err) } tooMany := make([]string, maxSyncOnlyIDs+1) for i := range tooMany { tooMany[i] = uuid.New().String() } err = applyProductSyncScope(&opt, ProductSyncScope{ProductIDs: tooMany}) if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("want ErrInvalidSyncScope for product_ids max, got %v", err) } err = applyProductSyncScope(&opt, ProductSyncScope{}) if err != nil { t.Fatal(err) } if opt.SyncFilterStatus != "" || opt.SyncFilterCategory != "" || len(opt.SyncOnlyIDs) != 0 { t.Fatalf("empty scope should clear one-shot filters: %#v", opt) } if opt.SyncLimit != 50 { t.Fatalf("empty scope should keep prior sync_limit preference; got %d", opt.SyncLimit) } } func TestNormalizeSyncFilterStatus(t *testing.T) { got, err := normalizeSyncFilterStatus(" needs_review ") if err != nil || got != "needs_review" { t.Fatalf("got=%q err=%v", got, err) } _, err = normalizeSyncFilterStatus("draft") if !errors.Is(err, ErrInvalidSyncScope) { t.Fatalf("err=%v", err) } if !strings.Contains(err.Error(), "invalid status") { t.Fatalf("msg=%q", err.Error()) } }