1package core
2
3import (
4 "context"
5 "errors"
6 "reflect"
7 "testing"
8
9 "github.com/patriceckhart/zot/packages/provider"
10)
11
12type compactLifecycleClient struct{ err error }
13
14func (*compactLifecycleClient) Name() string { return "test" }
15func (c *compactLifecycleClient) Stream(context.Context, provider.Request) (<-chan provider.Event, error) {
16 ch := make(chan provider.Event, 2)
17 ch <- provider.EventTextDelta{Delta: "summary"}
18 ch <- provider.EventDone{Err: c.err}
19 close(ch)
20 return ch, nil
21}
22
23func TestCompactionTerminalOutcomes(t *testing.T) {
24 for _, tc := range []struct {
25 status string
26 err error
27 }{
28 {"completed", nil}, {"failed", errors.New("failure")}, {"cancelled", context.Canceled}, {"timed_out", context.DeadlineExceeded},
29 } {
30 t.Run(tc.status, func(t *testing.T) {
31 a := NewAgent(&compactLifecycleClient{err: tc.err}, "test", "", nil)
32 before := []provider.Message{
33 {Role: provider.RoleUser, Content: []provider.Content{provider.TextBlock{Text: "first message"}}},
34 {Role: provider.RoleAssistant, Content: []provider.Content{provider.TextBlock{Text: "second message"}}},
35 }
36 a.SetMessages(before)
37 var events []EvCompact
38 a.OnEvent = func(e AgentEvent) { events = append(events, e.(EvCompact)) }
39 _, err := a.Compact(context.Background(), 0, nil)
40 if !errors.Is(err, tc.err) {
41 t.Fatalf("error = %v", err)
42 }
43 if len(events) != 2 || events[0].Phase != "pre" || events[1].Phase != "post" || events[1].Status != tc.status || events[0].ID == "" || events[0].ID != events[1].ID {
44 t.Fatalf("events: %+v", events)
45 }
46 if events[0].MessageCount != 2 || events[0].TokenEstimate <= 0 {
47 t.Fatalf("pre counts: %+v", events[0])
48 }
49 if tc.err == nil {
50 if events[1].MessageCount != 1 || events[1].TokenEstimate <= 0 {
51 t.Fatalf("post counts: %+v", events[1])
52 }
53 } else if !reflect.DeepEqual(a.Messages(), before) {
54 t.Fatal("failed compaction changed transcript")
55 }
56 })
57 }
58}