diff options
author | vitalyisaev <vitalyisaev@ydb.tech> | 2023-12-12 21:55:07 +0300 |
---|---|---|
committer | vitalyisaev <vitalyisaev@ydb.tech> | 2023-12-12 22:25:10 +0300 |
commit | 4967f99474a4040ba150eb04995de06342252718 (patch) | |
tree | c9c118836513a8fab6e9fcfb25be5d404338bca7 /vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go | |
parent | 2ce9cccb9b0bdd4cd7a3491dc5cbf8687cda51de (diff) | |
download | ydb-4967f99474a4040ba150eb04995de06342252718.tar.gz |
YQ Connector: prepare code base for S3 integration
1. Кодовая база Коннектора переписана с помощью Go дженериков так, чтобы добавление нового источника данных (в частности S3 + csv) максимально переиспользовало имеющийся код (чтобы сохранялась логика нарезания на блоки данных, учёт трафика и пр.)
2. API Connector расширено для работы с S3, но ещё пока не протестировано.
Diffstat (limited to 'vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go')
-rw-r--r-- | vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go b/vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go new file mode 100644 index 0000000000..6d972ae508 --- /dev/null +++ b/vendor/github.com/aws/smithy-go/encoding/httpbinding/encode_test.go @@ -0,0 +1,146 @@ +package httpbinding + +import ( + "net/http" + "net/url" + "reflect" + "testing" +) + +func TestEncoder(t *testing.T) { + actual := &http.Request{ + Header: http.Header{ + "custom-user-header": {"someValue"}, + }, + URL: &url.URL{ + Path: "/some/{pathKeyOne}/{pathKeyTwo}", + RawQuery: "someExistingKeys=foobar", + }, + } + + expected := &http.Request{ + Header: map[string][]string{ + "custom-user-header": {"someValue"}, + "x-amzn-header-foo": {"someValue"}, + "x-amzn-meta-foo": {"someValue"}, + }, + URL: &url.URL{ + Path: "/some/someValue/path", + RawPath: "/some/someValue/path", + RawQuery: "someExistingKeys=foobar&someKey=someValue&someKey=otherValue", + }, + } + + encoder, err := NewEncoder(actual.URL.Path, actual.URL.RawQuery, actual.Header) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + // Headers + encoder.AddHeader("x-amzn-header-foo").String("someValue") + encoder.Headers("x-amzn-meta-").AddHeader("foo").String("someValue") + + // Query + encoder.SetQuery("someKey").String("someValue") + encoder.AddQuery("someKey").String("otherValue") + + // URI + if err := encoder.SetURI("pathKeyOne").String("someValue"); err != nil { + t.Errorf("expected no err, but got %v", err) + } + + // URI + if err := encoder.SetURI("pathKeyTwo").String("path"); err != nil { + t.Errorf("expected no err, but got %v", err) + } + + if actual, err = encoder.Encode(actual); err != nil { + t.Errorf("expected no err, but got %v", err) + } + + if !reflect.DeepEqual(expected, actual) { + t.Errorf("expected %v, but got %v", expected, actual) + } +} + +func TestEncoderHasHeader(t *testing.T) { + encoder, err := NewEncoder("/", "", http.Header{}) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if h := "i-dont-exist"; encoder.HasHeader(h) { + t.Errorf("expect %v not to be set", h) + } + + encoder.AddHeader("I-do-exist").String("some value") + + if h := "I-do-exist"; !encoder.HasHeader(h) { + t.Errorf("expect %v to be set", h) + } + +} + +func TestEncoderHasQuery(t *testing.T) { + encoder, err := NewEncoder("/", "", http.Header{}) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + + if q := "i-dont-exist"; encoder.HasQuery(q) { + t.Errorf("expect %v not to be set", q) + } + + encoder.AddQuery("I-do-exist").String("some value") + + if q := "I-do-exist"; !encoder.HasQuery(q) { + t.Errorf("expect %v to be set", q) + } + +} + +func TestEncodeContentLength(t *testing.T) { + cases := map[string]struct { + headerValue string + expected int64 + wantErr bool + }{ + "valid number": { + headerValue: "1024", + expected: 1024, + }, + "invalid number": { + headerValue: "1024.5", + wantErr: true, + }, + "not a number": { + headerValue: "NaN", + wantErr: true, + }, + } + + for name, tt := range cases { + t.Run(name, func(t *testing.T) { + encoder, err := NewEncoder("/", "", http.Header{}) + if err != nil { + t.Fatalf("expect no error, got %v", err) + } + + encoder.SetHeader("Content-Length").String(tt.headerValue) + + req := &http.Request{URL: &url.URL{}} + req, err = encoder.Encode(req) + if (err != nil) != tt.wantErr { + t.Fatalf("unexpected error value wantErr=%v", tt.wantErr) + } else if tt.wantErr { + return + } + if e, a := tt.expected, req.ContentLength; e != a { + t.Errorf("expect %v, got %v", e, a) + } + if v := req.Header.Get("Content-Length"); len(v) > 0 { + t.Errorf("expect header not to be set") + } + }) + } +} |