move request_builder into internal pkg (#304) (#329)

* move request_builder into internal pkg (#304)

* add some test for internal.RequestBuilder

* add a test for openai.GetEngine
This commit is contained in:
渡邉祐一 / Yuichi Watanabe
2023-05-31 17:01:42 +09:00
committed by GitHub
parent 62eb4beed2
commit 61ba5f3369
16 changed files with 273 additions and 208 deletions

View File

@@ -0,0 +1,40 @@
package openai
import (
"bytes"
"context"
"net/http"
)
type RequestBuilder interface {
Build(ctx context.Context, method, url string, request any) (*http.Request, error)
}
type HTTPRequestBuilder struct {
marshaller Marshaller
}
func NewRequestBuilder() *HTTPRequestBuilder {
return &HTTPRequestBuilder{
marshaller: &JSONMarshaller{},
}
}
func (b *HTTPRequestBuilder) Build(ctx context.Context, method, url string, request any) (*http.Request, error) {
if request == nil {
return http.NewRequestWithContext(ctx, method, url, nil)
}
var reqBytes []byte
reqBytes, err := b.marshaller.Marshal(request)
if err != nil {
return nil, err
}
return http.NewRequestWithContext(
ctx,
method,
url,
bytes.NewBuffer(reqBytes),
)
}

View File

@@ -0,0 +1,61 @@
package openai //nolint:testpackage // testing private field
import (
"bytes"
"context"
"errors"
"net/http"
"reflect"
"testing"
)
var errTestMarshallerFailed = errors.New("test marshaller failed")
type failingMarshaller struct{}
func (*failingMarshaller) Marshal(_ any) ([]byte, error) {
return []byte{}, errTestMarshallerFailed
}
func TestRequestBuilderReturnsMarshallerErrors(t *testing.T) {
builder := HTTPRequestBuilder{
marshaller: &failingMarshaller{},
}
_, err := builder.Build(context.Background(), "", "", struct{}{})
if !errors.Is(err, errTestMarshallerFailed) {
t.Fatalf("Did not return error when marshaller failed: %v", err)
}
}
func TestRequestBuilderReturnsRequest(t *testing.T) {
b := NewRequestBuilder()
var (
ctx = context.Background()
method = http.MethodPost
url = "/foo"
request = map[string]string{"foo": "bar"}
reqBytes, _ = b.marshaller.Marshal(request)
want, _ = http.NewRequestWithContext(ctx, method, url, bytes.NewBuffer(reqBytes))
)
got, _ := b.Build(ctx, method, url, request)
if !reflect.DeepEqual(got.Body, want.Body) ||
!reflect.DeepEqual(got.URL, want.URL) ||
!reflect.DeepEqual(got.Method, want.Method) {
t.Errorf("Build() got = %v, want %v", got, want)
}
}
func TestRequestBuilderReturnsRequestWhenRequestOfArgsIsNil(t *testing.T) {
var (
ctx = context.Background()
method = http.MethodGet
url = "/foo"
want, _ = http.NewRequestWithContext(ctx, method, url, nil)
)
b := NewRequestBuilder()
got, _ := b.Build(ctx, method, url, nil)
if !reflect.DeepEqual(got, want) {
t.Errorf("Build() got = %v, want %v", got, want)
}
}