瀏覽代碼

improve test cases for response.go

Jackson Tian 7 年之前
父節點
當前提交
0998a10d0a
共有 4 個文件被更改,包括 75 次插入19 次删除
  1. 1 1
      Makefile
  2. 4 3
      sdk/auth/signers/signer_ecs_ram_role.go
  3. 3 1
      sdk/responses/response.go
  4. 67 14
      sdk/responses/response_test.go

+ 1 - 1
Makefile

@@ -5,5 +5,5 @@ fmt:
 	go fmt ./sdk ./integration ./services/...
 
 test:
-	go test -race -coverprofile=coverage.txt -covermode=atomic ./sdk/...
+	go test -v -race -coverprofile=coverage.txt -covermode=atomic ./sdk/...
 	go tool cover -html=coverage.txt -o coverage.html

+ 4 - 3
sdk/auth/signers/signer_ecs_ram_role.go

@@ -17,13 +17,14 @@ package signers
 import (
 	"encoding/json"
 	"fmt"
+	"net/http"
+	"strings"
+	"time"
+
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
 	"github.com/jmespath/go-jmespath"
-	"net/http"
-	"strings"
-	"time"
 )
 
 type EcsRamRoleSigner struct {

+ 3 - 1
sdk/responses/response.go

@@ -35,6 +35,7 @@ type AcsResponse interface {
 	parseFromHttpResponse(httpResponse *http.Response) error
 }
 
+// Unmarshal object from http response body to target Response
 func Unmarshal(response AcsResponse, httpResponse *http.Response, format string) (err error) {
 	err = response.parseFromHttpResponse(httpResponse)
 	if err != nil {
@@ -44,7 +45,8 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
 		err = errors.NewServerError(response.GetHttpStatus(), response.GetHttpContentString(), "")
 		return
 	}
-	if _, isCommonResponse := response.(CommonResponse); isCommonResponse {
+
+	if _, isCommonResponse := response.(*CommonResponse); isCommonResponse {
 		// common response need not unmarshal
 		return
 	}

+ 67 - 14
sdk/responses/response_test.go

@@ -2,14 +2,29 @@ package responses
 
 import (
 	"bytes"
-	"io"
 	"io/ioutil"
 	"net/http"
+	"strconv"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
 )
 
+func makeHTTPResponse(statusCode int, content string) (res *http.Response) {
+	header := make(http.Header)
+	status := strconv.Itoa(statusCode)
+	res = &http.Response{
+		Proto:      "HTTP/1.1",
+		ProtoMajor: 1,
+		Header:     header,
+		StatusCode: statusCode,
+		Status:     status + " " + http.StatusText(statusCode),
+	}
+	res.Header = make(http.Header)
+	res.Body = ioutil.NopCloser(bytes.NewReader([]byte(content)))
+	return
+}
+
 func Test_CommonResponse(t *testing.T) {
 	r := NewCommonResponse()
 	assert.NotNil(t, r)
@@ -24,20 +39,8 @@ func Test_CommonResponse(t *testing.T) {
 
 func Test_CommonResponse_parseFromHttpResponse(t *testing.T) {
 	r := NewCommonResponse()
-	header := make(http.Header)
-	status := "200"
-	statusCode := 200
-	res := &http.Response{
-		Proto:      "HTTP/1.1",
-		ProtoMajor: 1,
-		Header:     header,
-		StatusCode: statusCode,
-		Status:     status + " " + http.StatusText(statusCode),
-	}
-	var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil))
-	res.Header = make(http.Header)
+	res := makeHTTPResponse(200, "")
 	res.Header.Add("Server", "GitHub.com")
-	res.Body = noBody
 	r.parseFromHttpResponse(res)
 	expected := `HTTP/1.1 200 OK
 Server: GitHub.com
@@ -49,3 +52,53 @@ Server: GitHub.com
 	assert.Equal(t, "GitHub.com", r.GetHttpHeaders()["Server"][0])
 	assert.Equal(t, expected, r.String())
 }
+
+func Test_CommonResponse_Unmarshal(t *testing.T) {
+	r := NewCommonResponse()
+	res := makeHTTPResponse(400, "")
+	err := Unmarshal(r, res, "JSON")
+	assert.NotNil(t, err)
+	assert.Equal(t, "SDK.ServerError\nErrorCode: \nRecommend: \nRequestId: \nMessage: ", err.Error())
+}
+
+func Test_CommonResponse_Unmarshal_CommonResponse(t *testing.T) {
+	r := NewCommonResponse()
+	res := makeHTTPResponse(200, "")
+	err := Unmarshal(r, res, "JSON")
+	assert.Nil(t, err)
+}
+
+type MyResponse struct {
+	*BaseResponse
+	RequestId string
+}
+
+func Test_CommonResponse_Unmarshal_EmptyContent(t *testing.T) {
+	r := &MyResponse{
+		BaseResponse: &BaseResponse{},
+	}
+	res := makeHTTPResponse(200, "")
+	err := Unmarshal(r, res, "JSON")
+	assert.Nil(t, err)
+	assert.Equal(t, "", r.RequestId)
+}
+
+func Test_CommonResponse_Unmarshal_MyResponse(t *testing.T) {
+	r := &MyResponse{
+		BaseResponse: &BaseResponse{},
+	}
+	res := makeHTTPResponse(200, `{"RequestId": "the request id"}`)
+	err := Unmarshal(r, res, "JSON")
+	assert.Nil(t, err)
+	assert.Equal(t, "the request id", r.RequestId)
+}
+
+func Test_CommonResponse_Unmarshal_Error(t *testing.T) {
+	r := &MyResponse{
+		BaseResponse: &BaseResponse{},
+	}
+	res := makeHTTPResponse(200, `{`)
+	err := Unmarshal(r, res, "JSON")
+	assert.NotNil(t, err)
+	assert.Equal(t, "[SDK.JsonUnmarshalError] Failed to unmarshal response, but you can get the data via response.GetHttpStatusCode() and response.GetHttpContentString()\ncaused by:\nresponses.MyResponse.readFieldHash: expect \", but found \x00, error found in #1 byte of ...|{|..., bigger context ...|{|...", err.Error())
+}