Skip to content

Commit

Permalink
chore: add unit tests for creator.LoadPackageDefinition (#2531)
Browse files Browse the repository at this point in the history
Relates to #2512
  • Loading branch information
Lucas Rodriguez authored May 22, 2024
1 parent b8dd1bb commit 21995e9
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 12 deletions.
5 changes: 0 additions & 5 deletions src/pkg/packager/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,6 @@ func (p *Packager) Create() (err error) {
return err
}

// Perform early package validation.
if err := p.cfg.Pkg.Validate(); err != nil {
return fmt.Errorf("unable to validate package: %w", err)
}

if !p.confirmAction(config.ZarfCreateStage) {
return fmt.Errorf("package creation canceled")
}
Expand Down
2 changes: 1 addition & 1 deletion src/pkg/packager/creator/creator.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

// Creator is an interface for creating Zarf packages.
type Creator interface {
LoadPackageDefinition(dst *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error)
LoadPackageDefinition(src *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error)
Assemble(dst *layout.PackagePaths, components []types.ZarfComponent, arch string) error
Output(dst *layout.PackagePaths, pkg *types.ZarfPackage) error
}
10 changes: 7 additions & 3 deletions src/pkg/packager/creator/normal.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ func NewPackageCreator(createOpts types.ZarfCreateOptions, cwd string) *PackageC
}

// LoadPackageDefinition loads and configures a zarf.yaml file during package create.
func (pc *PackageCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error) {
pkg, warnings, err = dst.ReadZarfYAML()
func (pc *PackageCreator) LoadPackageDefinition(src *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error) {
pkg, warnings, err = src.ReadZarfYAML()
if err != nil {
return types.ZarfPackage{}, nil, err
}
Expand All @@ -86,7 +86,7 @@ func (pc *PackageCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg t
warnings = append(warnings, templateWarnings...)

// After templates are filled process any create extensions
pkg.Components, err = pc.processExtensions(pkg.Components, dst, pkg.Metadata.YOLO)
pkg.Components, err = pc.processExtensions(pkg.Components, src, pkg.Metadata.YOLO)
if err != nil {
return types.ZarfPackage{}, nil, err
}
Expand Down Expand Up @@ -119,6 +119,10 @@ func (pc *PackageCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg t
}
}

if err := pkg.Validate(); err != nil {
return types.ZarfPackage{}, nil, err
}

return pkg, warnings, nil
}

Expand Down
43 changes: 43 additions & 0 deletions src/pkg/packager/creator/normal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"path/filepath"
"testing"

"github.com/defenseunicorns/zarf/src/pkg/layout"
"github.com/defenseunicorns/zarf/src/types"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -56,3 +58,44 @@ func TestDifferentialPackagePathSetCorrectly(t *testing.T) {
})
}
}

func TestLoadPackageDefinition(t *testing.T) {
t.Parallel()

tests := []struct {
name string
testDir string
expectedErr string
}{
{
name: "valid package definition",
testDir: "valid",
expectedErr: "",
},
{
name: "invalid package definition",
testDir: "invalid",
expectedErr: "package must have at least 1 component",
},
}

for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()

src := layout.New(filepath.Join("testdata", tt.testDir))
pc := NewPackageCreator(types.ZarfCreateOptions{}, "")
pkg, _, err := pc.LoadPackageDefinition(src)

if tt.expectedErr == "" {
require.NoError(t, err)
require.NotEmpty(t, pkg)
return
}

require.EqualError(t, err, tt.expectedErr)
require.Empty(t, pkg)
})
}
}
10 changes: 7 additions & 3 deletions src/pkg/packager/creator/skeleton.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ func NewSkeletonCreator(createOpts types.ZarfCreateOptions, publishOpts types.Za
}

// LoadPackageDefinition loads and configure a zarf.yaml file when creating and publishing a skeleton package.
func (sc *SkeletonCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error) {
pkg, warnings, err = dst.ReadZarfYAML()
func (sc *SkeletonCreator) LoadPackageDefinition(src *layout.PackagePaths) (pkg types.ZarfPackage, warnings []string, err error) {
pkg, warnings, err = src.ReadZarfYAML()
if err != nil {
return types.ZarfPackage{}, nil, err
}
Expand All @@ -60,7 +60,7 @@ func (sc *SkeletonCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg

warnings = append(warnings, composeWarnings...)

pkg.Components, err = sc.processExtensions(pkg.Components, dst)
pkg.Components, err = sc.processExtensions(pkg.Components, src)
if err != nil {
return types.ZarfPackage{}, nil, err
}
Expand All @@ -69,6 +69,10 @@ func (sc *SkeletonCreator) LoadPackageDefinition(dst *layout.PackagePaths) (pkg
message.Warn(warning)
}

if err := pkg.Validate(); err != nil {
return types.ZarfPackage{}, nil, err
}

return pkg, warnings, nil
}

Expand Down
55 changes: 55 additions & 0 deletions src/pkg/packager/creator/skeleton_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2021-Present The Zarf Authors

// Package creator contains functions for creating Zarf packages.
package creator

import (
"path/filepath"
"testing"

"github.com/defenseunicorns/zarf/src/pkg/layout"
"github.com/defenseunicorns/zarf/src/types"
"github.com/stretchr/testify/require"
)

func TestSkeletonLoadPackageDefinition(t *testing.T) {
t.Parallel()

tests := []struct {
name string
testDir string
expectedErr string
}{
{
name: "valid package definition",
testDir: "valid",
expectedErr: "",
},
{
name: "invalid package definition",
testDir: "invalid",
expectedErr: "package must have at least 1 component",
},
}

for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()

src := layout.New(filepath.Join("testdata", tt.testDir))
sc := NewSkeletonCreator(types.ZarfCreateOptions{}, types.ZarfPublishOptions{})
pkg, _, err := sc.LoadPackageDefinition(src)

if tt.expectedErr == "" {
require.NoError(t, err)
require.NotEmpty(t, pkg)
return
}

require.EqualError(t, err, tt.expectedErr)
require.Empty(t, pkg)
})
}
}
4 changes: 4 additions & 0 deletions src/pkg/packager/creator/testdata/invalid/zarf.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
kind: ZarfPackageConfig
metadata:
name: minimal-invalid
description: Must have at least 1 component
6 changes: 6 additions & 0 deletions src/pkg/packager/creator/testdata/valid/zarf.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: ZarfPackageConfig
metadata:
name: minimal-valid
description: Minimal valid package
components:
- name: component1
5 changes: 5 additions & 0 deletions src/types/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package types

import (
"errors"
"fmt"
"path/filepath"
"regexp"
Expand Down Expand Up @@ -47,6 +48,10 @@ func (pkg ZarfPackage) Validate() error {
return fmt.Errorf(lang.PkgValidateErrPkgName, pkg.Metadata.Name)
}

if len(pkg.Components) == 0 {
return errors.New("package must have at least 1 component")
}

for _, variable := range pkg.Variables {
if err := variable.Validate(); err != nil {
return fmt.Errorf(lang.PkgValidateErrVariable, err)
Expand Down

0 comments on commit 21995e9

Please sign in to comment.