Files
avo/tests/thirdparty/config_test.go
Michael McLoughlin b985ff5775 ci: bump to go 1.23 (#453)
Upgrade to Go 1.23.

Upgrade also requires bumping `golangci-lint` to v1.62.2, and upgrading
third-party test versions for some failing cases.
2024-12-22 16:01:48 -08:00

185 lines
3.8 KiB
Go

package thirdparty
import (
"bytes"
"reflect"
"strings"
"testing"
)
func TestValidateErrors(t *testing.T) {
cases := []struct {
Name string
Item interface{ Validate() error }
ErrorSubstring string
}{
{
Name: "step_missing_name",
Item: &Step{},
ErrorSubstring: "missing name",
},
{
Name: "step_missing_commands",
Item: &Step{
Name: "Setup",
},
ErrorSubstring: "missing commands",
},
{
Name: "project_missing_default_branch",
Item: &Project{
Repository: GithubRepository{Owner: "octocat", Name: "hello-world"},
},
ErrorSubstring: "missing default branch",
},
{
Name: "project_missing_version",
Item: &Project{
Repository: GithubRepository{Owner: "octocat", Name: "hello-world"},
DefaultBranch: "main",
},
ErrorSubstring: "missing version",
},
{
Name: "project_missing_packages",
Item: &Project{
Repository: GithubRepository{Owner: "octocat", Name: "hello-world"},
DefaultBranch: "main",
Version: "v0.1.1",
},
ErrorSubstring: "missing packages",
},
{
Name: "project_package_error",
Item: &Project{
Repository: GithubRepository{Owner: "octocat", Name: "hello-world"},
DefaultBranch: "main",
Version: "v0.1.1",
Packages: []*Package{
{},
},
},
ErrorSubstring: "package root: missing module",
},
{
Name: "package_missing_module",
Item: &Package{},
ErrorSubstring: "missing module",
},
{
Name: "package_no_generate_commands",
Item: &Package{
Module: "avo/go.mod",
},
ErrorSubstring: "no generate commands",
},
{
Name: "package_invalid_generate_commands",
Item: &Package{
Module: "avo/go.mod",
Generate: []*Step{
{},
},
},
ErrorSubstring: "generate step: missing name",
},
{
Name: "projects_invalid_package",
Item: Projects{
{
Repository: GithubRepository{Owner: "octocat", Name: "hello-world"},
},
},
ErrorSubstring: "missing default branch",
},
}
for _, c := range cases {
t.Run(c.Name, func(t *testing.T) {
err := c.Item.Validate()
if err == nil {
t.Fatal("expected error; got nil")
}
if !strings.Contains(err.Error(), c.ErrorSubstring) {
t.Fatalf("expected error message to contain %q; got %q", c.ErrorSubstring, err)
}
})
}
}
func TestLoadSuiteBad(t *testing.T) {
r := strings.NewReader(`[{"unknown_field": "value"}]`)
_, err := LoadSuite(r)
if err == nil {
t.Fatal("expected non-nil error")
}
}
func TestLoadSuiteFileNotExist(t *testing.T) {
s, err := LoadSuiteFile("does_not_exist")
if s != nil {
t.Fatal("expected nil return")
}
if err == nil {
t.Fatal("expected non-nil error")
}
}
func TestSuiteFileValid(t *testing.T) {
s, err := LoadSuiteFile("suite.json")
if err != nil {
t.Fatal(err)
}
for _, prj := range s.Projects {
t.Logf("read: %s", prj.ID())
}
if len(s.Projects) == 0 {
t.Fatal("no packages loaded")
}
if err := s.Validate(); err != nil {
t.Fatal(err)
}
}
func TestSuiteFileStepsValid(t *testing.T) {
suite, err := LoadSuiteFile("suite.json")
if err != nil {
t.Fatal(err)
}
c := &Context{
AvoDirectory: "avo",
RepositoryDirectory: "repo",
}
for _, prj := range suite.Projects {
for _, pkg := range prj.Packages {
for _, s := range pkg.Steps(c) {
if err := s.Validate(); err != nil {
t.Errorf("project %s: package %s: %s", prj.ID(), pkg.Name(), err)
}
}
}
}
}
func TestSuiteFileRoundtrip(t *testing.T) {
s, err := LoadSuiteFile("suite.json")
if err != nil {
t.Fatal(err)
}
// Write and read back.
buf := bytes.NewBuffer(nil)
if err := StoreSuite(buf, s); err != nil {
t.Fatal(err)
}
roundtrip, err := LoadSuite(buf)
if err != nil {
t.Fatal(err)
}
// Should be identical.
if !reflect.DeepEqual(s, roundtrip) {
t.Fatal("roundtrip mismatch")
}
}