@@ -32,6 +32,7 @@ import (
3232 "github.com/darkowlzz/controller-check/status"
3333 . "github.com/onsi/gomega"
3434 corev1 "k8s.io/api/core/v1"
35+ apierrors "k8s.io/apimachinery/pkg/api/errors"
3536 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3637 "k8s.io/client-go/tools/record"
3738 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -50,6 +51,95 @@ import (
5051 sreconcile "github.com/fluxcd/source-controller/internal/reconcile"
5152)
5253
54+ func TestHelmChartReconciler_Reconcile (t * testing.T ) {
55+ g := NewWithT (t )
56+
57+ const (
58+ chartName = "helmchart"
59+ chartVersion = "0.2.0"
60+ chartPath = "testdata/charts/helmchart"
61+ )
62+
63+ server , err := helmtestserver .NewTempHelmServer ()
64+ g .Expect (err ).NotTo (HaveOccurred ())
65+ defer os .RemoveAll (server .Root ())
66+
67+ g .Expect (server .PackageChartWithVersion (chartPath , chartVersion )).To (Succeed ())
68+ g .Expect (server .GenerateIndex ()).To (Succeed ())
69+
70+ server .Start ()
71+ defer server .Stop ()
72+
73+ ns , err := testEnv .CreateNamespace (ctx , "helmchart" )
74+ g .Expect (err ).ToNot (HaveOccurred ())
75+ defer func () { g .Expect (testEnv .Delete (ctx , ns )).To (Succeed ()) }()
76+
77+ repository := & sourcev1.HelmRepository {
78+ ObjectMeta : metav1.ObjectMeta {
79+ GenerateName : "helmrepository-" ,
80+ Namespace : ns .Name ,
81+ },
82+ Spec : sourcev1.HelmRepositorySpec {
83+ URL : server .URL (),
84+ },
85+ }
86+ g .Expect (testEnv .CreateAndWait (ctx , repository )).To (Succeed ())
87+
88+ obj := & sourcev1.HelmChart {
89+ ObjectMeta : metav1.ObjectMeta {
90+ GenerateName : "helmrepository-reconcile-" ,
91+ Namespace : ns .Name ,
92+ },
93+ Spec : sourcev1.HelmChartSpec {
94+ Chart : chartName ,
95+ Version : chartVersion ,
96+ SourceRef : sourcev1.LocalHelmChartSourceReference {
97+ Kind : sourcev1 .HelmRepositoryKind ,
98+ Name : repository .Name ,
99+ },
100+ },
101+ }
102+ g .Expect (testEnv .Create (ctx , obj )).To (Succeed ())
103+
104+ key := client.ObjectKey {Name : obj .Name , Namespace : obj .Namespace }
105+
106+ // Wait for finalizer to be set
107+ g .Eventually (func () bool {
108+ if err := testEnv .Get (ctx , key , obj ); err != nil {
109+ return false
110+ }
111+ return len (obj .Finalizers ) > 0
112+ }, timeout ).Should (BeTrue ())
113+
114+ // Wait for HelmChart to be Ready
115+ g .Eventually (func () bool {
116+ if err := testEnv .Get (ctx , key , obj ); err != nil {
117+ return false
118+ }
119+ if ! conditions .IsReady (obj ) || obj .Status .Artifact == nil {
120+ return false
121+ }
122+ readyCondition := conditions .Get (obj , meta .ReadyCondition )
123+ return obj .Generation == readyCondition .ObservedGeneration &&
124+ obj .Generation == obj .Status .ObservedGeneration
125+ }, timeout ).Should (BeTrue ())
126+
127+ // Check if the object status is valid.
128+ condns := & status.Conditions {NegativePolarity : helmChartReadyDepsNegative }
129+ checker := status .NewChecker (testEnv .Client , testEnv .GetScheme (), condns )
130+ checker .CheckErr (ctx , obj )
131+
132+ g .Expect (testEnv .Delete (ctx , obj )).To (Succeed ())
133+
134+ // Wait for HelmChart to be deleted
135+ g .Eventually (func () bool {
136+ if err := testEnv .Get (ctx , key , obj ); err != nil {
137+ return apierrors .IsNotFound (err )
138+ }
139+ return false
140+ }, timeout ).Should (BeTrue ())
141+ }
142+
53143func TestHelmChartReconciler_reconcileStorage (t * testing.T ) {
54144 tests := []struct {
55145 name string
0 commit comments