pagination_test.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package pagination
  2. import "testing"
  3. func TestNormalizeSortOrder(t *testing.T) {
  4. t.Parallel()
  5. tests := []struct {
  6. name string
  7. input string
  8. defaultOrder string
  9. want string
  10. }{
  11. {name: "asc", input: "asc", defaultOrder: "desc", want: "asc"},
  12. {name: "uppercase asc", input: "ASC", defaultOrder: "desc", want: "asc"},
  13. {name: "desc", input: "desc", defaultOrder: "asc", want: "desc"},
  14. {name: "trim spaces", input: " desc ", defaultOrder: "asc", want: "desc"},
  15. {name: "invalid falls back", input: "sideways", defaultOrder: "asc", want: "asc"},
  16. {name: "empty falls back", input: "", defaultOrder: "desc", want: "desc"},
  17. {name: "invalid default falls back to desc", input: "", defaultOrder: "wat", want: "desc"},
  18. }
  19. for _, tt := range tests {
  20. t.Run(tt.name, func(t *testing.T) {
  21. t.Parallel()
  22. if got := NormalizeSortOrder(tt.input, tt.defaultOrder); got != tt.want {
  23. t.Fatalf("NormalizeSortOrder(%q, %q) = %q, want %q", tt.input, tt.defaultOrder, got, tt.want)
  24. }
  25. })
  26. }
  27. }
  28. func TestPaginationParamsNormalizedSortOrder(t *testing.T) {
  29. t.Parallel()
  30. params := PaginationParams{SortOrder: "ASC"}
  31. if got := params.NormalizedSortOrder("desc"); got != "asc" {
  32. t.Fatalf("NormalizedSortOrder = %q, want asc", got)
  33. }
  34. params = PaginationParams{SortOrder: "bad"}
  35. if got := params.NormalizedSortOrder("asc"); got != "asc" {
  36. t.Fatalf("NormalizedSortOrder invalid fallback = %q, want asc", got)
  37. }
  38. }
  39. func TestPaginationParamsLimit(t *testing.T) {
  40. t.Parallel()
  41. tests := []struct {
  42. name string
  43. pageSize int
  44. want int
  45. }{
  46. {name: "non-positive falls back to default", pageSize: 0, want: 20},
  47. {name: "negative falls back to default", pageSize: -1, want: 20},
  48. {name: "normal value keeps", pageSize: 50, want: 50},
  49. {name: "max value keeps", pageSize: 1000, want: 1000},
  50. {name: "beyond max clamps to 1000", pageSize: 1500, want: 1000},
  51. }
  52. for _, tt := range tests {
  53. t.Run(tt.name, func(t *testing.T) {
  54. t.Parallel()
  55. p := PaginationParams{PageSize: tt.pageSize}
  56. if got := p.Limit(); got != tt.want {
  57. t.Fatalf("Limit() for PageSize=%d = %d, want %d", tt.pageSize, got, tt.want)
  58. }
  59. })
  60. }
  61. }
  62. func TestPaginationParamsOffsetUsesNormalizedLimit(t *testing.T) {
  63. t.Parallel()
  64. tests := []struct {
  65. name string
  66. page int
  67. pageSize int
  68. want int
  69. }{
  70. {name: "invalid page uses first page", page: 0, pageSize: 50, want: 0},
  71. {name: "zero page size uses default", page: 2, pageSize: 0, want: 20},
  72. {name: "negative page size uses default", page: 2, pageSize: -1, want: 20},
  73. {name: "normal values", page: 3, pageSize: 50, want: 100},
  74. {name: "page size beyond max is clamped", page: 2, pageSize: 1500, want: 1000},
  75. }
  76. for _, tt := range tests {
  77. t.Run(tt.name, func(t *testing.T) {
  78. t.Parallel()
  79. params := PaginationParams{Page: tt.page, PageSize: tt.pageSize}
  80. if got := params.Offset(); got != tt.want {
  81. t.Fatalf("Offset() for Page=%d, PageSize=%d = %d, want %d", tt.page, tt.pageSize, got, tt.want)
  82. }
  83. })
  84. }
  85. }