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 }