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 }