diff --git a/pkg/cargo/validate.go b/pkg/cargo/validate.go index c4a630c2..c3f036e0 100644 --- a/pkg/cargo/validate.go +++ b/pkg/cargo/validate.go @@ -12,14 +12,14 @@ func Validate(spec Kilnfile, lock KilnfileLock) []error { for index, componentSpec := range spec.Releases { if componentSpec.Name == "" { - result = append(result, fmt.Errorf("spec at index %d missing name", index)) + result = append(result, fmt.Errorf("release at index %d missing name in spec", index)) continue } componentLock, err := lock.FindBOSHReleaseWithName(componentSpec.Name) if err != nil { result = append(result, - fmt.Errorf("component spec for release %q not found in lock", componentSpec.Name)) + fmt.Errorf("release %q not found in lock", componentSpec.Name)) continue } @@ -28,6 +28,20 @@ func Validate(spec Kilnfile, lock KilnfileLock) []error { } } + for index, componentLock := range lock.Releases { + if componentLock.Name == "" { + result = append(result, fmt.Errorf("release at index %d missing name in lock", index)) + continue + } + + _, err := spec.BOSHReleaseTarballSpecification(componentLock.Name) + if err != nil { + result = append(result, + fmt.Errorf("release %q not found in spec", componentLock.Name)) + continue + } + } + result = append(result, ensureRemoteSourceExistsForEachReleaseLock(spec, lock)...) if len(result) > 0 { diff --git a/pkg/cargo/validate_test.go b/pkg/cargo/validate_test.go index b8b0ca7f..bb352136 100644 --- a/pkg/cargo/validate_test.go +++ b/pkg/cargo/validate_test.go @@ -10,7 +10,7 @@ const ( someReleaseSourceID = "some-release-source-id" ) -func TestValidate_MissingName(t *testing.T) { +func TestValidate_MissingNameInSpec(t *testing.T) { t.Parallel() please := NewWithT(t) results := Validate(Kilnfile{ @@ -18,14 +18,36 @@ func TestValidate_MissingName(t *testing.T) { {ID: someReleaseSourceID}, }, Releases: []BOSHReleaseTarballSpecification{ - {}, + {Name: ""}, + {Name: "banana"}, }, }, KilnfileLock{ Releases: []BOSHReleaseTarballLock{ + {Name: "apple", Version: "1.2.3", RemoteSource: someReleaseSourceID}, {Name: "banana", Version: "1.2.3", RemoteSource: someReleaseSourceID}, }, }) - please.Expect(results).To(HaveLen(1)) + please.Expect(results).To(HaveLen(2)) +} + +func TestValidate_MissingNameInLock(t *testing.T) { + t.Parallel() + please := NewWithT(t) + results := Validate(Kilnfile{ + ReleaseSources: []ReleaseSourceConfig{ + {ID: someReleaseSourceID}, + }, + Releases: []BOSHReleaseTarballSpecification{ + {Name: "apple"}, + {Name: "banana"}, + }, + }, KilnfileLock{ + Releases: []BOSHReleaseTarballLock{ + {Name: "", Version: "1.2.3", RemoteSource: someReleaseSourceID}, + {Name: "banana", Version: "1.2.3", RemoteSource: someReleaseSourceID}, + }, + }) + please.Expect(results).To(HaveLen(2)) } func TestValidate_FloatingRelease(t *testing.T) { @@ -46,14 +68,41 @@ func TestValidate_FloatingRelease(t *testing.T) { please.Expect(results).To(HaveLen(0)) } +func TestValidate_MissingSpec(t *testing.T) { + t.Parallel() + please := NewWithT(t) + results := Validate(Kilnfile{ + ReleaseSources: []ReleaseSourceConfig{ + {ID: someReleaseSourceID}, + }, + Releases: []BOSHReleaseTarballSpecification{ + {Name: "banana"}, + }, + }, KilnfileLock{ + Releases: []BOSHReleaseTarballLock{ + {Name: "apple", Version: "1.2.3", RemoteSource: someReleaseSourceID}, + {Name: "banana", Version: "1.2.3", RemoteSource: someReleaseSourceID}, + }, + }) + please.Expect(results).To(HaveLen(1)) +} + func TestValidate_MissingLock(t *testing.T) { t.Parallel() please := NewWithT(t) results := Validate(Kilnfile{ + ReleaseSources: []ReleaseSourceConfig{ + {ID: someReleaseSourceID}, + }, Releases: []BOSHReleaseTarballSpecification{ {Name: "banana", Version: "1.1.*"}, + {Name: "apple", Version: "1.1.*"}, }, - }, KilnfileLock{}) + }, KilnfileLock{ + Releases: []BOSHReleaseTarballLock{ + {Name: "banana", Version: "1.1.3", RemoteSource: someReleaseSourceID}, + }, + }) please.Expect(results).To(HaveLen(1)) }