github.com/hashicorp/terraform-plugin-sdk@v1.17.2/internal/registry/response/pagination_test.go (about) 1 package response 2 3 import ( 4 "encoding/json" 5 "testing" 6 ) 7 8 func prettyJSON(o interface{}) (string, error) { 9 bytes, err := json.MarshalIndent(o, "", "\t") 10 if err != nil { 11 return "", err 12 } 13 return string(bytes), nil 14 } 15 16 func TestNewPaginationMeta(t *testing.T) { 17 type args struct { 18 offset int 19 limit int 20 hasMore bool 21 currentURL string 22 } 23 tests := []struct { 24 name string 25 args args 26 wantJSON string 27 }{ 28 { 29 name: "first page", 30 args: args{0, 10, true, "http://foo.com/v1/bar"}, 31 wantJSON: `{ 32 "limit": 10, 33 "current_offset": 0, 34 "next_offset": 10, 35 "next_url": "http://foo.com/v1/bar?offset=10" 36 }`, 37 }, 38 { 39 name: "second page", 40 args: args{10, 10, true, "http://foo.com/v1/bar"}, 41 wantJSON: `{ 42 "limit": 10, 43 "current_offset": 10, 44 "next_offset": 20, 45 "prev_offset": 0, 46 "next_url": "http://foo.com/v1/bar?offset=20", 47 "prev_url": "http://foo.com/v1/bar" 48 }`, 49 }, 50 { 51 name: "last page", 52 args: args{40, 10, false, "http://foo.com/v1/bar"}, 53 wantJSON: `{ 54 "limit": 10, 55 "current_offset": 40, 56 "prev_offset": 30, 57 "prev_url": "http://foo.com/v1/bar?offset=30" 58 }`, 59 }, 60 { 61 name: "misaligned start ending exactly on boundary", 62 args: args{32, 10, false, "http://foo.com/v1/bar"}, 63 wantJSON: `{ 64 "limit": 10, 65 "current_offset": 32, 66 "prev_offset": 22, 67 "prev_url": "http://foo.com/v1/bar?offset=22" 68 }`, 69 }, 70 { 71 name: "misaligned start partially through first page", 72 args: args{5, 12, true, "http://foo.com/v1/bar"}, 73 wantJSON: `{ 74 "limit": 12, 75 "current_offset": 5, 76 "next_offset": 17, 77 "prev_offset": 0, 78 "next_url": "http://foo.com/v1/bar?offset=17", 79 "prev_url": "http://foo.com/v1/bar" 80 }`, 81 }, 82 { 83 name: "no current URL", 84 args: args{10, 10, true, ""}, 85 wantJSON: `{ 86 "limit": 10, 87 "current_offset": 10, 88 "next_offset": 20, 89 "prev_offset": 0 90 }`, 91 }, 92 { 93 name: "#58 regression test", 94 args: args{1, 3, true, ""}, 95 wantJSON: `{ 96 "limit": 3, 97 "current_offset": 1, 98 "next_offset": 4, 99 "prev_offset": 0 100 }`, 101 }, 102 } 103 for _, tt := range tests { 104 t.Run(tt.name, func(t *testing.T) { 105 got := NewPaginationMeta(tt.args.offset, tt.args.limit, tt.args.hasMore, 106 tt.args.currentURL) 107 gotJSON, err := prettyJSON(got) 108 if err != nil { 109 t.Fatalf("failed to marshal PaginationMeta to JSON: %s", err) 110 } 111 if gotJSON != tt.wantJSON { 112 // prettyJSON makes debugging easier due to the annoying pointer-to-ints, but it 113 // also implicitly tests JSON marshalling as we can see if it's omitting fields etc. 114 t.Fatalf("NewPaginationMeta() =\n%s\n want:\n%s\n", gotJSON, tt.wantJSON) 115 } 116 }) 117 } 118 }