blob: f0ea296384ba44c579f135883e89d5058169cbfe [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package response
import (
"encoding/json"
"testing"
)
func prettyJSON(o interface{}) (string, error) {
bytes, err := json.MarshalIndent(o, "", "\t")
if err != nil {
return "", err
}
return string(bytes), nil
}
func TestNewPaginationMeta(t *testing.T) {
type args struct {
offset int
limit int
hasMore bool
currentURL string
}
tests := []struct {
name string
args args
wantJSON string
}{
{
name: "first page",
args: args{0, 10, true, "http://foo.com/v1/bar"},
wantJSON: `{
"limit": 10,
"current_offset": 0,
"next_offset": 10,
"next_url": "http://foo.com/v1/bar?offset=10"
}`,
},
{
name: "second page",
args: args{10, 10, true, "http://foo.com/v1/bar"},
wantJSON: `{
"limit": 10,
"current_offset": 10,
"next_offset": 20,
"prev_offset": 0,
"next_url": "http://foo.com/v1/bar?offset=20",
"prev_url": "http://foo.com/v1/bar"
}`,
},
{
name: "last page",
args: args{40, 10, false, "http://foo.com/v1/bar"},
wantJSON: `{
"limit": 10,
"current_offset": 40,
"prev_offset": 30,
"prev_url": "http://foo.com/v1/bar?offset=30"
}`,
},
{
name: "misaligned start ending exactly on boundary",
args: args{32, 10, false, "http://foo.com/v1/bar"},
wantJSON: `{
"limit": 10,
"current_offset": 32,
"prev_offset": 22,
"prev_url": "http://foo.com/v1/bar?offset=22"
}`,
},
{
name: "misaligned start partially through first page",
args: args{5, 12, true, "http://foo.com/v1/bar"},
wantJSON: `{
"limit": 12,
"current_offset": 5,
"next_offset": 17,
"prev_offset": 0,
"next_url": "http://foo.com/v1/bar?offset=17",
"prev_url": "http://foo.com/v1/bar"
}`,
},
{
name: "no current URL",
args: args{10, 10, true, ""},
wantJSON: `{
"limit": 10,
"current_offset": 10,
"next_offset": 20,
"prev_offset": 0
}`,
},
{
name: "#58 regression test",
args: args{1, 3, true, ""},
wantJSON: `{
"limit": 3,
"current_offset": 1,
"next_offset": 4,
"prev_offset": 0
}`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := NewPaginationMeta(tt.args.offset, tt.args.limit, tt.args.hasMore,
tt.args.currentURL)
gotJSON, err := prettyJSON(got)
if err != nil {
t.Fatalf("failed to marshal PaginationMeta to JSON: %s", err)
}
if gotJSON != tt.wantJSON {
// prettyJSON makes debugging easier due to the annoying pointer-to-ints, but it
// also implicitly tests JSON marshalling as we can see if it's omitting fields etc.
t.Fatalf("NewPaginationMeta() =\n%s\n want:\n%s\n", gotJSON, tt.wantJSON)
}
})
}
}