github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/params_test.go (about)

     1  package golangsdk
     2  
     3  import (
     4  	"net/url"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestBuildURL(t *testing.T) {
    12  	type testCase struct {
    13  		Name        string
    14  		isFail      bool
    15  		Endpoints   []string
    16  		QueryParams interface{}
    17  	}
    18  
    19  	type network struct {
    20  		Name      string `q:"display_name"`
    21  		Status    string `q:"status"`
    22  		NetworkID string `q:"network_id"`
    23  	}
    24  
    25  	type empty struct{}
    26  
    27  	type withoutTags struct {
    28  		Name string
    29  	}
    30  
    31  	cases := []testCase{
    32  		{
    33  			Name:        "positive case without query parameters",
    34  			Endpoints:   []string{"servers"},
    35  			QueryParams: nil,
    36  		},
    37  		{
    38  			Name:      "positive case with query parameters",
    39  			Endpoints: []string{"servers", "network"},
    40  			QueryParams: &network{
    41  				Name:      "network_name",
    42  				Status:    "active",
    43  				NetworkID: "7bf9e4a9-fab1-4415-a6f7-ff7284ee1870",
    44  			},
    45  		},
    46  		{
    47  			Name:        "positive case with empty struct, without query parameters",
    48  			Endpoints:   []string{"servers", "network"},
    49  			QueryParams: &empty{},
    50  		},
    51  		{
    52  			Name:        "positive case with struct without query tags",
    53  			Endpoints:   []string{"servers", "network"},
    54  			QueryParams: &withoutTags{Name: "anyname"},
    55  		},
    56  		{
    57  			Name:      "negative case with slash '/' in the endpoint name",
    58  			isFail:    true,
    59  			Endpoints: []string{"servers/"},
    60  		},
    61  		{
    62  			Name:        "negative case with slash '/' in the second endpoint name",
    63  			isFail:      true,
    64  			Endpoints:   []string{"servers", "/asdf/"},
    65  			QueryParams: nil,
    66  		},
    67  		{
    68  			Name:        "negative case with characters ' /!?$#=&+_\"' ' in the second endpoint name",
    69  			isFail:      true,
    70  			Endpoints:   []string{"servers", "/!?$#=&+_\"'"},
    71  			QueryParams: nil,
    72  		},
    73  		{
    74  			Name:        "negative case then query params is not a struct",
    75  			isFail:      true,
    76  			Endpoints:   []string{"servers", "network"},
    77  			QueryParams: "anystring",
    78  		},
    79  	}
    80  
    81  	for _, c := range cases {
    82  		t.Log("starting test case:", c.Name)
    83  		u, err := NewURLBuilder().WithEndpoints(c.Endpoints...).WithQueryParams(c.QueryParams).Build()
    84  
    85  		if c.isFail {
    86  			assert.Error(t, err)
    87  			continue
    88  		}
    89  
    90  		assert.NoError(t, err)
    91  
    92  		uObj, err := url.Parse(u.String())
    93  		assert.NoError(t, err)
    94  
    95  		assert.Equal(t, strings.Join(c.Endpoints, "/"), uObj.Path)
    96  
    97  		if c.QueryParams == nil {
    98  			continue
    99  		}
   100  
   101  		if c.Name == "positive case with struct without query tags" ||
   102  			c.Name == "positive case with empty struct, without query parameters" {
   103  			q := uObj.Query()
   104  			assert.Equal(t, 0, len(q))
   105  			continue
   106  		}
   107  
   108  		assert.Equal(t, true, uObj.Query().Has("display_name"))
   109  		assert.Equal(t, "network_name", uObj.Query().Get("display_name"))
   110  
   111  		assert.Equal(t, true, uObj.Query().Has("status"))
   112  		assert.Equal(t, "active", uObj.Query().Get("status"))
   113  
   114  		assert.Equal(t, true, uObj.Query().Has("network_id"))
   115  		assert.Equal(t, "7bf9e4a9-fab1-4415-a6f7-ff7284ee1870", uObj.Query().Get("network_id"))
   116  	}
   117  
   118  }