package creator import ( "fmt" "reflect" "testing" "time" ) func TestEventAggregationOccurrenceOrderBeforePagination(t *testing.T) { store, accounts, ctx := openCreatorIntegrationStore(t) id := createIntegrationAccount(t, ctx, accounts, fmt.Sprint(time.Now().UnixNano())) profile, err := store.GetAccountProfile(ctx, id) if err != nil { t.Fatal(err) } if _, err := store.RecordVerifiedLoginResult(ctx, id, profile.PlatformAccountKey); err != nil { t.Fatal(err) } state, err := store.SetListenerEnabled(ctx, id, true) if err != nil { t.Fatal(err) } // Old platform times with fresh receipt times keep the receipt-time filter independent. newest := time.Now().UTC().Add(-30 * time.Hour) tied := newest.Add(-10 * time.Hour) oldest := tied.Add(-10 * time.Hour) deliveries := []ListenerDelivery{ {DeliveryID: "newest", Kind: "notice", Notice: &ListenerNotice{EventKey: "newest", EventType: "comment", PlatformEventAt: &newest}}, {DeliveryID: "missing-first", Kind: "notice", Notice: &ListenerNotice{EventKey: "missing-first", EventType: "like"}}, {DeliveryID: "oldest", Kind: "notice", Notice: &ListenerNotice{EventKey: "oldest", EventType: "like", PlatformEventAt: &oldest}}, {DeliveryID: "tie-first", Kind: "notice", Notice: &ListenerNotice{EventKey: "tie-first", EventType: "comment", PlatformEventAt: &tied}}, {DeliveryID: "tie-second", Kind: "notice", Notice: &ListenerNotice{EventKey: "tie-second", EventType: "like", PlatformEventAt: &tied}}, {DeliveryID: "missing-second", Kind: "notice", Notice: &ListenerNotice{EventKey: "missing-second", EventType: "like"}}, } if err := store.RecordListenerDeliveries(ctx, id, state.Generation, deliveries); err != nil { t.Fatal(err) } want := []string{"newest", "tie-second", "tie-first", "oldest", "missing-second", "missing-first"} for pass := 0; pass < 2; pass++ { var got []string for pageNumber := 1; pageNumber <= 3; pageNumber++ { page, err := store.ListAggregatedEventsPage(ctx, EventAggregationFilter{}, pageNumber, 2) if err != nil { t.Fatal(err) } if page.Total != len(want) || len(page.Data) != 2 || page.HasNext != (pageNumber < 3) { t.Fatalf("page %d: %+v", pageNumber, page) } for _, event := range page.Data { got = append(got, event.EventKey) if event.EventKey == "missing-first" || event.EventKey == "missing-second" { if event.PlatformEventAt != nil { t.Fatalf("missing occurrence time was fabricated: %+v", event) } } } } if !reflect.DeepEqual(got, want) { t.Fatalf("occurrence order across pages: got %v, want %v", got, want) } } filtered, err := store.ListAggregatedEventsPage(ctx, EventAggregationFilter{AccountID: id, EventType: "comment", Hours: 1}, 1, 1) if err != nil { t.Fatal(err) } if filtered.Total != 2 || len(filtered.Data) != 1 || filtered.Data[0].EventKey != "newest" || !filtered.HasNext { t.Fatalf("receipt-time filter and order before pagination: %+v", filtered) } }