depager_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package depager_test
  2. import (
  3. "fmt"
  4. "testing"
  5. dp "idio.link/go/depager/v2"
  6. )
  7. type NoopClient[T any] struct {
  8. err error
  9. pages []dp.Page[T]
  10. m int
  11. cnt uint64
  12. }
  13. func (c *NoopClient[T]) NextPage(
  14. _offset uint64,
  15. ) (page dp.Page[T], cnt uint64, err error) {
  16. if len(c.pages) == 0 {
  17. return
  18. }
  19. if c.m >= len(c.pages) {
  20. err = fmt.Errorf("client: next page: exceeded max pages")
  21. return
  22. }
  23. page = c.pages[c.m]
  24. cnt = c.cnt
  25. err = c.err
  26. c.m++
  27. return
  28. }
  29. func NewNoopClient[T any](
  30. cnt int,
  31. err error,
  32. pages []dp.Page[T],
  33. ) dp.Client[T] {
  34. return &NoopClient[T]{
  35. cnt: uint64(cnt),
  36. err: err,
  37. pages: pages,
  38. }
  39. }
  40. type Aggr[T any] []T
  41. func (a Aggr[T]) Elems() []T {
  42. return []T(a)
  43. }
  44. func TestUsingNoopClient(t *testing.T) {
  45. client := NewNoopClient[any](0, nil,
  46. []dp.Page[any]{
  47. Aggr[any]{},
  48. },
  49. )
  50. pager := dp.NewPager(client, 0)
  51. for range pager.Iter() {
  52. }
  53. if err := pager.LastErr(); err != nil {
  54. t.Errorf("unexpected error in pager with noop client: %v", err)
  55. }
  56. }
  57. func TestNoopClientReturnsError(t *testing.T) {
  58. client := NewNoopClient[any](0, fmt.Errorf("whomp"),
  59. []dp.Page[any]{
  60. Aggr[any]{},
  61. },
  62. )
  63. pager := dp.NewPager(client, 0)
  64. for range pager.Iter() {
  65. }
  66. if err := pager.LastErr(); err == nil {
  67. t.Errorf("unexpected success: %v", err)
  68. }
  69. }
  70. func TestClientReturnsNonemptyPage(t *testing.T) {
  71. pageSize := 2
  72. itemCount := 3
  73. client := NewNoopClient[any](itemCount, nil,
  74. []dp.Page[any]{
  75. Aggr[any]{1, 2},
  76. Aggr[any]{3},
  77. },
  78. )
  79. pager := dp.NewPager(client, uint64(pageSize))
  80. var elem int
  81. for e := range pager.Iter() {
  82. elem = e.(int)
  83. }
  84. if err := pager.LastErr(); err != nil {
  85. t.Errorf("unexpected error in pager: %v", err)
  86. }
  87. if elem != 3 {
  88. t.Errorf("unexpected value: '%v'", elem)
  89. }
  90. }
  91. func TestClientReturnsFewerPagesThanExpected(t *testing.T) {
  92. pageSize := 1
  93. itemCount := pageSize + 1
  94. client := NewNoopClient[any](itemCount, nil,
  95. []dp.Page[any]{
  96. Aggr[any]{0},
  97. },
  98. )
  99. pager := dp.NewPager(client, uint64(pageSize))
  100. for range pager.Iter() {
  101. }
  102. if err := pager.LastErr(); err == nil {
  103. t.Errorf("unexpected success in pager: %v", err)
  104. }
  105. }