github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/api/util/page_test.go (about) 1 package util 2 3 import ( 4 "fmt" 5 "net/http/httptest" 6 "strconv" 7 "testing" 8 ) 9 10 func TestPageFromRequest(t *testing.T) { 11 cases := []struct { 12 description string 13 queries map[string]int 14 expNumber, expSize int 15 }{ 16 {"no page or pageSize params", map[string]int{}, 1, DefaultPageSize}, 17 {"negative ints for page and pageSize params", map[string]int{"page": -1, "pageSize": -1}, 1, DefaultPageSize}, 18 {"no pageSize param", map[string]int{"page": 2}, 2, DefaultPageSize}, 19 {"no page param", map[string]int{"pageSize": 25}, 1, 25}, 20 {"happy path", map[string]int{"page": 5, "pageSize": 30}, 5, 30}, 21 } 22 23 for _, c := range cases { 24 r := httptest.NewRequest("GET", "/", nil) 25 q := r.URL.Query() 26 // add query params 27 for key, val := range c.queries { 28 q.Set(key, strconv.Itoa(val)) 29 } 30 r.URL.RawQuery = q.Encode() 31 32 got := PageFromRequest(r) 33 if c.expNumber != got.Number { 34 t.Errorf("case '%s' error: number mismatch, expected '%d', got '%d'", c.description, c.expNumber, got.Number) 35 } 36 if c.expSize != got.Size { 37 t.Errorf("case '%s' error: size mismatch, expected '%d', got '%d'", c.description, c.expSize, got.Size) 38 } 39 } 40 41 } 42 43 func TestNewPageFromLimitAndOffset(t *testing.T) { 44 cases := []struct { 45 description string 46 offset, limit, expNumber, expSize int 47 }{ 48 {"offset and limit 0", 0, 0, 1, DefaultPageSize}, 49 {"offset and limit negative", -1, -1, 1, DefaultPageSize}, 50 {"offset and limit happy path", 150, 25, 7, 25}, 51 {"offset and limit offset not multiple of limit", 90, 25, 4, 25}, 52 {"offset and limit larger limit then offset", 25, 150, 1, 150}, 53 } 54 55 for _, c := range cases { 56 got := NewPageFromOffsetAndLimit(c.offset, c.limit) 57 if c.expNumber != got.Number { 58 t.Errorf("case '%s' error: number mismatch, expected '%d', got '%d'", c.description, c.expNumber, got.Number) 59 } 60 if c.expSize != got.Size { 61 t.Errorf("case '%s' error: size mismatch, expected '%d', got '%d'", c.description, c.expSize, got.Size) 62 } 63 } 64 } 65 66 func TestNextPageExists(t *testing.T) { 67 cases := []struct { 68 number, size, resultCount int 69 expect bool 70 }{ 71 {1, 50, 0, true}, 72 {1, 50, 51, true}, 73 {1, 50, 50, false}, 74 {1, 50, 35, false}, 75 } 76 77 for _, c := range cases { 78 t.Run(fmt.Sprintf("num_%d_size_%d_count_%d=%t", c.number, c.size, c.resultCount, c.expect), func(t *testing.T) { 79 p := Page{Number: c.number, Size: c.size, ResultCount: c.resultCount} 80 got := p.NextPageExists() 81 if c.expect != got { 82 t.Errorf("result mismatch. expected: %t got: %t", c.expect, got) 83 } 84 }) 85 } 86 } 87 88 func TestPrevPageExists(t *testing.T) { 89 for _, num := range []int{2, 3, 4} { 90 p := Page{Number: num} 91 if !p.PrevPageExists() { 92 t.Errorf("expected true for %d value, got false", num) 93 } 94 } 95 96 for _, num := range []int{-1, 0, -20} { 97 p := Page{Number: num} 98 if p.PrevPageExists() { 99 t.Errorf("expected false for %d value, got true", num) 100 } 101 } 102 }