github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/plan/build_releases_internal_test.go (about)

     1  package plan
     2  
     3  import (
     4  	"path/filepath"
     5  	"testing"
     6  
     7  	"github.com/helmwave/helmwave/pkg/release"
     8  	"github.com/helmwave/helmwave/pkg/release/uniqname"
     9  	log "github.com/sirupsen/logrus"
    10  	"github.com/stretchr/testify/suite"
    11  )
    12  
    13  type BuildReleasesTestSuite struct {
    14  	suite.Suite
    15  }
    16  
    17  func TestBuildReleasesTestSuite(t *testing.T) {
    18  	t.Parallel()
    19  	suite.Run(t, new(BuildReleasesTestSuite))
    20  }
    21  
    22  func (ts *BuildReleasesTestSuite) TestCheckTagInclusion() {
    23  	cases := []struct {
    24  		targetTags  []string
    25  		releaseTags []string
    26  		matchAll    bool
    27  		result      bool
    28  	}{
    29  		{
    30  			targetTags:  []string{},
    31  			releaseTags: []string{"bla"},
    32  			matchAll:    false,
    33  			result:      true,
    34  		},
    35  		{
    36  			targetTags:  []string{},
    37  			releaseTags: []string{"bla"},
    38  			matchAll:    true,
    39  			result:      true,
    40  		},
    41  		{
    42  			targetTags:  []string{"bla"},
    43  			releaseTags: []string{},
    44  			matchAll:    false,
    45  			result:      false,
    46  		},
    47  		{
    48  			targetTags:  []string{"bla"},
    49  			releaseTags: []string{},
    50  			matchAll:    true,
    51  			result:      false,
    52  		},
    53  		{
    54  			targetTags:  []string{"bla"},
    55  			releaseTags: []string{"abc"},
    56  			matchAll:    false,
    57  			result:      false,
    58  		},
    59  		{
    60  			targetTags:  []string{"bla"},
    61  			releaseTags: []string{"abc"},
    62  			matchAll:    true,
    63  			result:      false,
    64  		},
    65  		{
    66  			targetTags:  []string{"bla"},
    67  			releaseTags: []string{"bla"},
    68  			matchAll:    false,
    69  			result:      true,
    70  		},
    71  		{
    72  			targetTags:  []string{"1", "2", "3"},
    73  			releaseTags: []string{"3", "2"},
    74  			matchAll:    false,
    75  			result:      true,
    76  		},
    77  		{
    78  			targetTags:  []string{"1", "2", "3"},
    79  			releaseTags: []string{"3", "2"},
    80  			matchAll:    true,
    81  			result:      false,
    82  		},
    83  		{
    84  			targetTags:  []string{"1", "2", "3"},
    85  			releaseTags: []string{"2"},
    86  			matchAll:    false,
    87  			result:      true,
    88  		},
    89  		{
    90  			targetTags:  []string{"1", "2", "3"},
    91  			releaseTags: []string{"2"},
    92  			matchAll:    true,
    93  			result:      false,
    94  		},
    95  		{
    96  			targetTags:  []string{"1", "2", "3"},
    97  			releaseTags: []string{"3", "2", "1"},
    98  			matchAll:    false,
    99  			result:      true,
   100  		},
   101  		{
   102  			targetTags:  []string{"1", "2", "3"},
   103  			releaseTags: []string{"3", "2", "1"},
   104  			matchAll:    true,
   105  			result:      true,
   106  		},
   107  		{
   108  			targetTags:  []string{"1", "2", "3"},
   109  			releaseTags: []string{"3", "4", "1", "2"},
   110  			matchAll:    false,
   111  			result:      true,
   112  		},
   113  		{
   114  			targetTags:  []string{"1", "2", "3"},
   115  			releaseTags: []string{"3", "4", "1", "2"},
   116  			matchAll:    true,
   117  			result:      true,
   118  		},
   119  	}
   120  
   121  	for i := range cases {
   122  		c := cases[i]
   123  		res := checkTagInclusion(c.targetTags, c.releaseTags, c.matchAll)
   124  		ts.Equal(c.result, res, c)
   125  	}
   126  }
   127  
   128  func (ts *BuildReleasesTestSuite) TestNoReleases() {
   129  	tmpDir := ts.T().TempDir()
   130  	p := New(filepath.Join(tmpDir, Dir))
   131  	p.NewBody()
   132  
   133  	releases, err := p.buildReleases([]string{}, false)
   134  
   135  	ts.Require().NoError(err)
   136  	ts.Require().Empty(releases)
   137  }
   138  
   139  func (ts *BuildReleasesTestSuite) TestNoMatchingReleases() {
   140  	tmpDir := ts.T().TempDir()
   141  	p := New(filepath.Join(tmpDir, Dir))
   142  
   143  	mockedRelease := &MockReleaseConfig{}
   144  	mockedRelease.On("Tags").Return([]string{"bla"})
   145  
   146  	p.SetReleases(mockedRelease)
   147  
   148  	releases, err := p.buildReleases([]string{"abc"}, true)
   149  	ts.Require().NoError(err)
   150  	ts.Require().Empty(releases)
   151  
   152  	mockedRelease.AssertExpectations(ts.T())
   153  }
   154  
   155  func (ts *BuildReleasesTestSuite) TestDuplicateReleases() {
   156  	tmpDir := ts.T().TempDir()
   157  	p := New(filepath.Join(tmpDir, Dir))
   158  
   159  	tags := []string{"bla"}
   160  	u := uniqname.UniqName(ts.T().Name())
   161  
   162  	rel1 := &MockReleaseConfig{}
   163  	rel1.On("Tags").Return(tags)
   164  	rel1.On("Uniq").Return(u)
   165  	rel1.On("DependsOn").Return([]*release.DependsOnReference{})
   166  	rel1.On("SetDependsOn", []*release.DependsOnReference{}).Return()
   167  
   168  	rel2 := &MockReleaseConfig{}
   169  	rel2.On("Tags").Return(tags)
   170  	rel2.On("Uniq").Return(u)
   171  
   172  	p.SetReleases(rel1, rel2)
   173  
   174  	releases, err := p.buildReleases(tags, true)
   175  
   176  	var e *release.DuplicateError
   177  	ts.Require().ErrorAs(err, &e)
   178  	ts.Equal(u, e.Uniq)
   179  
   180  	ts.Empty(releases)
   181  
   182  	rel1.AssertExpectations(ts.T())
   183  	rel2.AssertExpectations(ts.T())
   184  }
   185  
   186  func (ts *BuildReleasesTestSuite) TestMissingRequiredDependency() {
   187  	tmpDir := ts.T().TempDir()
   188  	p := New(filepath.Join(tmpDir, Dir))
   189  
   190  	tags := []string{"bla"}
   191  	u := uniqname.UniqName(ts.T().Name())
   192  
   193  	rel := &MockReleaseConfig{}
   194  	rel.On("Tags").Return(tags)
   195  	rel.On("Uniq").Return(u)
   196  	rel.On("DependsOn").Return([]*release.DependsOnReference{{Name: "blabla", Optional: false}})
   197  	rel.On("Logger").Return(log.WithField("test", ts.T().Name()))
   198  
   199  	p.SetReleases(rel)
   200  
   201  	releases, err := p.buildReleases(tags, true)
   202  	ts.Require().ErrorIs(err, release.ErrDepFailed)
   203  	ts.Require().Empty(releases)
   204  
   205  	rel.AssertExpectations(ts.T())
   206  }
   207  
   208  func (ts *BuildReleasesTestSuite) TestMissingOptionalDependency() {
   209  	tmpDir := ts.T().TempDir()
   210  	p := New(filepath.Join(tmpDir, Dir))
   211  
   212  	tags := []string{"bla"}
   213  	u := uniqname.UniqName(ts.T().Name())
   214  
   215  	rel := &MockReleaseConfig{}
   216  	rel.On("Tags").Return(tags)
   217  	rel.On("Uniq").Return(u)
   218  	rel.On("DependsOn").Return([]*release.DependsOnReference{{Name: "blabla", Optional: true}})
   219  	rel.On("SetDependsOn", []*release.DependsOnReference{}).Return()
   220  	rel.On("Logger").Return(log.WithField("test", ts.T().Name()))
   221  
   222  	p.SetReleases(rel)
   223  
   224  	releases, err := p.buildReleases(tags, true)
   225  	ts.Require().NoError(err)
   226  	ts.Require().Len(releases, 1)
   227  	ts.Require().Contains(releases, rel)
   228  
   229  	rel.AssertExpectations(ts.T())
   230  }
   231  
   232  func (ts *BuildReleasesTestSuite) TestUnmatchedDependency() {
   233  	tmpDir := ts.T().TempDir()
   234  	p := New(filepath.Join(tmpDir, Dir))
   235  
   236  	tags := []string{"bla"}
   237  	u1 := uniqname.UniqName(ts.T().Name())
   238  	u2 := uniqname.UniqName("blabla")
   239  	deps := []*release.DependsOnReference{{Name: u2.String()}}
   240  
   241  	rel1 := &MockReleaseConfig{}
   242  	rel1.On("Tags").Return(tags)
   243  	rel1.On("Uniq").Return(u1)
   244  	rel1.On("DependsOn").Return(deps)
   245  	rel1.On("SetDependsOn", deps).Return()
   246  	rel1.On("Logger").Return(log.WithField("test", ts.T().Name()))
   247  
   248  	rel2 := &MockReleaseConfig{}
   249  	rel2.On("Tags").Return([]string{})
   250  	rel2.On("Uniq").Return(u2)
   251  	rel2.On("DependsOn").Return([]*release.DependsOnReference{})
   252  	rel2.On("SetDependsOn", []*release.DependsOnReference{}).Return()
   253  
   254  	p.SetReleases(rel1, rel2)
   255  
   256  	releases, err := p.buildReleases(tags, true)
   257  	ts.Require().NoError(err)
   258  	ts.Require().Len(releases, 2)
   259  	ts.Require().Contains(releases, rel1)
   260  	ts.Require().Contains(releases, rel2)
   261  
   262  	rel1.AssertExpectations(ts.T())
   263  	rel2.AssertExpectations(ts.T())
   264  }