acs_request_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package requests
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "sort"
  7. "testing"
  8. "time"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func Test_AcsRequest(t *testing.T) {
  12. r := defaultBaseRequest()
  13. assert.NotNil(t, r)
  14. // query params
  15. query := r.GetQueryParams()
  16. assert.Equal(t, 0, len(query))
  17. r.addQueryParam("key", "value")
  18. assert.Equal(t, 1, len(query))
  19. assert.Equal(t, "value", query["key"])
  20. // form params
  21. form := r.GetFormParams()
  22. assert.Equal(t, 0, len(form))
  23. r.addFormParam("key", "value")
  24. assert.Equal(t, 1, len(form))
  25. assert.Equal(t, "value", form["key"])
  26. // getter/setter for stringtosign
  27. assert.Equal(t, "", r.GetStringToSign())
  28. r.SetStringToSign("s2s")
  29. assert.Equal(t, "s2s", r.GetStringToSign())
  30. // content type
  31. _, contains := r.GetContentType()
  32. assert.False(t, contains)
  33. r.SetContentType("application/json")
  34. ct, contains := r.GetContentType()
  35. assert.Equal(t, "application/json", ct)
  36. assert.True(t, contains)
  37. // default 3 headers & content-type
  38. headers := r.GetHeaders()
  39. assert.Equal(t, 4, len(headers))
  40. r.addHeaderParam("x-key", "x-key-value")
  41. assert.Equal(t, 5, len(headers))
  42. assert.Equal(t, "x-key-value", headers["x-key"])
  43. // Version
  44. r.SetVersion("2017-06-06")
  45. assert.Equal(t, "2017-06-06", r.GetVersion())
  46. // GetActionName
  47. assert.Equal(t, "", r.GetActionName())
  48. // GetMethod
  49. assert.Equal(t, "GET", r.GetMethod())
  50. r.Method = "POST"
  51. assert.Equal(t, "POST", r.GetMethod())
  52. // Domain
  53. assert.Equal(t, "", r.GetDomain())
  54. r.SetDomain("ecs.aliyuncs.com")
  55. assert.Equal(t, "ecs.aliyuncs.com", r.GetDomain())
  56. // Region
  57. assert.Equal(t, "", r.GetRegionId())
  58. r.RegionId = "cn-hangzhou"
  59. assert.Equal(t, "cn-hangzhou", r.GetRegionId())
  60. // AcceptFormat
  61. assert.Equal(t, "JSON", r.GetAcceptFormat())
  62. r.AcceptFormat = "XML"
  63. assert.Equal(t, "XML", r.GetAcceptFormat())
  64. // GetLocationServiceCode
  65. assert.Equal(t, "", r.GetLocationServiceCode())
  66. // GetLocationEndpointType
  67. assert.Equal(t, "", r.GetLocationEndpointType())
  68. // GetProduct
  69. assert.Equal(t, "", r.GetProduct())
  70. // GetScheme
  71. assert.Equal(t, "", r.GetScheme())
  72. r.SetScheme("HTTPS")
  73. assert.Equal(t, "HTTPS", r.GetScheme())
  74. // GetReadTimeout
  75. assert.Equal(t, 0*time.Second, r.GetReadTimeout())
  76. r.SetReadTimeout(5 * time.Second)
  77. assert.Equal(t, 5*time.Second, r.GetReadTimeout())
  78. // GetConnectTimeout
  79. assert.Equal(t, 0*time.Second, r.GetConnectTimeout())
  80. r.SetConnectTimeout(5 * time.Second)
  81. assert.Equal(t, 5*time.Second, r.GetConnectTimeout())
  82. // GetHTTPSInsecure
  83. assert.True(t, r.GetHTTPSInsecure() == nil)
  84. r.SetHTTPSInsecure(true)
  85. assert.Equal(t, true, *r.GetHTTPSInsecure())
  86. // GetPort
  87. assert.Equal(t, "", r.GetPort())
  88. // GetUserAgent
  89. r.AppendUserAgent("cli", "1.01")
  90. assert.Equal(t, "1.01", r.GetUserAgent()["cli"])
  91. // GetUserAgent
  92. r.AppendUserAgent("cli", "2.02")
  93. assert.Equal(t, "2.02", r.GetUserAgent()["cli"])
  94. // Content
  95. assert.Equal(t, []byte(nil), r.GetContent())
  96. r.SetContent([]byte("The Content"))
  97. assert.True(t, bytes.Equal([]byte("The Content"), r.GetContent()))
  98. }
  99. type AcsRequestTest struct {
  100. *baseRequest
  101. Ontology AcsRequest
  102. Query string `position:"Query" name:"Query"`
  103. Header string `position:"Header" name:"Header"`
  104. Path string `position:"Path" name:"Path"`
  105. Body string `position:"Body" name:"Body"`
  106. Target map[string]interface{} `position:"Query" name:"Target"`
  107. TypeAcs *[]string `position:"type" name:"type" type:"Repeated"`
  108. }
  109. func (r AcsRequestTest) BuildQueries() string {
  110. return ""
  111. }
  112. func (r AcsRequestTest) BuildUrl() string {
  113. return ""
  114. }
  115. func (r AcsRequestTest) GetBodyReader() io.Reader {
  116. return nil
  117. }
  118. func (r AcsRequestTest) GetStyle() string {
  119. return ""
  120. }
  121. func (r AcsRequestTest) addPathParam(key, value string) {
  122. return
  123. }
  124. func Test_AcsRequest_InitParams(t *testing.T) {
  125. r := &AcsRequestTest{
  126. baseRequest: defaultBaseRequest(),
  127. Query: "query value",
  128. Header: "header value",
  129. Path: "path value",
  130. Body: "body value",
  131. Target: map[string]interface{}{
  132. "key": "test",
  133. "value": 1234,
  134. },
  135. }
  136. tmp := []string{r.Query, r.Header}
  137. r.TypeAcs = &tmp
  138. r.addQueryParam("qkey", "qvalue")
  139. InitParams(r)
  140. queries := r.GetQueryParams()
  141. assert.Equal(t, "query value", queries["Query"])
  142. assert.Equal(t, "{\"key\":\"test\",\"value\":1234}", queries["Target"])
  143. headers := r.GetHeaders()
  144. assert.Equal(t, "header value", headers["Header"])
  145. // TODO: check the body & path
  146. }
  147. // CreateContainerGroupRequest is the request struct for api CreateContainerGroup
  148. type CreateContainerGroupRequest struct {
  149. *RpcRequest
  150. OwnerId Integer `position:"Query" name:"OwnerId"`
  151. ResourceOwnerAccount string `position:"Query" name:"ResourceOwnerAccount"`
  152. Volume *[]CreateContainerGroupVolume `position:"Query" name:"Volume" type:"Repeated"`
  153. Memory Float `position:"Query" name:"Memory"`
  154. SlsEnable Boolean `position:"Query" name:"SlsEnable"`
  155. DnsConfig CreateContainerGroupDnsConfig `position:"Query" name:"DnsConfig" type:"Struct"`
  156. OptionJson map[string]interface{} `position:"Query" name:"OptionJson"`
  157. }
  158. type CreateContainerGroupVolume struct {
  159. Name string `name:"Name"`
  160. Type string `name:"Type"`
  161. NFSVolume CreateContainerGroupNFSVolume `name:"NFSVolume" type:"Struct"`
  162. }
  163. type CreateContainerGroupDnsConfig struct {
  164. NameServer []string `name:"NameServer"`
  165. Search []string `name:"Search"`
  166. Option *[]CreateContainerGroupOption `name:"Option" type:"Repeated"`
  167. }
  168. type CreateContainerGroupNFSVolume struct {
  169. Server string `name:"Server"`
  170. Path string `name:"Path"`
  171. ReadOnly Boolean `name:"ReadOnly"`
  172. Option CreateContainerGroupOption `name:"Option" type:"Struct"`
  173. }
  174. type CreateContainerGroupOption struct {
  175. Name string `name:"Name"`
  176. Value string `name:"Value"`
  177. }
  178. func GetQueryString(r *CreateContainerGroupRequest) string {
  179. queries := r.GetQueryParams()
  180. // To store the keys in slice in sorted order
  181. sortedKeys := make([]string, 0)
  182. for k := range queries {
  183. sortedKeys = append(sortedKeys, k)
  184. }
  185. sort.Strings(sortedKeys)
  186. // To perform the opertion you want
  187. resultBuilder := bytes.Buffer{}
  188. for _, key := range sortedKeys {
  189. resultBuilder.WriteString(key + "=" + queries[key] + "&")
  190. }
  191. return resultBuilder.String()
  192. }
  193. func InitRequest() (r *CreateContainerGroupRequest) {
  194. r = &CreateContainerGroupRequest{
  195. RpcRequest: &RpcRequest{},
  196. }
  197. r.InitWithApiInfo("Eci", "2018-08-08", "CreateContainerGroup", "eci", "openAPI")
  198. return
  199. }
  200. func Test_AcsRequest_InitParams2(t *testing.T) {
  201. r := InitRequest()
  202. InitParams(r)
  203. assert.Equal(t, "", GetQueryString(r))
  204. }
  205. func Test_AcsRequest_InitParams3(t *testing.T) {
  206. r := InitRequest()
  207. r.OwnerId = "OwnerId"
  208. InitParams(r)
  209. assert.Equal(t, "OwnerId=OwnerId&", GetQueryString(r))
  210. }
  211. func Test_AcsRequest_InitParams4(t *testing.T) {
  212. r := InitRequest()
  213. r.RegionId = "regionid"
  214. r.DnsConfig = CreateContainerGroupDnsConfig{
  215. NameServer: []string{"nameserver1", "nameserver2"},
  216. }
  217. InitParams(r)
  218. assert.Equal(t, "DnsConfig.NameServer.1=nameserver1&DnsConfig.NameServer.2=nameserver2&", GetQueryString(r))
  219. }
  220. func Test_AcsRequest_InitParams5(t *testing.T) {
  221. r := InitRequest()
  222. r.RegionId = "regionid"
  223. r.DnsConfig = CreateContainerGroupDnsConfig{
  224. Option: &[]CreateContainerGroupOption{
  225. {
  226. Name: "sdk",
  227. Value: "test",
  228. },
  229. },
  230. }
  231. InitParams(r)
  232. assert.Equal(t, "DnsConfig.Option.1.Name=sdk&DnsConfig.Option.1.Value=test&", GetQueryString(r))
  233. }
  234. func Test_AcsRequest_InitParams6(t *testing.T) {
  235. r := InitRequest()
  236. r.Volume = &[]CreateContainerGroupVolume{
  237. {
  238. Name: "nginx",
  239. Type: "1",
  240. NFSVolume: CreateContainerGroupNFSVolume{
  241. Path: "/",
  242. Option: CreateContainerGroupOption{
  243. Name: "sdk",
  244. },
  245. },
  246. },
  247. }
  248. InitParams(r)
  249. assert.Equal(t, "Volume.1.NFSVolume.Option.Name=sdk&Volume.1.NFSVolume.Path=/&Volume.1.Name=nginx&Volume.1.Type=1&", GetQueryString(r))
  250. }
  251. type StartMPUTaskRequest struct {
  252. *RpcRequest
  253. OwnerId Integer `position:"Query" name:"OwnerId"`
  254. AppId string `position:"Query" name:"AppId"`
  255. ChannelId string `position:"Query" name:"ChannelId"`
  256. TaskId string `position:"Query" name:"TaskId"`
  257. MediaEncode Integer `position:"Query" name:"MediaEncode"`
  258. BackgroundColor Integer `position:"Query" name:"BackgroundColor"`
  259. LayoutIds []Integer `position:"Query" name:"LayoutIds" type:"Repeated"`
  260. StreamURL string `position:"Query" name:"StreamURL"`
  261. }
  262. func Test_RPCRequest_InitParams(t *testing.T) {
  263. channelID := "id"
  264. r := &StartMPUTaskRequest{
  265. RpcRequest: &RpcRequest{},
  266. }
  267. r.init()
  268. r.Domain = "rtc.aliyuncs.com"
  269. r.AppId = "app ID"
  270. r.ChannelId = channelID
  271. r.TaskId = channelID
  272. r.MediaEncode = NewInteger(2)
  273. r.BackgroundColor = NewInteger(0)
  274. r.StreamURL = fmt.Sprintf("rtmp://video-center.alivecdn.com/galaxy/%s_%s?vhost=fast-live.chinalivestream.top", channelID, channelID)
  275. var out []Integer
  276. out = append(out, NewInteger(2))
  277. r.LayoutIds = out
  278. InitParams(r)
  279. queries := r.GetQueryParams()
  280. assert.Equal(t, "2", queries["LayoutIds.1"])
  281. assert.Len(t, queries, 7)
  282. }
  283. type TestAcsRequestWithErrorMap struct {
  284. *RpcRequest
  285. OptionJson map[string]interface{} `position:"Host" name:"OptionJson"`
  286. OptionJsonN map[string]interface{} `position:"Host" name:"OptionJsonN"`
  287. }
  288. func Test_InitParamsWithErrorMap(t *testing.T) {
  289. r := &TestAcsRequestWithErrorMap{
  290. RpcRequest: &RpcRequest{},
  291. }
  292. r.init()
  293. r.OptionJsonN = map[string]interface{}{
  294. "sdk": "test",
  295. }
  296. err := InitParams(r)
  297. assert.Equal(t, "[SDK.UnsupportedParamPosition] Specified param position (Host) is not supported, please upgrade sdk and retry", err.Error())
  298. }
  299. type TestAcsRequestWithErrorRepeated struct {
  300. *RpcRequest
  301. OptionJsonN []OptionJson `position:"Host" name:"OptionJsonN" type:"Repeated"`
  302. }
  303. type OptionJson struct {
  304. Option map[string]interface{} `name:"Option"`
  305. }
  306. func Test_InitParamsWithErrorRepeated(t *testing.T) {
  307. r := &TestAcsRequestWithErrorRepeated{
  308. RpcRequest: &RpcRequest{},
  309. }
  310. r.init()
  311. r.OptionJsonN = []OptionJson{
  312. {
  313. map[string]interface{}{
  314. "sdk": "test",
  315. },
  316. },
  317. }
  318. err := InitParams(r)
  319. assert.Equal(t, "[SDK.UnsupportedParamPosition] Specified param position (Host) is not supported, please upgrade sdk and retry", err.Error())
  320. }