"path/filepath"
"sync"
"testing"
+ "time"
"github.com/stretchr/testify/require"
)
require.Len(t, body["tools"], 1)
}
+func TestClientSendsTheSessionHeaderToChatGPT(t *testing.T) {
+ login := newFakeAuth(t)
+ auth := newTestAuth(t, login)
+ writeTestTokens(t, auth, login.token(time.Hour), "refresh-0")
+
+ testCases := []struct {
+ name string
+ auth authorizer
+ want string
+ }{
+ {
+ name: "ChatGPT backend",
+ auth: auth,
+ want: "agent-key",
+ },
+ {
+ name: "OpenAI API",
+ auth: apiKey(testKey),
+ want: "",
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ server := newFakeResponses(t)
+ client := newClient(server.URL, tc.auth, "agent-key", filepath.Join(t.TempDir(), "usage.jsonl"))
+ _, err := client.Create(t.Context(), testRequest())
+ require.NoError(t, err)
+
+ call := server.Call(0)
+ require.Equal(t, tc.want, call.header.Get("session_id"))
+ require.Equal(t, "agent-key", call.body["prompt_cache_key"])
+ })
+ }
+}
+
func TestClientReadsTheStream(t *testing.T) {
server := newFakeResponses(t)
server.reply = func(w http.ResponseWriter, call fakeCall) {
w.Header().Set("X-Codex-Primary-Used-Percent", "12")
w.Header().Set("X-Codex-Plan-Type", "plus")
w.Header().Set("X-Other", "not quota")
+ w.Header().Set("X-Codex-Turn-State", "opaque state")
if call.number == 1 {
w.WriteHeader(http.StatusTooManyRequests)
_, _ = io.WriteString(w, `{"detail": "slow down"}`)
}
client := newTestClient(t, server)
- _, err := client.Create(t.Context(), testRequest())
+ request := testRequest()
+ request.Node = &nodeKey{2, 5}
+ _, err := client.Create(t.Context(), request)
require.NoError(t, err)
+ require.NotContains(t, server.Call(0).body, "node")
+ require.NotContains(t, string(server.Call(0).raw), "[2,5]")
_, err = client.Create(t.Context(), testRequest())
require.ErrorContains(t, err, "HTTP 429")
require.Equal(t, 400, records[0].CachedTokens)
require.Equal(t, 7, records[0].OutputTokens)
require.Equal(t, quota, records[0].Quota)
+ require.Equal(t, &[2]int{2, 5}, records[0].Node)
+ require.Equal(t, len("ok"), records[0].TextBytes)
+ require.Greater(t, records[0].Seconds, 0.0)
require.Empty(t, records[0].Error)
require.NotEmpty(t, records[0].Date)
+ require.Nil(t, records[1].Node)
+ require.Zero(t, records[1].TextBytes)
+
require.Equal(t, http.StatusTooManyRequests, records[1].Status)
require.Equal(t, quota, records[1].Quota)
require.Contains(t, records[1].Error, "HTTP 429")