Skip to content

Commit 1bf77f6

Browse files
authored
Improve unit test coverage (sashabaranov#1032)
* Add unit tests to improve coverage * Fix type assertion checks in tests
1 parent c650976 commit 1bf77f6

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

image_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
utils "github.com/sashabaranov/go-openai/internal"
55
"github.com/sashabaranov/go-openai/internal/test/checks"
66

7+
"bytes"
78
"context"
89
"fmt"
910
"io"
@@ -156,3 +157,52 @@ func TestVariImageFormBuilderFailures(t *testing.T) {
156157
_, err = client.CreateVariImage(ctx, req)
157158
checks.ErrorIs(t, err, mockFailedErr, "CreateImage should return error if form builder fails")
158159
}
160+
161+
type testNamedReader struct{ io.Reader }
162+
163+
func (testNamedReader) Name() string { return "named.txt" }
164+
165+
func TestWrapReader(t *testing.T) {
166+
r := bytes.NewBufferString("data")
167+
wrapped := WrapReader(r, "file.png", "image/png")
168+
f, ok := wrapped.(interface {
169+
Name() string
170+
ContentType() string
171+
})
172+
if !ok {
173+
t.Fatal("wrapped reader missing Name or ContentType")
174+
}
175+
if f.Name() != "file.png" {
176+
t.Fatalf("expected name file.png, got %s", f.Name())
177+
}
178+
if f.ContentType() != "image/png" {
179+
t.Fatalf("expected content type image/png, got %s", f.ContentType())
180+
}
181+
182+
// test name from underlying reader
183+
nr := testNamedReader{Reader: bytes.NewBufferString("d")}
184+
wrapped = WrapReader(nr, "", "text/plain")
185+
f, ok = wrapped.(interface {
186+
Name() string
187+
ContentType() string
188+
})
189+
if !ok {
190+
t.Fatal("wrapped named reader missing Name or ContentType")
191+
}
192+
if f.Name() != "named.txt" {
193+
t.Fatalf("expected name named.txt, got %s", f.Name())
194+
}
195+
if f.ContentType() != "text/plain" {
196+
t.Fatalf("expected content type text/plain, got %s", f.ContentType())
197+
}
198+
199+
// no name provided
200+
wrapped = WrapReader(bytes.NewBuffer(nil), "", "")
201+
f2, ok := wrapped.(interface{ Name() string })
202+
if !ok {
203+
t.Fatal("wrapped anonymous reader missing Name")
204+
}
205+
if f2.Name() != "" {
206+
t.Fatalf("expected empty name, got %s", f2.Name())
207+
}
208+
}

internal/error_accumulator_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"testing"
55

66
openai "github.com/sashabaranov/go-openai/internal"
7+
"github.com/sashabaranov/go-openai/internal/test"
78
"github.com/sashabaranov/go-openai/internal/test/checks"
89
)
910

@@ -30,3 +31,9 @@ func TestDefaultErrorAccumulator_EmptyBuffer(t *testing.T) {
3031
t.Fatal("Buffer should be empty initially")
3132
}
3233
}
34+
35+
func TestDefaultErrorAccumulator_WriteError(t *testing.T) {
36+
ea := &openai.DefaultErrorAccumulator{Buffer: &test.FailingErrorBuffer{}}
37+
err := ea.Write([]byte("fail"))
38+
checks.ErrorIs(t, err, test.ErrTestErrorAccumulatorWriteFailed, "Write should propagate buffer errors")
39+
}

internal/form_builder_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,17 @@ func TestWriteField(t *testing.T) {
161161
checks.NoError(t, err, "should write field without error")
162162
})
163163
}
164+
165+
func TestCreateFormFile(t *testing.T) {
166+
buf := &bytes.Buffer{}
167+
builder := NewFormBuilder(buf)
168+
169+
err := builder.createFormFile("file", bytes.NewBufferString("data"), "")
170+
if err == nil {
171+
t.Fatal("expected error for empty filename")
172+
}
173+
174+
builder = NewFormBuilder(&failingWriter{})
175+
err = builder.createFormFile("file", bytes.NewBufferString("data"), "name")
176+
checks.ErrorIs(t, err, errMockFailingWriterError, "should propagate writer error")
177+
}

internal/request_builder_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"context"
66
"errors"
7+
"io"
78
"net/http"
89
"reflect"
910
"testing"
@@ -59,3 +60,29 @@ func TestRequestBuilderReturnsRequestWhenRequestOfArgsIsNil(t *testing.T) {
5960
t.Errorf("Build() got = %v, want %v", got, want)
6061
}
6162
}
63+
64+
func TestRequestBuilderWithReaderBodyAndHeader(t *testing.T) {
65+
b := NewRequestBuilder()
66+
ctx := context.Background()
67+
method := http.MethodPost
68+
url := "/reader"
69+
bodyContent := "hello"
70+
body := bytes.NewBufferString(bodyContent)
71+
header := http.Header{"X-Test": []string{"val"}}
72+
73+
req, err := b.Build(ctx, method, url, body, header)
74+
if err != nil {
75+
t.Fatalf("Build returned error: %v", err)
76+
}
77+
78+
gotBody, err := io.ReadAll(req.Body)
79+
if err != nil {
80+
t.Fatalf("cannot read body: %v", err)
81+
}
82+
if string(gotBody) != bodyContent {
83+
t.Fatalf("expected body %q, got %q", bodyContent, string(gotBody))
84+
}
85+
if req.Header.Get("X-Test") != "val" {
86+
t.Fatalf("expected header set to val, got %q", req.Header.Get("X-Test"))
87+
}
88+
}

0 commit comments

Comments
 (0)