package wails_test import ( "context" "errors" "strings" "testing" "lmika.dev/actions/wails-release/internal/runner" "lmika.dev/actions/wails-release/internal/wails" ) func TestParseInstalledVersion(t *testing.T) { cases := map[string]string{ "Wails CLI v2.11.0": "v2.11.0", "Wails CLI v2.10.1\n": "v2.10.1", "Wails v2.9.0": "v2.9.0", } for in, want := range cases { got, err := wails.ParseCLIVersion([]byte(in)) if err != nil { t.Fatalf("unexpected error parsing %q: %v", in, err) } if got != want { t.Fatalf("input %q: got %q want %q", in, got, want) } } } func TestParseInstalledVersion_Unparseable(t *testing.T) { _, err := wails.ParseCLIVersion([]byte("nope")) if err == nil { t.Fatal("expected error") } } func TestEnsureCLI_AlreadyInstalledMatchingSkipsInstall(t *testing.T) { f := &runner.Fake{} f.On("wails", []string{"-v"}).Return([]byte("Wails CLI v2.11.0"), nil) err := wails.EnsureCLI(context.Background(), f, "v2.11.0") if err != nil { t.Fatalf("unexpected: %v", err) } for _, c := range f.Calls { if c.Name == "go" { t.Fatalf("expected no `go install`, got call: %+v", c) } } } func TestEnsureCLI_MismatchTriggersInstall(t *testing.T) { f := &runner.Fake{} f.On("wails", []string{"-v"}).Return([]byte("Wails CLI v2.10.0"), nil) f.On("go", []string{"install", "github.com/wailsapp/wails/v2/cmd/wails@v2.11.0"}).Return(nil, nil) err := wails.EnsureCLI(context.Background(), f, "v2.11.0") if err != nil { t.Fatalf("unexpected: %v", err) } saw := false for _, c := range f.Calls { if c.Name == "go" && c.Args[0] == "install" && strings.Contains(c.Args[1], "@v2.11.0") { saw = true } } if !saw { t.Fatal("expected go install call, did not see one") } } func TestEnsureCLI_NotInstalledTriggersInstall(t *testing.T) { f := &runner.Fake{} f.On("wails", []string{"-v"}).Return(nil, errors.New("exec: not found")) f.On("go", []string{"install", "github.com/wailsapp/wails/v2/cmd/wails@v2.11.0"}).Return(nil, nil) err := wails.EnsureCLI(context.Background(), f, "v2.11.0") if err != nil { t.Fatalf("unexpected: %v", err) } }