|
7 | 7 | "testing" |
8 | 8 |
|
9 | 9 | sq "github.com/Masterminds/squirrel" |
| 10 | + "github.com/goware/pgkit/v2" |
10 | 11 | "github.com/jackc/pgx/v5" |
11 | 12 | "github.com/stretchr/testify/require" |
12 | 13 | ) |
@@ -195,6 +196,104 @@ func TestTable(t *testing.T) { |
195 | 196 | require.NoError(t, err, "SaveTx transaction failed") |
196 | 197 | }) |
197 | 198 |
|
| 199 | + t.Run("ListPaged", func(t *testing.T) { |
| 200 | + ctx := t.Context() |
| 201 | + |
| 202 | + account := &Account{Name: "ListPaged Account"} |
| 203 | + err := db.Accounts.Save(ctx, account) |
| 204 | + require.NoError(t, err) |
| 205 | + |
| 206 | + // Create 15 articles. |
| 207 | + for i := range 15 { |
| 208 | + err := db.Articles.Save(ctx, &Article{ |
| 209 | + AccountID: account.ID, |
| 210 | + Author: fmt.Sprintf("Author %02d", i), |
| 211 | + }) |
| 212 | + require.NoError(t, err) |
| 213 | + } |
| 214 | + |
| 215 | + // Default paginator (page size 10). |
| 216 | + page := pgkit.NewPage(0, 1) |
| 217 | + results, retPage, err := db.Articles.ListPaged(ctx, sq.Eq{"account_id": account.ID}, page) |
| 218 | + require.NoError(t, err) |
| 219 | + require.Len(t, results, 10) |
| 220 | + require.True(t, retPage.More, "should have more pages") |
| 221 | + |
| 222 | + // Second page. |
| 223 | + page2 := pgkit.NewPage(0, 2) |
| 224 | + results2, retPage2, err := db.Articles.ListPaged(ctx, sq.Eq{"account_id": account.ID}, page2) |
| 225 | + require.NoError(t, err) |
| 226 | + require.Len(t, results2, 5) |
| 227 | + require.False(t, retPage2.More, "should not have more pages") |
| 228 | + |
| 229 | + // No overlap between pages. |
| 230 | + for _, r1 := range results { |
| 231 | + for _, r2 := range results2 { |
| 232 | + require.NotEqual(t, r1.ID, r2.ID, "pages should not overlap") |
| 233 | + } |
| 234 | + } |
| 235 | + }) |
| 236 | + |
| 237 | + t.Run("WithPaginator", func(t *testing.T) { |
| 238 | + ctx := t.Context() |
| 239 | + |
| 240 | + account := &Account{Name: "WithPaginator Account"} |
| 241 | + err := db.Accounts.Save(ctx, account) |
| 242 | + require.NoError(t, err) |
| 243 | + |
| 244 | + for i := range 10 { |
| 245 | + err := db.Articles.Save(ctx, &Article{ |
| 246 | + AccountID: account.ID, |
| 247 | + Author: fmt.Sprintf("PagAuthor %02d", i), |
| 248 | + }) |
| 249 | + require.NoError(t, err) |
| 250 | + } |
| 251 | + |
| 252 | + // Use a custom paginator with page size 3. |
| 253 | + pagedTable := db.Articles.Table.WithPaginator(pgkit.WithDefaultSize(3), pgkit.WithMaxSize(5)) |
| 254 | + |
| 255 | + page := pgkit.NewPage(0, 1) |
| 256 | + results, retPage, err := pagedTable.ListPaged(ctx, sq.Eq{"account_id": account.ID}, page) |
| 257 | + require.NoError(t, err) |
| 258 | + require.Len(t, results, 3, "should return 3 records with custom paginator") |
| 259 | + require.True(t, retPage.More) |
| 260 | + |
| 261 | + // Request size larger than max should be capped. |
| 262 | + bigPage := pgkit.NewPage(100, 1) |
| 263 | + results, _, err = pagedTable.ListPaged(ctx, sq.Eq{"account_id": account.ID}, bigPage) |
| 264 | + require.NoError(t, err) |
| 265 | + require.Len(t, results, 5, "should be capped at max size 5") |
| 266 | + }) |
| 267 | + |
| 268 | + t.Run("WithTx preserves Paginator", func(t *testing.T) { |
| 269 | + ctx := t.Context() |
| 270 | + |
| 271 | + account := &Account{Name: "WithTx Paginator Account"} |
| 272 | + err := db.Accounts.Save(ctx, account) |
| 273 | + require.NoError(t, err) |
| 274 | + |
| 275 | + for i := range 5 { |
| 276 | + err := db.Articles.Save(ctx, &Article{ |
| 277 | + AccountID: account.ID, |
| 278 | + Author: fmt.Sprintf("TxPag %02d", i), |
| 279 | + }) |
| 280 | + require.NoError(t, err) |
| 281 | + } |
| 282 | + |
| 283 | + pagedTable := db.Articles.Table.WithPaginator(pgkit.WithDefaultSize(2)) |
| 284 | + |
| 285 | + err = pgx.BeginFunc(ctx, db.Conn, func(pgTx pgx.Tx) error { |
| 286 | + txTable := pagedTable.WithTx(pgTx) |
| 287 | + page := pgkit.NewPage(0, 1) |
| 288 | + results, retPage, err := txTable.ListPaged(ctx, sq.Eq{"account_id": account.ID}, page) |
| 289 | + require.NoError(t, err) |
| 290 | + require.Len(t, results, 2, "paginator should be preserved through WithTx") |
| 291 | + require.True(t, retPage.More) |
| 292 | + return nil |
| 293 | + }) |
| 294 | + require.NoError(t, err) |
| 295 | + }) |
| 296 | + |
198 | 297 | t.Run("WithTx keeps IDColumn", func(t *testing.T) { |
199 | 298 | ctx := t.Context() |
200 | 299 |
|
|
0 commit comments