Skip to content

Commit 2082940

Browse files
committed
#26 add: added new tests for client timeout.
1 parent 5083067 commit 2082940

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed

requestHandler_test.go

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package deepseek_test
2+
3+
import (
4+
"context"
5+
"errors"
6+
"net/http"
7+
"net/http/httptest"
8+
"os"
9+
"testing"
10+
"time"
11+
12+
"github.com/cohesion-org/deepseek-go"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func TestHandleSendChatCompletionRequest(t *testing.T) {
18+
t.Run("successful request", func(t *testing.T) {
19+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20+
w.WriteHeader(http.StatusOK)
21+
}))
22+
defer ts.Close()
23+
c := deepseek.NewClient("test", ts.URL)
24+
25+
req, err := http.NewRequest("GET", ts.URL, nil)
26+
require.NoError(t, err)
27+
28+
resp, err := deepseek.HandleSendChatCompletionRequest(*c, req)
29+
require.NoError(t, err)
30+
defer resp.Body.Close()
31+
32+
assert.Equal(t, http.StatusOK, resp.StatusCode)
33+
})
34+
35+
t.Run("request error", func(t *testing.T) {
36+
req, err := http.NewRequest("GET", "http://invalid-url", nil)
37+
require.NoError(t, err)
38+
c := deepseek.NewClient("test", "http://invalid-url")
39+
resp, err := deepseek.HandleSendChatCompletionRequest(*c, req)
40+
require.Error(t, err)
41+
assert.Nil(t, resp)
42+
assert.Contains(t, err.Error(), "error sending request:")
43+
})
44+
}
45+
46+
func TestHandleNormalRequest(t *testing.T) {
47+
t.Run("successful request", func(t *testing.T) {
48+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
49+
w.WriteHeader(http.StatusOK)
50+
}))
51+
defer ts.Close()
52+
c := deepseek.NewClient("test", ts.URL)
53+
req, err := http.NewRequest("GET", ts.URL, nil)
54+
require.NoError(t, err)
55+
56+
resp, err := deepseek.HandleNormalRequest(*c, req)
57+
require.NoError(t, err)
58+
defer resp.Body.Close()
59+
60+
assert.Equal(t, http.StatusOK, resp.StatusCode)
61+
})
62+
63+
t.Run("request error", func(t *testing.T) {
64+
req, err := http.NewRequest("GET", "http://invalid-url", nil)
65+
require.NoError(t, err)
66+
67+
c := deepseek.NewClient("test", "http://invalid-url")
68+
resp, err := deepseek.HandleNormalRequest(*c, req)
69+
require.Error(t, err)
70+
assert.Nil(t, resp)
71+
assert.Contains(t, err.Error(), "error sending request:")
72+
})
73+
}
74+
75+
func TestTimeoutConfiguration(t *testing.T) {
76+
t.Run("chat completion timeout", func(t *testing.T) {
77+
start := time.Now()
78+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
79+
time.Sleep(250 * time.Millisecond)
80+
w.WriteHeader(http.StatusOK)
81+
}))
82+
defer ts.Close()
83+
84+
req, err := http.NewRequest("GET", ts.URL, nil)
85+
require.NoError(t, err)
86+
c := deepseek.NewClient("test", ts.URL)
87+
resp, err := deepseek.HandleSendChatCompletionRequest(*c, req)
88+
require.NoError(t, err)
89+
defer resp.Body.Close()
90+
91+
// Verify timeout configuration isn't too short
92+
assert.WithinDuration(t, start, time.Now(), 300*time.Millisecond)
93+
})
94+
95+
t.Run("normal request timeout", func(t *testing.T) {
96+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
97+
time.Sleep(50 * time.Millisecond)
98+
w.WriteHeader(http.StatusOK)
99+
}))
100+
defer ts.Close()
101+
102+
req, err := http.NewRequest("GET", ts.URL, nil)
103+
require.NoError(t, err)
104+
105+
start := time.Now()
106+
c := deepseek.NewClient("test", ts.URL)
107+
resp, err := deepseek.HandleNormalRequest(*c, req)
108+
require.NoError(t, err)
109+
defer resp.Body.Close()
110+
111+
// Verify timeout allows successful completion
112+
assert.WithinDuration(t, start, time.Now(), 100*time.Millisecond)
113+
})
114+
}
115+
116+
func TestErrorTimeout(t *testing.T) {
117+
t.Run("client timeout preservation", func(t *testing.T) {
118+
// Create test server that responds slower than client timeout
119+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
120+
time.Sleep(250 * time.Millisecond) // Longer than client timeout
121+
}))
122+
defer ts.Close()
123+
124+
req, err := http.NewRequest("GET", ts.URL, nil)
125+
require.NoError(t, err)
126+
127+
// Create client with short timeout
128+
shortClient := &http.Client{
129+
Timeout: 5 * time.Millisecond,
130+
}
131+
132+
_, err = shortClient.Do(req)
133+
require.Error(t, err)
134+
135+
assert.True(t, errors.Is(err, context.DeadlineExceeded) ||
136+
(os.IsTimeout(err)), "should be timeout error")
137+
})
138+
}
139+
140+
func TestHandleTimeoutApplication(t *testing.T) {
141+
t.Run("default timeout applied when no env var set", func(t *testing.T) {
142+
// Ensure no timeout environment variable is set
143+
_ = os.Unsetenv("DEEPSEEK_TIMEOUT")
144+
145+
expectedTimeout := 5 * time.Minute
146+
147+
timeout, err := deepseek.HandleTimeout()
148+
require.NoError(t, err)
149+
assert.Equal(t, expectedTimeout, timeout, "Expected default timeout when env var is missing")
150+
151+
client, err := deepseek.NewClientWithOptions("your-api-key", deepseek.WithTimeout(timeout))
152+
require.NoError(t, err)
153+
assert.Equal(t, expectedTimeout, client.Timeout, "Client timeout should match default")
154+
})
155+
156+
t.Run("custom timeout from environment variable", func(t *testing.T) {
157+
_ = os.Setenv("DEEPSEEK_TIMEOUT", "30s")
158+
defer os.Unsetenv("DEEPSEEK_TIMEOUT")
159+
160+
expectedTimeout := 30 * time.Second
161+
162+
timeout, err := deepseek.HandleTimeout()
163+
require.NoError(t, err)
164+
assert.Equal(t, expectedTimeout, timeout, "Expected timeout from env variable")
165+
166+
client, err := deepseek.NewClientWithOptions("your-api-key", deepseek.WithTimeout(timeout))
167+
require.NoError(t, err)
168+
assert.Equal(t, expectedTimeout, client.Timeout, "Client timeout should match env var")
169+
})
170+
171+
t.Run("invalid timeout format returns error", func(t *testing.T) {
172+
_ = os.Setenv("DEEPSEEK_TIMEOUT", "invalid")
173+
defer os.Unsetenv("DEEPSEEK_TIMEOUT")
174+
175+
timeout, err := deepseek.HandleTimeout()
176+
assert.Error(t, err, "Expected error for invalid timeout format")
177+
assert.Zero(t, timeout, "Invalid timeout should return zero duration")
178+
})
179+
}

0 commit comments

Comments
 (0)