| package entcursor_test |
|
|
| import ( |
| "context" |
| "testing" |
| "time" |
|
|
| "github.com/stretchr/testify/assert" |
| "github.com/stretchr/testify/require" |
|
|
| "github.com/openmeterio/openmeter/openmeter/testutils" |
| "github.com/openmeterio/openmeter/pkg/framework/entutils/testutils/ent1/db" |
| db_example "github.com/openmeterio/openmeter/pkg/framework/entutils/testutils/ent1/db/example1" |
| pagination "github.com/openmeterio/openmeter/pkg/pagination/v2" |
| ) |
|
|
| func TestCursor(t *testing.T) { |
| |
| driver := testutils.InitPostgresDB(t, testutils.PostgresDBStateEmpty) |
| defer driver.PGDriver.Close() |
|
|
| |
| dbClient := db.NewClient(db.Driver(driver.EntDriver.Driver())) |
| defer dbClient.Close() |
|
|
| if err := dbClient.Schema.Create(context.Background()); err != nil { |
| t.Fatalf("failed to migrate database %s", err) |
| } |
|
|
| ctx := context.Background() |
| baseTime := time.Date(2026, 2, 10, 13, 0, 0, 0, time.UTC) |
|
|
| _, err := dbClient.Example1.Create().SetID("001").SetExampleValue1("v1").SetCreatedAt(baseTime).Save(ctx) |
| require.NoError(t, err) |
| _, err = dbClient.Example1.Create().SetID("002").SetExampleValue1("v2").SetCreatedAt(baseTime).Save(ctx) |
| require.NoError(t, err) |
| _, err = dbClient.Example1.Create().SetID("003").SetExampleValue1("v3").SetCreatedAt(baseTime.Add(time.Second)).Save(ctx) |
| require.NoError(t, err) |
|
|
| t.Run("Returns first page and next cursor", func(t *testing.T) { |
| res, err := dbClient.Example1.Query().Limit(2).Cursor(ctx, nil) |
| require.NoError(t, err) |
|
|
| require.Len(t, res.Items, 2) |
| assert.Equal(t, "001", res.Items[0].ID) |
| assert.Equal(t, "002", res.Items[1].ID) |
| require.NotNil(t, res.NextCursor) |
| assert.Equal(t, baseTime, res.NextCursor.Time) |
| assert.Equal(t, "002", res.NextCursor.ID) |
| }) |
|
|
| t.Run("Applies cursor and returns next page", func(t *testing.T) { |
| firstPage, err := dbClient.Example1.Query().Limit(2).Cursor(ctx, nil) |
| require.NoError(t, err) |
| require.NotNil(t, firstPage.NextCursor) |
|
|
| secondPage, err := dbClient.Example1.Query().Limit(2).Cursor(ctx, firstPage.NextCursor) |
| require.NoError(t, err) |
|
|
| require.Len(t, secondPage.Items, 1) |
| assert.Equal(t, "003", secondPage.Items[0].ID) |
| require.NotNil(t, secondPage.NextCursor) |
| assert.Equal(t, "003", secondPage.NextCursor.ID) |
| }) |
|
|
| t.Run("Returns validation error for invalid cursor", func(t *testing.T) { |
| _, err := dbClient.Example1.Query().Limit(2).Cursor(ctx, &pagination.Cursor{}) |
| require.Error(t, err) |
| assert.Contains(t, err.Error(), "invalid cursor") |
| }) |
|
|
| t.Run("Returns empty items for empty result", func(t *testing.T) { |
| res, err := dbClient.Example1.Query().Where(db_example.ID("not-found")).Cursor(ctx, nil) |
| require.NoError(t, err) |
| require.NotNil(t, res.Items) |
| assert.Len(t, res.Items, 0) |
| assert.Nil(t, res.NextCursor) |
| }) |
| } |
|
|