summaryrefslogtreecommitdiff
path: root/internal/hexaicli/runner_test.go
blob: 1d438b097a6c662db2239d9f29a9241d72655fcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package hexaicli

import (
	"bytes"
	"context"
	"log"
	"strings"
	"testing"

	"codeberg.org/snonux/hexai/internal/appconfig"
	"codeberg.org/snonux/hexai/internal/llm"
	"codeberg.org/snonux/hexai/internal/stats"
)

type recordingCLIStatusSink struct {
	startProvider string
	startModel    string
	globalCalls   int
}

func (s *recordingCLIStatusSink) SetLLMStart(provider, model string) error {
	s.startProvider = provider
	s.startModel = model
	return nil
}

func (s *recordingCLIStatusSink) SetGlobal(stats.Snapshot, string, string, float64, int64) error {
	s.globalCalls++
	return nil
}

func TestRunner_UsesInjectedDependencies(t *testing.T) {
	sink := &recordingCLIStatusSink{}
	runner := &Runner{
		loadConfig: func(context.Context, *log.Logger) appconfig.App {
			return appconfig.App{
				CoreConfig:   appconfig.CoreConfig{Provider: "openai"},
				PromptConfig: appconfig.PromptConfig{PromptCLIDefaultSystem: "SYS"},
			}
		},
		openEditor: func([]byte) (string, error) { return "PROMPT", nil },
		newClient: func(appconfig.App) (client llm.Client, err error) {
			return &fakeClient{name: "fake", model: "m", resp: "OUT"}, nil
		},
		statusSink: sink,
	}

	var stdout, stderr bytes.Buffer
	if err := runner.Run(context.Background(), nil, strings.NewReader(""), &stdout, &stderr); err != nil {
		t.Fatalf("Run: %v", err)
	}
	if stdout.String() != "OUT" {
		t.Fatalf("stdout = %q, want OUT", stdout.String())
	}
	if sink.startProvider != "fake" || sink.startModel == "" {
		t.Fatalf("unexpected start status: provider=%q model=%q", sink.startProvider, sink.startModel)
	}
	if sink.globalCalls != 1 {
		t.Fatalf("expected one global status update, got %d", sink.globalCalls)
	}
}