Skip to content

Commit 181c0e8

Browse files
authored
Add tests for internal utilities (#1044)
* Add unit tests for internal test utilities * Fix lint issues in internal tests
1 parent e6c1d3e commit 181c0e8

File tree

5 files changed

+189
-0
lines changed

5 files changed

+189
-0
lines changed

internal/test/checks/checks_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package checks_test
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/sashabaranov/go-openai/internal/test/checks"
8+
)
9+
10+
func TestChecksSuccessPaths(t *testing.T) {
11+
checks.NoError(t, nil)
12+
checks.NoErrorF(t, nil)
13+
checks.HasError(t, errors.New("err"))
14+
target := errors.New("x")
15+
checks.ErrorIs(t, target, target)
16+
checks.ErrorIsF(t, target, target, "msg")
17+
checks.ErrorIsNot(t, errors.New("y"), target)
18+
checks.ErrorIsNotf(t, errors.New("y"), target, "msg")
19+
}

internal/test/failer_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//nolint:testpackage // need access to unexported fields and types for testing
2+
package test
3+
4+
import (
5+
"errors"
6+
"testing"
7+
)
8+
9+
func TestFailingErrorBuffer(t *testing.T) {
10+
buf := &FailingErrorBuffer{}
11+
n, err := buf.Write([]byte("test"))
12+
if !errors.Is(err, ErrTestErrorAccumulatorWriteFailed) {
13+
t.Fatalf("expected %v, got %v", ErrTestErrorAccumulatorWriteFailed, err)
14+
}
15+
if n != 0 {
16+
t.Fatalf("expected n=0, got %d", n)
17+
}
18+
if buf.Len() != 0 {
19+
t.Fatalf("expected Len 0, got %d", buf.Len())
20+
}
21+
if len(buf.Bytes()) != 0 {
22+
t.Fatalf("expected empty bytes")
23+
}
24+
}

internal/test/helpers_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package test_test
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"os"
8+
"path/filepath"
9+
"testing"
10+
11+
internaltest "github.com/sashabaranov/go-openai/internal/test"
12+
)
13+
14+
func TestCreateTestFile(t *testing.T) {
15+
dir := t.TempDir()
16+
path := filepath.Join(dir, "file.txt")
17+
internaltest.CreateTestFile(t, path)
18+
data, err := os.ReadFile(path)
19+
if err != nil {
20+
t.Fatalf("failed to read created file: %v", err)
21+
}
22+
if string(data) != "hello" {
23+
t.Fatalf("unexpected file contents: %q", string(data))
24+
}
25+
}
26+
27+
func TestTokenRoundTripperAddsHeader(t *testing.T) {
28+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
29+
if r.Header.Get("Authorization") != "Bearer "+internaltest.GetTestToken() {
30+
t.Fatalf("authorization header not set")
31+
}
32+
w.WriteHeader(http.StatusOK)
33+
}))
34+
defer srv.Close()
35+
36+
client := srv.Client()
37+
client.Transport = &internaltest.TokenRoundTripper{Token: internaltest.GetTestToken(), Fallback: client.Transport}
38+
39+
req, err := http.NewRequest(http.MethodGet, srv.URL, nil)
40+
if err != nil {
41+
t.Fatalf("request error: %v", err)
42+
}
43+
resp, err := client.Do(req)
44+
if err != nil {
45+
t.Fatalf("client request error: %v", err)
46+
}
47+
if _, err = io.Copy(io.Discard, resp.Body); err != nil {
48+
t.Fatalf("read body: %v", err)
49+
}
50+
resp.Body.Close()
51+
if resp.StatusCode != http.StatusOK {
52+
t.Fatalf("unexpected status: %d", resp.StatusCode)
53+
}
54+
}

internal/test/server.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ func NewTestServer() *ServerTest {
2323
return &ServerTest{handlers: make(map[string]handler)}
2424
}
2525

26+
// HandlerCount returns the number of registered handlers.
27+
func (ts *ServerTest) HandlerCount() int {
28+
return len(ts.handlers)
29+
}
30+
31+
// HasHandler checks if a handler was registered for the given path.
32+
func (ts *ServerTest) HasHandler(path string) bool {
33+
path = strings.ReplaceAll(path, "*", ".*")
34+
_, ok := ts.handlers[path]
35+
return ok
36+
}
37+
2638
func (ts *ServerTest) RegisterHandler(path string, handler handler) {
2739
// to make the registered paths friendlier to a regex match in the route handler
2840
// in OpenAITestServer

internal/test/server_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package test_test
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"testing"
7+
8+
internaltest "github.com/sashabaranov/go-openai/internal/test"
9+
)
10+
11+
func TestGetTestToken(t *testing.T) {
12+
if internaltest.GetTestToken() != "this-is-my-secure-token-do-not-steal!!" {
13+
t.Fatalf("unexpected token")
14+
}
15+
}
16+
17+
func TestNewTestServer(t *testing.T) {
18+
ts := internaltest.NewTestServer()
19+
if ts == nil {
20+
t.Fatalf("server not properly initialized")
21+
}
22+
if ts.HandlerCount() != 0 {
23+
t.Fatalf("expected no handlers initially")
24+
}
25+
}
26+
27+
func TestRegisterHandlerTransformsPath(t *testing.T) {
28+
ts := internaltest.NewTestServer()
29+
h := func(_ http.ResponseWriter, _ *http.Request) {}
30+
ts.RegisterHandler("/foo/*", h)
31+
if !ts.HasHandler("/foo/*") {
32+
t.Fatalf("handler not registered with transformed path")
33+
}
34+
}
35+
36+
func TestOpenAITestServer(t *testing.T) {
37+
ts := internaltest.NewTestServer()
38+
ts.RegisterHandler("/v1/test/*", func(w http.ResponseWriter, _ *http.Request) {
39+
if _, err := io.WriteString(w, "ok"); err != nil {
40+
t.Fatalf("write: %v", err)
41+
}
42+
})
43+
srv := ts.OpenAITestServer()
44+
srv.Start()
45+
defer srv.Close()
46+
47+
base := srv.Client().Transport
48+
client := &http.Client{Transport: &internaltest.TokenRoundTripper{Token: internaltest.GetTestToken(), Fallback: base}}
49+
resp, err := client.Get(srv.URL + "/v1/test/123")
50+
if err != nil {
51+
t.Fatalf("request error: %v", err)
52+
}
53+
body, err := io.ReadAll(resp.Body)
54+
resp.Body.Close()
55+
if err != nil {
56+
t.Fatalf("read response body: %v", err)
57+
}
58+
if resp.StatusCode != http.StatusOK || string(body) != "ok" {
59+
t.Fatalf("unexpected response: %d %q", resp.StatusCode, string(body))
60+
}
61+
62+
// unregistered path
63+
resp, err = client.Get(srv.URL + "/unknown")
64+
if err != nil {
65+
t.Fatalf("request error: %v", err)
66+
}
67+
if resp.StatusCode != http.StatusNotFound {
68+
t.Fatalf("expected 404, got %d", resp.StatusCode)
69+
}
70+
71+
// missing token should return unauthorized
72+
clientNoToken := srv.Client()
73+
resp, err = clientNoToken.Get(srv.URL + "/v1/test/123")
74+
if err != nil {
75+
t.Fatalf("request error: %v", err)
76+
}
77+
if resp.StatusCode != http.StatusUnauthorized {
78+
t.Fatalf("expected 401, got %d", resp.StatusCode)
79+
}
80+
}

0 commit comments

Comments
 (0)