Skip to content

Commit fc30e71

Browse files
committed
Fix linter issues
1 parent 575aff4 commit fc30e71

File tree

8 files changed

+369
-0
lines changed

8 files changed

+369
-0
lines changed

examples/chatbot/main_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"os"
8+
"strings"
9+
"testing"
10+
)
11+
12+
type rewriteTransport struct {
13+
host string
14+
rt http.RoundTripper
15+
}
16+
17+
func (t rewriteTransport) RoundTrip(r *http.Request) (*http.Response, error) {
18+
r.URL.Scheme = "http"
19+
r.URL.Host = t.host
20+
return t.rt.RoundTrip(r)
21+
}
22+
23+
func setup(t *testing.T, path, resp string) (*httptest.Server, func()) {
24+
t.Helper()
25+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26+
if r.URL.Path == path {
27+
w.Header().Set("Content-Type", "application/json")
28+
if _, err := io.WriteString(w, resp); err != nil {
29+
t.Fatalf("write: %v", err)
30+
}
31+
return
32+
}
33+
http.NotFound(w, r)
34+
}))
35+
orig := http.DefaultTransport
36+
http.DefaultTransport = rewriteTransport{host: strings.TrimPrefix(server.URL, "http://"), rt: orig}
37+
return server, func() { http.DefaultTransport = orig; server.Close() }
38+
}
39+
40+
func TestMainExample(t *testing.T) {
41+
t.Setenv("OPENAI_API_KEY", "test")
42+
_, cleanup := setup(t, "/v1/chat/completions", `{"choices":[{"message":{"content":"hi"}}]}`)
43+
defer cleanup()
44+
45+
r, w, _ := os.Pipe()
46+
if _, err := w.Write([]byte("hello\n")); err != nil {
47+
t.Fatalf("write stdin: %v", err)
48+
}
49+
w.Close()
50+
oldStdin := os.Stdin
51+
os.Stdin = r
52+
defer func() { os.Stdin = oldStdin; r.Close() }()
53+
54+
main()
55+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"strings"
8+
"testing"
9+
)
10+
11+
type rewriteTransport struct {
12+
host string
13+
rt http.RoundTripper
14+
}
15+
16+
func (t rewriteTransport) RoundTrip(r *http.Request) (*http.Response, error) {
17+
r.URL.Scheme = "http"
18+
r.URL.Host = t.host
19+
return t.rt.RoundTrip(r)
20+
}
21+
22+
func setupToolServer(t *testing.T) (*httptest.Server, func()) {
23+
t.Helper()
24+
count := 0
25+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
26+
if r.URL.Path != "/v1/chat/completions" {
27+
http.NotFound(w, r)
28+
return
29+
}
30+
w.Header().Set("Content-Type", "application/json")
31+
var err error
32+
if count == 0 {
33+
_, err = io.WriteString(w,
34+
`{"choices":[{"message":{"tool_calls":[{"id":"1","function":{"name":"get_current_weather","arguments":"{}"}}]}}]}`)
35+
} else {
36+
_, err = io.WriteString(w, `{"choices":[{"message":{"content":"done"}}]}`)
37+
}
38+
if err != nil {
39+
t.Fatalf("write: %v", err)
40+
}
41+
count++
42+
}))
43+
orig := http.DefaultTransport
44+
http.DefaultTransport = rewriteTransport{host: strings.TrimPrefix(server.URL, "http://"), rt: orig}
45+
return server, func() { http.DefaultTransport = orig; server.Close() }
46+
}
47+
48+
func TestMainExample(t *testing.T) {
49+
t.Setenv("OPENAI_API_KEY", "test")
50+
_, cleanup := setupToolServer(t)
51+
defer cleanup()
52+
main()
53+
}

