diff --git a/internal/model/job.go b/internal/model/job.go index e228f365..8a7f7f5a 100644 --- a/internal/model/job.go +++ b/internal/model/job.go @@ -203,9 +203,10 @@ type ExistingGroupPR struct { } type Allowed struct { - DependencyType string `json:"dependency-type,omitempty" yaml:"dependency-type,omitempty"` - DependencyName string `json:"dependency-name,omitempty" yaml:"dependency-name,omitempty"` - UpdateType string `json:"update-type,omitempty" yaml:"update-type,omitempty"` + DependencyType string `json:"dependency-type,omitempty" yaml:"dependency-type,omitempty"` + DependencyName string `json:"dependency-name,omitempty" yaml:"dependency-name,omitempty"` + UpdateType string `json:"update-type,omitempty" yaml:"update-type,omitempty"` + UpdateTypes []string `json:"update-types,omitempty" yaml:"update-types,omitempty"` } type Group struct { diff --git a/internal/model/job_test.go b/internal/model/job_test.go index 92209f95..7026b508 100644 --- a/internal/model/job_test.go +++ b/internal/model/job_test.go @@ -21,6 +21,73 @@ func TestInput(t *testing.T) { compareMap(t, "job", input2["job"], input.Job) } +func TestAllowedUpdateTypes(t *testing.T) { + var input Input + if err := yaml.Unmarshal([]byte(exampleJob), &input); err != nil { + t.Fatal(err) + } + + allowed := input.Job.AllowedUpdates + if len(allowed) != 2 { + t.Fatalf("expected 2 allowed updates, got %d", len(allowed)) + } + + // First entry: dependency-type + update-type (existing pattern) + if allowed[0].DependencyType != "direct" { + t.Errorf("expected dependency-type 'direct', got %q", allowed[0].DependencyType) + } + if allowed[0].UpdateType != "all" { + t.Errorf("expected update-type 'all', got %q", allowed[0].UpdateType) + } + if len(allowed[0].UpdateTypes) != 0 { + t.Errorf("expected no update-types on first entry, got %v", allowed[0].UpdateTypes) + } + + // Second entry: dependency-name + update-types (new feature) + if allowed[1].DependencyName != "rails" { + t.Errorf("expected dependency-name 'rails', got %q", allowed[1].DependencyName) + } + expectedTypes := []string{"version-update:semver-minor", "version-update:semver-patch"} + if len(allowed[1].UpdateTypes) != len(expectedTypes) { + t.Fatalf("expected %d update-types, got %d", len(expectedTypes), len(allowed[1].UpdateTypes)) + } + for i, et := range expectedTypes { + if allowed[1].UpdateTypes[i] != et { + t.Errorf("update-types[%d]: expected %q, got %q", i, et, allowed[1].UpdateTypes[i]) + } + } +} + +func TestAllowedUpdateTypesJSON(t *testing.T) { + original := Allowed{ + DependencyName: "rails", + UpdateTypes: []string{"version-update:semver-minor", "version-update:semver-patch"}, + } + + data, err := json.Marshal(original) + if err != nil { + t.Fatal(err) + } + + // Verify marshaled JSON directly without using unmarshal + expected := `{"dependency-name":"rails","update-types":["version-update:semver-minor","version-update:semver-patch"]}` + if string(data) != expected { + t.Errorf("unexpected JSON output:\n got: %s\n want: %s", string(data), expected) + } + + // Verify omitempty: UpdateTypes should be absent when nil + empty := Allowed{DependencyName: "rails"} + data, err = json.Marshal(empty) + if err != nil { + t.Fatal(err) + } + + expectedEmpty := `{"dependency-name":"rails"}` + if string(data) != expectedEmpty { + t.Errorf("unexpected JSON output for empty UpdateTypes:\n got: %s\n want: %s", string(data), expectedEmpty) + } +} + func TestExistingPullRequestsNewFormat(t *testing.T) { testYAML := `--- job: @@ -663,6 +730,10 @@ job: allowed-updates: - dependency-type: direct update-type: all + - dependency-name: "rails" + update-types: + - "version-update:semver-minor" + - "version-update:semver-patch" dependency-groups: - name: npm rules: