...

Source file src/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go

Documentation: github.com/aws/smithy-go/encoding/httpbinding

     1  package httpbinding
     2  
     3  import (
     4  	"net/http"
     5  	"net/url"
     6  	"reflect"
     7  	"testing"
     8  )
     9  
    10  func TestEncoder(t *testing.T) {
    11  	actual := &http.Request{
    12  		Header: http.Header{
    13  			"custom-user-header": {"someValue"},
    14  		},
    15  		URL: &url.URL{
    16  			Path:     "/some/{pathKeyOne}/{pathKeyTwo}",
    17  			RawQuery: "someExistingKeys=foobar",
    18  		},
    19  	}
    20  
    21  	expected := &http.Request{
    22  		Header: map[string][]string{
    23  			"custom-user-header": {"someValue"},
    24  			"x-amzn-header-foo":  {"someValue"},
    25  			"x-amzn-meta-foo":    {"someValue"},
    26  		},
    27  		URL: &url.URL{
    28  			Path:     "/some/someValue/path",
    29  			RawPath:  "/some/someValue/path",
    30  			RawQuery: "someExistingKeys=foobar&someKey=someValue&someKey=otherValue",
    31  		},
    32  	}
    33  
    34  	encoder, err := NewEncoder(actual.URL.Path, actual.URL.RawQuery, actual.Header)
    35  	if err != nil {
    36  		t.Fatalf("expected no error, got %v", err)
    37  	}
    38  
    39  	// Headers
    40  	encoder.AddHeader("x-amzn-header-foo").String("someValue")
    41  	encoder.Headers("x-amzn-meta-").AddHeader("foo").String("someValue")
    42  
    43  	// Query
    44  	encoder.SetQuery("someKey").String("someValue")
    45  	encoder.AddQuery("someKey").String("otherValue")
    46  
    47  	// URI
    48  	if err := encoder.SetURI("pathKeyOne").String("someValue"); err != nil {
    49  		t.Errorf("expected no err, but got %v", err)
    50  	}
    51  
    52  	// URI
    53  	if err := encoder.SetURI("pathKeyTwo").String("path"); err != nil {
    54  		t.Errorf("expected no err, but got %v", err)
    55  	}
    56  
    57  	if actual, err = encoder.Encode(actual); err != nil {
    58  		t.Errorf("expected no err, but got %v", err)
    59  	}
    60  
    61  	if !reflect.DeepEqual(expected, actual) {
    62  		t.Errorf("expected %v, but got %v", expected, actual)
    63  	}
    64  }
    65  
    66  func TestEncoderHasHeader(t *testing.T) {
    67  	encoder, err := NewEncoder("/", "", http.Header{})
    68  	if err != nil {
    69  		t.Fatalf("expected no error, got %v", err)
    70  	}
    71  
    72  	if h := "i-dont-exist"; encoder.HasHeader(h) {
    73  		t.Errorf("expect %v not to be set", h)
    74  	}
    75  
    76  	encoder.AddHeader("I-do-exist").String("some value")
    77  
    78  	if h := "I-do-exist"; !encoder.HasHeader(h) {
    79  		t.Errorf("expect %v to be set", h)
    80  	}
    81  
    82  }
    83  
    84  func TestEncoderHasQuery(t *testing.T) {
    85  	encoder, err := NewEncoder("/", "", http.Header{})
    86  	if err != nil {
    87  		t.Fatalf("expected no error, got %v", err)
    88  	}
    89  
    90  	if q := "i-dont-exist"; encoder.HasQuery(q) {
    91  		t.Errorf("expect %v not to be set", q)
    92  	}
    93  
    94  	encoder.AddQuery("I-do-exist").String("some value")
    95  
    96  	if q := "I-do-exist"; !encoder.HasQuery(q) {
    97  		t.Errorf("expect %v to be set", q)
    98  	}
    99  
   100  }
   101  
   102  func TestEncodeContentLength(t *testing.T) {
   103  	cases := map[string]struct {
   104  		headerValue string
   105  		expected    int64
   106  		wantErr     bool
   107  	}{
   108  		"valid number": {
   109  			headerValue: "1024",
   110  			expected:    1024,
   111  		},
   112  		"invalid number": {
   113  			headerValue: "1024.5",
   114  			wantErr:     true,
   115  		},
   116  		"not a number": {
   117  			headerValue: "NaN",
   118  			wantErr:     true,
   119  		},
   120  	}
   121  
   122  	for name, tt := range cases {
   123  		t.Run(name, func(t *testing.T) {
   124  			encoder, err := NewEncoder("/", "", http.Header{})
   125  			if err != nil {
   126  				t.Fatalf("expect no error, got %v", err)
   127  			}
   128  
   129  			encoder.SetHeader("Content-Length").String(tt.headerValue)
   130  
   131  			req := &http.Request{URL: &url.URL{}}
   132  			req, err = encoder.Encode(req)
   133  			if (err != nil) != tt.wantErr {
   134  				t.Fatalf("unexpected error value wantErr=%v", tt.wantErr)
   135  			} else if tt.wantErr {
   136  				return
   137  			}
   138  			if e, a := tt.expected, req.ContentLength; e != a {
   139  				t.Errorf("expect %v, got %v", e, a)
   140  			}
   141  			if v := req.Header.Get("Content-Length"); len(v) > 0 {
   142  				t.Errorf("expect header not to be set")
   143  			}
   144  		})
   145  	}
   146  }
   147  

View as plain text