examples/completion/main_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"strings"
8+
"testing"
9+
)
10+
11+
type rewriteTransport struct {
12+
host string
13+
rt http.RoundTripper
14+
}
15+
16+
func (t rewriteTransport) RoundTrip(r *http.Request) (*http.Response, error) {
17+
r.URL.Scheme = "http"
18+
r.URL.Host = t.host
19+
return t.rt.RoundTrip(r)
20+
}
21+
22+
func setup(t *testing.T, path, resp string) (*httptest.Server, func()) {
23+
t.Helper()
24+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
25+
if r.URL.Path == path {
26+
w.Header().Set("Content-Type", "application/json")
27+
if _, err := io.WriteString(w, resp); err != nil {
28+
t.Fatalf("write: %v", err)
29+
}
30+
return
31+
}
32+
http.NotFound(w, r)
33+
}))
34+
orig := http.DefaultTransport
35+
http.DefaultTransport = rewriteTransport{host: strings.TrimPrefix(server.URL, "http://"), rt: orig}
36+
return server, func() { http.DefaultTransport = orig; server.Close() }
37+
}
38+
39+
func TestMainExample(t *testing.T) {
40+
t.Setenv("OPENAI_API_KEY", "test")
41+
_, cleanup := setup(t, "/v1/completions", `{"choices":[{"text":"hi"}]}`)
42+
defer cleanup()
43+
main()
44+
}

examples/images/main_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"strings"
8+
"testing"
9+
)
10+
11+
type rewriteTransport struct {
12+
host string
13+
rt http.RoundTripper
14+
}
15+
16+
func (t rewriteTransport) RoundTrip(r *http.Request) (*http.Response, error) {
17+
r.URL.Scheme = "http"
18+
r.URL.Host = t.host
19+
return t.rt.RoundTrip(r)
20+
}
21+
22+
func setup(t *testing.T, path, resp string) (*httptest.Server, func()) {
23+
t.Helper()
24+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
25+
if r.URL.Path == path {
26+
w.Header().Set("Content-Type", "application/json")
27+
if _, err := io.WriteString(w, resp); err != nil {
28+
t.Fatalf("write: %v", err)
29+
}
30+
return
31+
}
32+
http.NotFound(w, r)
33+
}))
34+
orig := http.DefaultTransport
35+
http.DefaultTransport = rewriteTransport{host: strings.TrimPrefix(server.URL, "http://"), rt: orig}
36+
return server, func() { http.DefaultTransport = orig; server.Close() }
37+
}
38+
39+
func TestMainExample(t *testing.T) {
40+
t.Setenv("OPENAI_API_KEY", "test")
41+
_, cleanup := setup(t, "/v1/images/generations", `{"data":[{"url":"example"}]}`)
42+
defer cleanup()
43+
main()
44+
}

examples/voice-to-text/main_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"net/http/httptest"
7+
"os"
8+
"path/filepath"
9+
"strings"
10+
"testing"
11+
)
12+
13+
type rewriteTransport struct {
14+
host string
15+
rt http.RoundTripper
16+
}
17+
18+
func (t rewriteTransport) RoundTrip(r *http.Request) (*http.Response, error) {
19+
r.URL.Scheme = "http"
20+
r.URL.Host = t.host
21+
return t.rt.RoundTrip(r)
22+
}
23+
24+
func setup(t *testing.T, path, resp string) (*httptest.Server, func()) {
25+
t.Helper()
26+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
27+
if r.URL.Path == path {
28+
w.Header().Set("Content-Type", "application/json")
29+
if _, err := io.WriteString(w, resp); err != nil {
30+
t.Fatalf("write: %v", err)
31+
}
32+
return
33+
}
34+
http.NotFound(w, r)
35+
}))
36+
orig := http.DefaultTransport
37+
http.DefaultTransport = rewriteTransport{host: strings.TrimPrefix(server.URL, "http://"), rt: orig}
38+
return server, func() { http.DefaultTransport = orig; server.Close() }
39+
}
40+
41+
func TestMainExample(t *testing.T) {
42+
t.Setenv("OPENAI_API_KEY", "test")
43+
_, cleanup := setup(t, "/v1/audio/transcriptions", `{"text":"ok"}`)
44+
defer cleanup()
45+
path := filepath.Join(t.TempDir(), "f.mp3")
46+
if err := os.WriteFile(path, []byte("test"), 0o600); err != nil {
47+
t.Fatalf("write file: %v", err)
48+
}
49+
oldArgs := os.Args
50+
os.Args = []string{"cmd", path}
51+
defer func() { os.Args = oldArgs }()
52+
main()
53+
}

