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  }