package mongo import ( "strings" "testing" "go.mongodb.org/mongo-driver/v2/bson" ) func TestEncodeDecodePageCursor(t *testing.T) { encoded, err := encodePageCursor("created_at", -1, int64(1700000000), "507f1f77bcf86cd799439011", "abc123", 10) if err != nil { t.Fatalf("encode: %v", err) } if strings.Contains(encoded, "+") || strings.Contains(encoded, "/") { t.Fatalf("expected URL-safe cursor, got %q", encoded) } decoded, err := decodePageCursor(encoded) if err != nil { t.Fatalf("decode: %v", err) } if decoded.SortField != "created_at" || decoded.SortOrder != -1 { t.Fatalf("unexpected sort: %+v", decoded) } if decoded.FiltersHash != "abc123" || decoded.PageOffset != 10 { t.Fatalf("unexpected metadata: %+v", decoded) } } func TestBuildListPaginationCursorAndOffsetConflict(t *testing.T) { _, err := BuildListPagination(10, 5, "cursor-token", "created_at", "desc", bson.M{}, ListPaginationOptions{}) if err == nil { t.Fatal("expected error when cursor and offset are both set") } } func TestBuildListPaginationOffsetMode(t *testing.T) { p, err := BuildListPagination(10, 20, "", "created_at", "desc", bson.M{"status": "active"}, ListPaginationOptions{}) if err != nil { t.Fatalf("build: %v", err) } if p.Skip != 20 || p.Limit != 10 || p.Cursor != "" { t.Fatalf("unexpected pagination: %+v", p) } } func TestHashFilterStable(t *testing.T) { a := HashFilter(bson.M{"status": "active"}) b := HashFilter(bson.M{"status": "active"}) if a == "" || a != b { t.Fatalf("expected stable non-empty hash, got %q and %q", a, b) } } func TestDocumentSortValueNestedField(t *testing.T) { doc := bson.M{ "_id": bson.NewObjectID(), "address": bson.M{ "country": "US", "state": "NY", }, } country, err := documentSortValue(doc, "address.country") if err != nil { t.Fatalf("address.country: %v", err) } if country != "US" { t.Fatalf("expected US, got %v", country) } state, err := documentSortValue(doc, "address.state") if err != nil { t.Fatalf("address.state: %v", err) } if state != "NY" { t.Fatalf("expected NY, got %v", state) } }