X-Git-Url: http://git.giacomolli.uk/onechat/blobdiff_plain/1c1771140063b1b4aa5d508ced1b285e773fce04..97274864799ac2eea84bf80c9727a810b695db55:/responses_test.go?ds=sidebyside diff --git a/responses_test.go b/responses_test.go index c1a7b4d..9a1355a 100644 --- a/responses_test.go +++ b/responses_test.go @@ -11,6 +11,7 @@ import ( "path/filepath" "sync" "testing" + "time" "github.com/stretchr/testify/require" ) @@ -60,6 +61,42 @@ func TestClientSendsTheFixedRequestFields(t *testing.T) { 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) { @@ -102,6 +139,7 @@ func TestClientRecordsEachCall(t *testing.T) { 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"}`) @@ -113,8 +151,12 @@ func TestClientRecordsEachCall(t *testing.T) { } 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") @@ -133,9 +175,15 @@ func TestClientRecordsEachCall(t *testing.T) { 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") @@ -149,6 +197,24 @@ func TestClientRecordsEachCall(t *testing.T) { require.Equal(t, os.FileMode(0o600), info.Mode().Perm()) } +func TestClientRefusesCallsOverTheLimit(t *testing.T) { + server := newFakeResponses(t) + client := newTestClient(t, server) + client.LimitCalls(2) + + for range 2 { + require.False(t, client.LimitReached()) + _, err := client.Create(t.Context(), testRequest()) + require.NoError(t, err) + } + + require.True(t, client.LimitReached()) + _, err := client.Create(t.Context(), testRequest()) + require.ErrorIs(t, err, errCallLimit) + require.Equal(t, 2, server.Calls()) + require.Len(t, readUsage(t, client.usage.path), 2) +} + func TestClientFailsWhenTheResponseFails(t *testing.T) { testCases := []struct { name string