X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/6f7eda727e519ae43d7d35195cbe412a2725abd7..fb242538c1b012b0faf3cc4045a9b1c370f1ef42:/responses_test.go diff --git a/responses_test.go b/responses_test.go index 577e611..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) { @@ -114,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") @@ -134,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") @@ -150,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