summaryrefslogtreecommitdiff
path: root/internal/release/release_ai_tool_test.go
blob: 1d15280e1027af1410f16ebc09238bc780a3de0b (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
62
63
64
package release

import (
	"os/exec"
	"reflect"
	"testing"

	"codeberg.org/snonux/gitsyncer/internal/aitool"
)

func TestAvailableReleaseNotesTools_DefaultChainWithFallback(t *testing.T) {
	t.Parallel()

	manager := NewManager("")
	got := manager.availableReleaseNotesTools(fakeLookPathRelease("ollama", "claude"))
	want := []aitool.Tool{aitool.ToolOpencode, aitool.ToolClaude}

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("availableReleaseNotesTools() = %#v, want %#v", got, want)
	}
}

func TestAvailableReleaseNotesTools_HonorsConfiguredPreferenceWithFallback(t *testing.T) {
	t.Parallel()

	manager := NewManager("")
	manager.SetAITool("hexai")

	got := manager.availableReleaseNotesTools(fakeLookPathRelease("claude", "amp"))
	want := []aitool.Tool{aitool.ToolClaude, aitool.ToolAmp}

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("availableReleaseNotesTools() = %#v, want %#v", got, want)
	}
}

func TestAvailableReleaseNotesTools_AmpChainOnly(t *testing.T) {
	t.Parallel()

	manager := NewManager("")
	manager.SetAITool("amp")

	got := manager.availableReleaseNotesTools(fakeLookPathRelease("ollama", "amp"))
	want := []aitool.Tool{aitool.ToolAmp}

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("availableReleaseNotesTools() = %#v, want %#v", got, want)
	}
}

func fakeLookPathRelease(tools ...string) func(string) (string, error) {
	available := make(map[string]struct{}, len(tools))
	for _, tool := range tools {
		available[tool] = struct{}{}
	}

	return func(file string) (string, error) {
		if _, ok := available[file]; ok {
			return "/usr/bin/" + file, nil
		}

		return "", exec.ErrNotFound
	}
}