package release import ( "os" "path/filepath" "slices" "testing" "gopkg.in/yaml.v3" ) type goReleaserConfig struct { Builds []struct { Main string `yaml:"main"` GOOS []string `yaml:"goos"` GOARCH []string `yaml:"goarch"` } `yaml:"builds"` Archives []struct { Format string `yaml:"format"` NameTemplate string `yaml:"name_template"` } `yaml:"archives"` } func TestGoReleaserBuildMatrix(t *testing.T) { cfg := loadGoReleaserConfig(t) build, ok := findPinchTabBuild(cfg) if !ok { t.Fatal("missing build config for ./cmd/pinchtab in .goreleaser.yml") } wantOS := []string{"darwin", "linux", "windows"} wantArch := []string{"amd64", "arm64"} gotOS := slices.Clone(build.GOOS) gotArch := slices.Clone(build.GOARCH) slices.Sort(gotOS) slices.Sort(gotArch) if !slices.Equal(gotOS, wantOS) { t.Fatalf("unexpected goos matrix: got %v want %v", gotOS, wantOS) } if !slices.Equal(gotArch, wantArch) { t.Fatalf("unexpected goarch matrix: got %v want %v", gotArch, wantArch) } total := len(build.GOOS) * len(build.GOARCH) if total != 6 { t.Fatalf("unexpected binary count: got %d want 6", total) } } func TestGoReleaserBinaryNaming(t *testing.T) { cfg := loadGoReleaserConfig(t) build, ok := findPinchTabBuild(cfg) if !ok { t.Fatal("missing build config for ./cmd/pinchtab in .goreleaser.yml") } archive, ok := findBinaryArchive(cfg) if !ok { t.Fatal("missing binary archive config in .goreleaser.yml") } if archive.NameTemplate != "pinchtab-{{ .Os }}-{{ .Arch }}" { t.Fatalf("unexpected binary name template: got %q", archive.NameTemplate) } var got []string for _, goos := range build.GOOS { for _, goarch := range build.GOARCH { name := "pinchtab-" + goos + "-" + goarch if goos == "windows" { name += ".exe" } got = append(got, name) } } slices.Sort(got) want := []string{ "pinchtab-darwin-amd64", "pinchtab-darwin-arm64", "pinchtab-linux-amd64", "pinchtab-linux-arm64", "pinchtab-windows-amd64.exe", "pinchtab-windows-arm64.exe", } if !slices.Equal(got, want) { t.Fatalf("unexpected artifact names: got %v want %v", got, want) } } func loadGoReleaserConfig(t *testing.T) goReleaserConfig { t.Helper() configPath := filepath.Join("..", "..", ".goreleaser.yml") data, err := os.ReadFile(configPath) if err != nil { t.Fatalf("failed to read %s: %v", configPath, err) } var cfg goReleaserConfig if err := yaml.Unmarshal(data, &cfg); err != nil { t.Fatalf("failed to parse %s: %v", configPath, err) } return cfg } func findPinchTabBuild(cfg goReleaserConfig) (struct { Main string "yaml:\"main\"" GOOS []string "yaml:\"goos\"" GOARCH []string "yaml:\"goarch\"" }, bool) { for _, build := range cfg.Builds { if build.Main == "./cmd/pinchtab" { return build, true } } return struct { Main string "yaml:\"main\"" GOOS []string "yaml:\"goos\"" GOARCH []string "yaml:\"goarch\"" }{}, false } func findBinaryArchive(cfg goReleaserConfig) (struct { Format string "yaml:\"format\"" NameTemplate string "yaml:\"name_template\"" }, bool) { for _, archive := range cfg.Archives { if archive.Format == "binary" { return archive, true } } return struct { Format string "yaml:\"format\"" NameTemplate string "yaml:\"name_template\"" }{}, false }