internal/test/checks/checks_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package checks_test
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"testing"
7+
8+
checks "github.com/sashabaranov/go-openai/internal/test/checks"
9+
)
10+
11+
func TestNoError(t *testing.T) {
12+
checks.NoError(t, nil)
13+
checks.NoErrorF(t, nil)
14+
checks.HasError(t, errors.New("err"))
15+
}
16+
17+
func TestErrorComparisons(t *testing.T) {
18+
target := errors.New("target")
19+
wrapped := fmt.Errorf("wrap: %w", target)
20+
21+
checks.ErrorIs(t, wrapped, target)
22+
checks.ErrorIsF(t, wrapped, target, "%v")
23+
checks.ErrorIsNot(t, errors.New("other"), target)
24+
checks.ErrorIsNotf(t, errors.New("other"), target, "%v")
25+
}

internal/test/server_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package test_test
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"testing"
7+
8+
testpkg "github.com/sashabaranov/go-openai/internal/test"
9+
)
10+
11+
func TestOpenAITestServerAuthAndHandler(t *testing.T) {
12+
ts := testpkg.NewTestServer()
13+
ts.RegisterHandler("/v1/test", func(w http.ResponseWriter, _ *http.Request) {
14+
if _, err := io.WriteString(w, "ok"); err != nil {
15+
t.Fatalf("write: %v", err)
16+
}
17+
})
18+
srv := ts.OpenAITestServer()
19+
srv.Start()
20+
defer srv.Close()
21+
22+
req, _ := http.NewRequest("GET", srv.URL+"/v1/test", nil)
23+
req.Header.Set("Authorization", "Bearer "+testpkg.GetTestToken())
24+
res, err := http.DefaultClient.Do(req)
25+
if err != nil {
26+
t.Fatalf("request failed: %v", err)
27+
}
28+
body, _ := io.ReadAll(res.Body)
29+
res.Body.Close()
30+
if res.StatusCode != http.StatusOK || string(body) != "ok" {
31+
t.Fatalf("unexpected response: %v %s", res.StatusCode, string(body))
32+
}
33+
34+
req2, _ := http.NewRequest("GET", srv.URL+"/v1/test", nil)
35+
res2, err := http.DefaultClient.Do(req2)
36+
if err != nil {
37+
t.Fatalf("request2 failed: %v", err)
38+
}
39+
if res2.StatusCode != http.StatusUnauthorized {
40+
t.Fatalf("expected unauthorized, got %v", res2.StatusCode)
41+
}
42+
}
43+
44+
func TestOpenAITestServerWildcard(t *testing.T) {
45+
ts := testpkg.NewTestServer()
46+
ts.RegisterHandler("/v1/items/*", func(w http.ResponseWriter, _ *http.Request) {
47+
w.WriteHeader(http.StatusNoContent)
48+
})
49+
srv := ts.OpenAITestServer()
50+
srv.Start()
51+
defer srv.Close()
52+
53+
req, _ := http.NewRequest("GET", srv.URL+"/v1/items/123", nil)
54+
req.Header.Set("api-key", testpkg.GetTestToken())
55+
res, err := http.DefaultClient.Do(req)
56+
if err != nil {
57+
t.Fatalf("request failed: %v", err)
58+
}
59+
if res.StatusCode != http.StatusNoContent {
60+
t.Fatalf("unexpected status: %v", res.StatusCode)
61+
}
62+
}

jsonschema/unmarshal_method_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package jsonschema_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/sashabaranov/go-openai/jsonschema"
7+
)
8+
9+
func TestDefinition_Unmarshal(t *testing.T) {
10+
schema := jsonschema.Definition{
11+
Type: jsonschema.Object,
12+
Properties: map[string]jsonschema.Definition{
13+
"name": {Type: jsonschema.String},
14+
"age": {Type: jsonschema.Integer},
15+
},
16+
Required: []string{"name", "age"},
17+
}
18+
var out struct {
19+
Name string `json:"name"`
20+
Age int `json:"age"`
21+
}
22+
err := schema.Unmarshal(`{"name":"Alice","age":25}`, &out)
23+
if err != nil {
24+
t.Fatalf("expected no error, got %v", err)
25+
}
26+
if out.Name != "Alice" || out.Age != 25 {
27+
t.Fatalf("unexpected result %+v", out)
28+
}
29+
30+
if err2 := schema.Unmarshal(`{"name":"Bob"}`, &out); err2 == nil {
31+
t.Fatalf("expected error for missing field")
32+
}
33+
}

0 commit comments

Comments
 (0)