github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/pagination/testing/linked_test.go (about)

     1  package testing
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"testing"
     7  
     8  	"github.com/opentelekomcloud/gophertelekomcloud/pagination"
     9  	th "github.com/opentelekomcloud/gophertelekomcloud/testhelper"
    10  )
    11  
    12  // LinkedPager sample and test cases.
    13  
    14  type LinkedPageResult struct {
    15  	pagination.LinkedPageBase
    16  }
    17  
    18  func (r LinkedPageResult) IsEmpty() (bool, error) {
    19  	is, err := ExtractLinkedInts(r)
    20  	return len(is) == 0, err
    21  }
    22  
    23  func ExtractLinkedInts(r pagination.Page) ([]int, error) {
    24  	var s struct {
    25  		Ints []int `json:"ints"`
    26  	}
    27  	err := (r.(LinkedPageResult)).ExtractInto(&s)
    28  	return s.Ints, err
    29  }
    30  
    31  func createLinked() pagination.Pager {
    32  	th.SetupHTTP()
    33  
    34  	th.Mux.HandleFunc("/page1", func(w http.ResponseWriter, r *http.Request) {
    35  		w.Header().Add("Content-Type", "application/json")
    36  		_, _ = fmt.Fprintf(w, `{ "ints": [1, 2, 3], "links": { "next": "%s/page2" } }`, th.Server.URL)
    37  	})
    38  
    39  	th.Mux.HandleFunc("/page2", func(w http.ResponseWriter, r *http.Request) {
    40  		w.Header().Add("Content-Type", "application/json")
    41  		_, _ = fmt.Fprintf(w, `{ "ints": [4, 5, 6], "links": { "next": "%s/page3" } }`, th.Server.URL)
    42  	})
    43  
    44  	th.Mux.HandleFunc("/page3", func(w http.ResponseWriter, r *http.Request) {
    45  		w.Header().Add("Content-Type", "application/json")
    46  		_, _ = fmt.Fprint(w, `{ "ints": [7, 8, 9], "links": { "next": null } }`)
    47  	})
    48  
    49  	client := createClient()
    50  
    51  	createPage := func(r pagination.PageResult) pagination.Page {
    52  		return LinkedPageResult{pagination.LinkedPageBase{PageResult: r}}
    53  	}
    54  
    55  	return pagination.NewPager(client, th.Server.URL+"/page1", createPage)
    56  }
    57  
    58  func TestEnumerateLinked(t *testing.T) {
    59  	pager := createLinked()
    60  	defer th.TeardownHTTP()
    61  
    62  	callCount := 0
    63  	err := pager.EachPage(func(page pagination.Page) (bool, error) {
    64  		actual, err := ExtractLinkedInts(page)
    65  		if err != nil {
    66  			return false, err
    67  		}
    68  
    69  		t.Logf("Handler invoked with %v", actual)
    70  
    71  		var expected []int
    72  		switch callCount {
    73  		case 0:
    74  			expected = []int{1, 2, 3}
    75  		case 1:
    76  			expected = []int{4, 5, 6}
    77  		case 2:
    78  			expected = []int{7, 8, 9}
    79  		default:
    80  			t.Fatalf("Unexpected call count: %d", callCount)
    81  			return false, nil
    82  		}
    83  
    84  		th.AssertDeepEquals(t, expected, actual)
    85  		callCount++
    86  		return true, nil
    87  	})
    88  	th.AssertNoErr(t, err)
    89  	th.AssertEquals(t, 3, callCount)
    90  }
    91  
    92  func TestAllPagesLinked(t *testing.T) {
    93  	pager := createLinked()
    94  	defer th.TeardownHTTP()
    95  
    96  	page, err := pager.AllPages()
    97  	th.AssertNoErr(t, err)
    98  
    99  	expected := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
   100  	actual, err := ExtractLinkedInts(page)
   101  	th.AssertNoErr(t, err)
   102  	th.CheckDeepEquals(t, expected, actual)
   103  }