Skip to content

Commit 4fd6e6e

Browse files
committed
internal/helm: add more tests
Signed-off-by: Hidde Beydals <hello@hidde.co>
1 parent ef05173 commit 4fd6e6e

File tree

7 files changed

+222
-55
lines changed

7 files changed

+222
-55
lines changed

internal/helm/chart/builder_local_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"helm.sh/helm/v3/pkg/chartutil"
3131
"helm.sh/helm/v3/pkg/repo"
3232

33-
"github.com/fluxcd/source-controller/internal/helm/getter"
3433
"github.com/fluxcd/source-controller/internal/helm/repository"
3534
)
3635

@@ -43,7 +42,7 @@ func TestLocalBuilder_Build(t *testing.T) {
4342
g.Expect(chartB).ToNot(BeEmpty())
4443
mockRepo := func() *repository.ChartRepository {
4544
return &repository.ChartRepository{
46-
Client: &getter.MockGetter{
45+
Client: &mockGetter{
4746
Response: chartB,
4847
},
4948
Index: &repo.IndexFile{

internal/helm/chart/builder_remote_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"bytes"
2121
"context"
2222
"os"
23+
"path/filepath"
2324
"strings"
2425
"sync"
2526
"testing"
@@ -337,6 +338,30 @@ func Test_mergeChartValues(t *testing.T) {
337338
}
338339
}
339340

341+
func Test_validatePackageAndWriteToPath(t *testing.T) {
342+
g := NewWithT(t)
343+
344+
tmpDir, err := os.MkdirTemp("", "validate-pkg-chart-")
345+
g.Expect(err).ToNot(HaveOccurred())
346+
defer os.RemoveAll(tmpDir)
347+
348+
validF, err := os.Open("./../testdata/charts/helmchart-0.1.0.tgz")
349+
g.Expect(err).ToNot(HaveOccurred())
350+
defer validF.Close()
351+
352+
chartPath := filepath.Join(tmpDir, "chart.tgz")
353+
defer os.Remove(chartPath)
354+
err = validatePackageAndWriteToPath(validF, chartPath)
355+
g.Expect(err).ToNot(HaveOccurred())
356+
g.Expect(chartPath).To(BeARegularFile())
357+
358+
emptyF, err := os.Open("./../testdata/charts/empty.tgz")
359+
defer emptyF.Close()
360+
g.Expect(err).ToNot(HaveOccurred())
361+
err = validatePackageAndWriteToPath(emptyF, filepath.Join(tmpDir, "out.tgz"))
362+
g.Expect(err).To(HaveOccurred())
363+
}
364+
340365
func Test_pathIsDir(t *testing.T) {
341366
tests := []struct {
342367
name string

internal/helm/chart/builder_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,82 @@ import (
2828
"helm.sh/helm/v3/pkg/chartutil"
2929
)
3030

31+
func TestLocalReference_Validate(t *testing.T) {
32+
tests := []struct {
33+
name string
34+
ref LocalReference
35+
wantErr string
36+
}{
37+
{
38+
name: "ref with path",
39+
ref: LocalReference{Path: "/a/path"},
40+
},
41+
{
42+
name: "ref with path and work dir",
43+
ref: LocalReference{Path: "/a/path", WorkDir: "/with/a/workdir"},
44+
},
45+
{
46+
name: "ref without path",
47+
ref: LocalReference{WorkDir: "/just/a/workdir"},
48+
wantErr: "no path set for local chart reference",
49+
},
50+
}
51+
for _, tt := range tests {
52+
t.Run(tt.name, func(t *testing.T) {
53+
g := NewWithT(t)
54+
55+
err := tt.ref.Validate()
56+
if tt.wantErr != "" {
57+
g.Expect(err).To(HaveOccurred())
58+
g.Expect(err.Error()).To(ContainSubstring(tt.wantErr))
59+
return
60+
}
61+
g.Expect(err).ToNot(HaveOccurred())
62+
})
63+
}
64+
}
65+
66+
func TestRemoteReference_Validate(t *testing.T) {
67+
tests := []struct {
68+
name string
69+
ref RemoteReference
70+
wantErr string
71+
}{
72+
{
73+
name: "ref with name",
74+
ref: RemoteReference{Name: "valid-chart-name"},
75+
},
76+
{
77+
name: "ref with invalid name",
78+
ref: RemoteReference{Name: "iNvAlID-ChArT-NAmE!"},
79+
wantErr: "invalid chart name 'iNvAlID-ChArT-NAmE!'",
80+
},
81+
{
82+
name: "ref with Artifactory specific invalid format",
83+
ref: RemoteReference{Name: "i-shall/not"},
84+
wantErr: "invalid chart name 'i-shall/not'",
85+
},
86+
{
87+
name: "ref without name",
88+
ref: RemoteReference{},
89+
wantErr: "no name set for remote chart reference",
90+
},
91+
}
92+
for _, tt := range tests {
93+
t.Run(tt.name, func(t *testing.T) {
94+
g := NewWithT(t)
95+
96+
err := tt.ref.Validate()
97+
if tt.wantErr != "" {
98+
g.Expect(err).To(HaveOccurred())
99+
g.Expect(err.Error()).To(ContainSubstring(tt.wantErr))
100+
return
101+
}
102+
g.Expect(err).ToNot(HaveOccurred())
103+
})
104+
}
105+
}
106+
31107
func TestBuildOptions_GetValueFiles(t *testing.T) {
32108
tests := []struct {
33109
name string

internal/helm/chart/dependency_manager.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ func (dm *DependencyManager) Clear() []error {
9595
var errs []error
9696
for _, v := range dm.repositories {
9797
v.Unload()
98-
errs = append(errs, v.RemoveCache())
98+
if err := v.RemoveCache(); err != nil {
99+
errs = append(errs, err)
100+
}
99101
}
100102
return errs
101103
}

internal/helm/chart/dependency_manager_test.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package chart
1818

1919
import (
20+
"bytes"
2021
"context"
2122
"errors"
2223
"fmt"
@@ -28,12 +29,48 @@ import (
2829
. "github.com/onsi/gomega"
2930
helmchart "helm.sh/helm/v3/pkg/chart"
3031
"helm.sh/helm/v3/pkg/chart/loader"
32+
helmgetter "helm.sh/helm/v3/pkg/getter"
3133
"helm.sh/helm/v3/pkg/repo"
3234

33-
"github.com/fluxcd/source-controller/internal/helm/getter"
3435
"github.com/fluxcd/source-controller/internal/helm/repository"
3536
)
3637

38+
// mockGetter is a simple mocking getter.Getter implementation, returning
39+
// a byte response to any provided URL.
40+
type mockGetter struct {
41+
Response []byte
42+
}
43+
44+
func (g *mockGetter) Get(_ string, _ ...helmgetter.Option) (*bytes.Buffer, error) {
45+
r := g.Response
46+
return bytes.NewBuffer(r), nil
47+
}
48+
49+
func TestDependencyManager_Clear(t *testing.T) {
50+
g := NewWithT(t)
51+
52+
repos := map[string]*repository.ChartRepository{
53+
"with index": {
54+
Index: repo.NewIndexFile(),
55+
RWMutex: &sync.RWMutex{},
56+
},
57+
"cached cache path": {
58+
CachePath: "/invalid/path/resets",
59+
Cached: true,
60+
RWMutex: &sync.RWMutex{},
61+
},
62+
}
63+
64+
dm := NewDependencyManager(WithRepositories(repos))
65+
g.Expect(dm.Clear()).To(BeNil())
66+
g.Expect(dm.repositories).To(HaveLen(len(repos)))
67+
for _, v := range repos {
68+
g.Expect(v.Index).To(BeNil())
69+
g.Expect(v.CachePath).To(BeEmpty())
70+
g.Expect(v.Cached).To(BeFalse())
71+
}
72+
}
73+
3774
func TestDependencyManager_Build(t *testing.T) {
3875
g := NewWithT(t)
3976

@@ -45,7 +82,7 @@ func TestDependencyManager_Build(t *testing.T) {
4582

4683
mockRepo := func() *repository.ChartRepository {
4784
return &repository.ChartRepository{
48-
Client: &getter.MockGetter{
85+
Client: &mockGetter{
4986
Response: chartGrafana,
5087
},
5188
Index: &repo.IndexFile{
@@ -286,7 +323,7 @@ func TestDependencyManager_addRemoteDependency(t *testing.T) {
286323
name: "adds remote dependency",
287324
repositories: map[string]*repository.ChartRepository{
288325
"https://example.com/": {
289-
Client: &getter.MockGetter{
326+
Client: &mockGetter{
290327
Response: chartB,
291328
},
292329
Index: &repo.IndexFile{
@@ -403,7 +440,7 @@ func TestDependencyManager_addRemoteDependency(t *testing.T) {
403440
name: "chart load error",
404441
repositories: map[string]*repository.ChartRepository{
405442
"https://example.com/": {
406-
Client: &getter.MockGetter{},
443+
Client: &mockGetter{},
407444
Index: &repo.IndexFile{
408445
Entries: map[string]repo.ChartVersions{
409446
chartName: {

internal/helm/getter/mock.go

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)