Repository: helm/helm
Pull request #8189 (2020-05-22 18:42:18)

ref(tests): localize unit test fixtures to package
Use test fixtures that are in the same package as test.


Patch:
diff --git a/pkg/action/show.go b/pkg/action/show.go
index cc85477cd..9baa9cf43 100644
--- a/pkg/action/show.go
+++ b/pkg/action/show.go
@@ -54,6 +54,7 @@ type Show struct {
 	ChartPathOptions
 	Devel        bool
 	OutputFormat ShowOutputFormat
+	chart        *chart.Chart // for testing
 }
 
 // NewShow creates a new Show object with the given configuration.
@@ -65,25 +66,28 @@ func NewShow(output ShowOutputFormat) *Show {
 
 // Run executes 'helm show' against the given release.
 func (s *Show) Run(chartpath string) (string, error) {
-	var out strings.Builder
-	chrt, err := loader.Load(chartpath)
-	if err != nil {
-		return "", err
+	if s.chart == nil {
+		chrt, err := loader.Load(chartpath)
+		if err != nil {
+			return "", err
+		}
+		s.chart = chrt
 	}
-	cf, err := yaml.Marshal(chrt.Metadata)
+	cf, err := yaml.Marshal(s.chart.Metadata)
 	if err != nil {
 		return "", err
 	}
 
+	var out strings.Builder
 	if s.OutputFormat == ShowChart || s.OutputFormat == ShowAll {
 		fmt.Fprintf(&out, "%s\n", cf)
 	}
 
-	if (s.OutputFormat == ShowValues || s.OutputFormat == ShowAll) && chrt.Values != nil {
+	if (s.OutputFormat == ShowValues || s.OutputFormat == ShowAll) && s.chart.Values != nil {
 		if s.OutputFormat == ShowAll {
 			fmt.Fprintln(&out, "---")
 		}
-		for _, f := range chrt.Raw {
+		for _, f := range s.chart.Raw {
 			if f.Name == chartutil.ValuesfileName {
 				fmt.Fprintln(&out, string(f.Data))
 			}
@@ -94,7 +98,7 @@ func (s *Show) Run(chartpath string) (string, error) {
 		if s.OutputFormat == ShowAll {
 			fmt.Fprintln(&out, "---")
 		}
-		readme := findReadme(chrt.Files)
+		readme := findReadme(s.chart.Files)
 		if readme == nil {
 			return out.String(), nil
 		}


Test patch:
diff --git a/cmd/helm/template_test.go b/cmd/helm/template_test.go
index 87ee79e5a..92dd9825e 100644
--- a/cmd/helm/template_test.go
+++ b/cmd/helm/template_test.go
@@ -22,7 +22,7 @@ import (
 	"testing"
 )
 
-var chartPath = "./../../pkg/chartutil/testdata/subpop/charts/subchart1"
+var chartPath = "testdata/testcharts/subchart"
 
 func TestTemplateCmd(t *testing.T) {
 	tests := []cmdTestCase{
diff --git a/cmd/helm/testdata/output/template-name-template.txt b/cmd/helm/testdata/output/template-name-template.txt
index 24f2bb616..84a9e565c 100644
--- a/cmd/helm/testdata/output/template-name-template.txt
+++ b/cmd/helm/testdata/output/template-name-template.txt
@@ -1,34 +1,34 @@
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -45,7 +45,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -62,13 +62,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "foobar-YWJj-baz"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -81,4 +81,4 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template-set.txt b/cmd/helm/testdata/output/template-set.txt
index 4c7f1f626..1cb97723e 100644
--- a/cmd/helm/testdata/output/template-set.txt
+++ b/cmd/helm/testdata/output/template-set.txt
@@ -1,34 +1,34 @@
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -45,7 +45,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -62,13 +62,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -81,4 +81,4 @@ spec:
     protocol: TCP
     name: apache
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template-show-only-glob.txt b/cmd/helm/testdata/output/template-show-only-glob.txt
index 0970e6cd3..cc651f596 100644
--- a/cmd/helm/testdata/output/template-show-only-glob.txt
+++ b/cmd/helm/testdata/output/template-show-only-glob.txt
@@ -1,23 +1,23 @@
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
diff --git a/cmd/helm/testdata/output/template-show-only-multiple.txt b/cmd/helm/testdata/output/template-show-only-multiple.txt
index 75b590e20..1c4b1f29e 100644
--- a/cmd/helm/testdata/output/template-show-only-multiple.txt
+++ b/cmd/helm/testdata/output/template-show-only-multiple.txt
@@ -1,11 +1,11 @@
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -19,9 +19,9 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
diff --git a/cmd/helm/testdata/output/template-show-only-one.txt b/cmd/helm/testdata/output/template-show-only-one.txt
index ce61f481f..7b1443ea8 100644
--- a/cmd/helm/testdata/output/template-show-only-one.txt
+++ b/cmd/helm/testdata/output/template-show-only-one.txt
@@ -1,11 +1,11 @@
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -19,4 +19,4 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template-values-files.txt b/cmd/helm/testdata/output/template-values-files.txt
index 4c7f1f626..1cb97723e 100644
--- a/cmd/helm/testdata/output/template-values-files.txt
+++ b/cmd/helm/testdata/output/template-values-files.txt
@@ -1,34 +1,34 @@
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -45,7 +45,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -62,13 +62,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -81,4 +81,4 @@ spec:
     protocol: TCP
     name: apache
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template-with-api-version.txt b/cmd/helm/testdata/output/template-with-api-version.txt
index 210dcc503..ea4b5c96b 100644
--- a/cmd/helm/testdata/output/template-with-api-version.txt
+++ b/cmd/helm/testdata/output/template-with-api-version.txt
@@ -1,34 +1,34 @@
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -45,7 +45,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -62,13 +62,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -82,4 +82,4 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template-with-crds.txt b/cmd/helm/testdata/output/template-with-crds.txt
index 289eec291..fa2a79bac 100644
--- a/cmd/helm/testdata/output/template-with-crds.txt
+++ b/cmd/helm/testdata/output/template-with-crds.txt
@@ -15,36 +15,36 @@ spec:
     singular: authconfig
 
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -61,7 +61,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -78,13 +78,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -98,4 +98,4 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/output/template.txt b/cmd/helm/testdata/output/template.txt
index 82a21c5a1..9195f98b7 100644
--- a/cmd/helm/testdata/output/template.txt
+++ b/cmd/helm/testdata/output/template.txt
@@ -1,34 +1,34 @@
 ---
-# Source: subchart1/templates/subdir/serviceaccount.yaml
+# Source: subchart/templates/subdir/serviceaccount.yaml
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: subchart1-sa
+  name: subchart-sa
 ---
-# Source: subchart1/templates/subdir/role.yaml
+# Source: subchart/templates/subdir/role.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: Role
 metadata:
-  name: subchart1-role
+  name: subchart-role
 rules:
 - resources: ["*"]
   verbs: ["get","list","watch"]
 ---
-# Source: subchart1/templates/subdir/rolebinding.yaml
+# Source: subchart/templates/subdir/rolebinding.yaml
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding
 metadata:
-  name: subchart1-binding
+  name: subchart-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: Role
-  name: subchart1-role
+  name: subchart-role
 subjects:
 - kind: ServiceAccount
-  name: subchart1-sa
+  name: subchart-sa
   namespace: default
 ---
-# Source: subchart1/charts/subcharta/templates/service.yaml
+# Source: subchart/charts/subcharta/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -45,7 +45,7 @@ spec:
   selector:
     app.kubernetes.io/name: subcharta
 ---
-# Source: subchart1/charts/subchartb/templates/service.yaml
+# Source: subchart/charts/subchartb/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
@@ -62,13 +62,13 @@ spec:
   selector:
     app.kubernetes.io/name: subchartb
 ---
-# Source: subchart1/templates/service.yaml
+# Source: subchart/templates/service.yaml
 apiVersion: v1
 kind: Service
 metadata:
-  name: subchart1
+  name: subchart
   labels:
-    helm.sh/chart: "subchart1-0.1.0"
+    helm.sh/chart: "subchart-0.1.0"
     app.kubernetes.io/instance: "RELEASE-NAME"
     kube-version/major: "1"
     kube-version/minor: "18"
@@ -81,4 +81,4 @@ spec:
     protocol: TCP
     name: nginx
   selector:
-    app.kubernetes.io/name: subchart1
+    app.kubernetes.io/name: subchart
diff --git a/cmd/helm/testdata/testcharts/chart-with-no-templates-dir/values.yaml b/cmd/helm/testdata/testcharts/chart-with-no-templates-dir/values.yaml
deleted file mode 100644
index ec82367be..000000000
--- a/cmd/helm/testdata/testcharts/chart-with-no-templates-dir/values.yaml
+++ /dev/null
@@ -1,1 +0,0 @@
-justAValue: "an example chart here"
diff --git a/cmd/helm/testdata/testcharts/decompressedchart/.helmignore b/cmd/helm/testdata/testcharts/decompressedchart/.helmignore
deleted file mode 100644
index 435b756d8..000000000
--- a/cmd/helm/testdata/testcharts/decompressedchart/.helmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-# Patterns to ignore when building packages.
-# This supports shell glob matching, relative path matching, and
-# negation (prefixed with !). Only one pattern per line.
-.DS_Store
-.git
diff --git a/cmd/helm/testdata/testcharts/novals/Chart.yaml b/cmd/helm/testdata/testcharts/novals/Chart.yaml
deleted file mode 100644
index a4282470b..000000000
--- a/cmd/helm/testdata/testcharts/novals/Chart.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-apiVersion: v1
-description: Deploy a basic Alpine Linux pod
-home: https://helm.sh/helm
-name: novals
-sources:
-  - https://github.com/helm/helm
-version: 0.2.0
-appVersion: 3.3
diff --git a/cmd/helm/testdata/testcharts/novals/README.md b/cmd/helm/testdata/testcharts/novals/README.md
deleted file mode 100644
index fcf7ee017..000000000
--- a/cmd/helm/testdata/testcharts/novals/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-#Alpine: A simple Helm chart
-
-Run a single pod of Alpine Linux.
-
-This example was generated using the command `helm create alpine`.
-
-The `templates/` directory contains a very simple pod resource with a
-couple of parameters.
-
-The `values.yaml` file contains the default values for the
-`alpine-pod.yaml` template.
-
-You can install this example using `helm install ./alpine`.
diff --git a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml
deleted file mode 100644
index 96c92d61d..000000000
--- a/cmd/helm/testdata/testcharts/novals/templates/alpine-pod.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-apiVersion: v1
-kind: Pod
-metadata:
-  name: "{{.Release.Name}}-{{.Values.Name}}"
-  labels:
-    # The "app.kubernetes.io/managed-by" label is used to track which tool
-    # deployed a given chart. It is useful for admins who want to see what
-    # releases a particular tool is responsible for.
-    app.kubernetes.io/managed-by: {{.Release.Service | quote }}
-    # The "app.kubernetes.io/instance" convention makes it easy to tie a release
-    # to all of the Kubernetes resources that were created as part of that
-    # release.
-    app.kubernetes.io/instance: {{.Release.Name | quote }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
-    # This makes it easy to audit chart usage.
-    helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
-  annotations:
-    "helm.sh/created": {{.Release.Time.Seconds | quote }}
-spec:
-  # This shows how to use a simple value. This will look for a passed-in value
-  # called restartPolicy. If it is not found, it will use the default value.
-  # {{default "Never" .restartPolicy}} is a slightly optimized version of the
-  # more conventional syntax: {{.restartPolicy | default "Never"}}
-  restartPolicy: {{default "Never" .Values.restartPolicy}}
-  containers:
-  - name: waiter
-    image: "alpine:3.3"
-    command: ["/bin/sleep","9000"]
diff --git a/cmd/helm/testdata/testcharts/subchart/Chart.yaml b/cmd/helm/testdata/testcharts/subchart/Chart.yaml
new file mode 100644
index 000000000..b03ea3cd3
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/Chart.yaml
@@ -0,0 +1,36 @@
+apiVersion: v1
+description: A Helm chart for Kubernetes
+name: subchart
+version: 0.1.0
+dependencies:
+  - name: subcharta
+    repository: http://localhost:10191
+    version: 0.1.0
+    condition: subcharta.enabled
+    tags:
+      - front-end
+      - subcharta
+    import-values:
+      - child: SCAdata
+        parent: imported-chartA
+      - child: SCAdata
+        parent: overridden-chartA
+      - child: SCAdata
+        parent: imported-chartA-B
+
+  - name: subchartb
+    repository: http://localhost:10191
+    version: 0.1.0
+    condition: subchartb.enabled
+    import-values:
+      - child: SCBdata
+        parent: imported-chartB
+      - child: SCBdata
+        parent: imported-chartA-B
+      - child: exports.SCBexported2
+        parent: exports.SCBexported2
+      - SCBexported1
+
+    tags:
+      - front-end
+      - subchartb
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartA/Chart.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/Chart.yaml
new file mode 100644
index 000000000..be3edcefb
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/Chart.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: A Helm chart for Kubernetes
+name: subcharta
+version: 0.1.0
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartA/templates/service.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/templates/service.yaml
new file mode 100644
index 000000000..27501e1e0
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Chart.Name }}
+  labels:
+    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+  - port: {{ .Values.service.externalPort }}
+    targetPort: {{ .Values.service.internalPort }}
+    protocol: TCP
+    name: {{ .Values.service.name }}
+  selector:
+    app.kubernetes.io/name: {{ .Chart.Name }}
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartA/values.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/values.yaml
new file mode 100644
index 000000000..f0381ae6a
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartA/values.yaml
@@ -0,0 +1,17 @@
+# Default values for subchart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+# subchartA
+service:
+  name: apache
+  type: ClusterIP
+  externalPort: 80
+  internalPort: 80
+SCAdata:
+  SCAbool: false
+  SCAfloat: 3.1
+  SCAint: 55
+  SCAstring: "jabba"
+  SCAnested1:
+    SCAnested2: true
+
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartB/Chart.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/Chart.yaml
new file mode 100644
index 000000000..c3c6bbaf0
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/Chart.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: A Helm chart for Kubernetes
+name: subchartb
+version: 0.1.0
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartB/templates/service.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/templates/service.yaml
new file mode 100644
index 000000000..27501e1e0
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Chart.Name }}
+  labels:
+    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+  - port: {{ .Values.service.externalPort }}
+    targetPort: {{ .Values.service.internalPort }}
+    protocol: TCP
+    name: {{ .Values.service.name }}
+  selector:
+    app.kubernetes.io/name: {{ .Chart.Name }}
diff --git a/cmd/helm/testdata/testcharts/subchart/charts/subchartB/values.yaml b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/values.yaml
new file mode 100644
index 000000000..774fdd75c
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/charts/subchartB/values.yaml
@@ -0,0 +1,35 @@
+# Default values for subchart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+service:
+  name: nginx
+  type: ClusterIP
+  externalPort: 80
+  internalPort: 80
+
+SCBdata:
+  SCBbool: true
+  SCBfloat: 7.77
+  SCBint: 33
+  SCBstring: "boba"
+
+exports:
+  SCBexported1:
+    SCBexported1A:
+      SCBexported1B: 1965
+
+  SCBexported2:
+    SCBexported2A: "blaster"
+
+global:
+  kolla:
+    nova:
+      api:
+        all:
+          port: 8774
+      metadata:
+        all:
+          port: 8775
+
+
+
diff --git a/cmd/helm/testdata/testcharts/subchart/crds/crdA.yaml b/cmd/helm/testdata/testcharts/subchart/crds/crdA.yaml
new file mode 100644
index 000000000..fca77fd4b
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/crds/crdA.yaml
@@ -0,0 +1,13 @@
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  name: testCRDs
+spec:
+  group: testCRDGroups
+  names:
+    kind: TestCRD
+    listKind: TestCRDList
+    plural: TestCRDs
+    shortNames:
+      - tc
+    singular: authconfig
diff --git a/cmd/helm/testdata/testcharts/subchart/templates/NOTES.txt b/cmd/helm/testdata/testcharts/subchart/templates/NOTES.txt
new file mode 100644
index 000000000..4bdf443f6
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/templates/NOTES.txt
@@ -0,0 +1,1 @@
+Sample notes for {{ .Chart.Name }}
\ No newline at end of file
diff --git a/cmd/helm/testdata/testcharts/subchart/templates/service.yaml b/cmd/helm/testdata/testcharts/subchart/templates/service.yaml
new file mode 100644
index 000000000..fee94dced
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/templates/service.yaml
@@ -0,0 +1,22 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Chart.Name }}
+  labels:
+    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    app.kubernetes.io/instance: "{{ .Release.Name }}"
+    kube-version/major: "{{ .Capabilities.KubeVersion.Major }}"
+    kube-version/minor: "{{ .Capabilities.KubeVersion.Minor }}"
+    kube-version/version: "v{{ .Capabilities.KubeVersion.Major }}.{{ .Capabilities.KubeVersion.Minor }}.0"
+{{- if .Capabilities.APIVersions.Has "helm.k8s.io/test" }}
+    kube-api-version/test: v1
+{{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+  - port: {{ .Values.service.externalPort }}
+    targetPort: {{ .Values.service.internalPort }}
+    protocol: TCP
+    name: {{ .Values.service.name }}
+  selector:
+    app.kubernetes.io/name: {{ .Chart.Name }}
diff --git a/cmd/helm/testdata/testcharts/subchart/templates/subdir/role.yaml b/cmd/helm/testdata/testcharts/subchart/templates/subdir/role.yaml
new file mode 100644
index 000000000..91b954e5f
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/templates/subdir/role.yaml
@@ -0,0 +1,7 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ .Chart.Name }}-role
+rules:
+- resources: ["*"]
+  verbs: ["get","list","watch"]
diff --git a/cmd/helm/testdata/testcharts/subchart/templates/subdir/rolebinding.yaml b/cmd/helm/testdata/testcharts/subchart/templates/subdir/rolebinding.yaml
new file mode 100644
index 000000000..5d193f1a6
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/templates/subdir/rolebinding.yaml
@@ -0,0 +1,12 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ .Chart.Name }}-binding
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: {{ .Chart.Name }}-role
+subjects:
+- kind: ServiceAccount
+  name: {{ .Chart.Name }}-sa
+  namespace: default
diff --git a/cmd/helm/testdata/testcharts/subchart/templates/subdir/serviceaccount.yaml b/cmd/helm/testdata/testcharts/subchart/templates/subdir/serviceaccount.yaml
new file mode 100644
index 000000000..7126c7d89
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/templates/subdir/serviceaccount.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ .Chart.Name }}-sa
diff --git a/cmd/helm/testdata/testcharts/subchart/values.yaml b/cmd/helm/testdata/testcharts/subchart/values.yaml
new file mode 100644
index 000000000..8a3ab6c64
--- /dev/null
+++ b/cmd/helm/testdata/testcharts/subchart/values.yaml
@@ -0,0 +1,55 @@
+# Default values for subchart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+# subchart
+service:
+  name: nginx
+  type: ClusterIP
+  externalPort: 80
+  internalPort: 80
+
+
+SC1data:
+  SC1bool: true
+  SC1float: 3.14
+  SC1int: 100
+  SC1string: "dollywood"
+  SC1extra1: 11
+
+imported-chartA:
+  SC1extra2: 1.337
+
+overridden-chartA:
+  SCAbool: true
+  SCAfloat: 3.14
+  SCAint: 100
+  SCAstring: "jabbathehut"
+  SC1extra3: true
+
+imported-chartA-B:
+  SC1extra5: "tiller"
+
+overridden-chartA-B:
+  SCAbool: true
+  SCAfloat: 3.33
+  SCAint: 555
+  SCAstring: "wormwood"
+  SCAextra1: 23
+
+  SCBbool: true
+  SCBfloat: 0.25
+  SCBint: 98
+  SCBstring: "murkwood"
+  SCBextra1: 13
+
+  SC1extra6: 77
+
+SCBexported1A:
+  SC1extra7: true
+
+exports:
+  SC1exported1:
+    global:
+      SC1exported2:
+        all:
+          SC1exported3: "SC1expstr"
diff --git a/internal/resolver/resolver_test.go b/internal/resolver/resolver_test.go
index bb3d3e6ac..0b0c3a6f8 100644
--- a/internal/resolver/resolver_test.go
+++ b/internal/resolver/resolver_test.go
@@ -74,18 +74,18 @@ func TestResolve(t *testing.T) {
 		{
 			name: "repo from valid local path",
 			req: []*chart.Dependency{
-				{Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"},
+				{Name: "base", Repository: "file://base", Version: "0.1.0"},
 			},
 			expect: &chart.Lock{
 				Dependencies: []*chart.Dependency{
-					{Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"},
+					{Name: "base", Repository: "file://base", Version: "0.1.0"},
 				},
 			},
 		},
 		{
 			name: "repo from invalid local path",
 			req: []*chart.Dependency{
-				{Name: "notexist", Repository: "file://../testdata/notexist", Version: "0.1.0"},
+				{Name: "notexist", Repository: "file://testdata/notexist", Version: "0.1.0"},
 			},
 			err: true,
 		},
@@ -232,9 +232,9 @@ func TestGetLocalPath(t *testing.T) {
 		},
 		{
 			name:      "relative path",
-			repo:      "file://../../../../cmd/helm/testdata/testcharts/signtest",
+			repo:      "file://../../testdata/chartpath/base",
 			chartpath: "foo/bar",
-			expect:    "../../cmd/helm/testdata/testcharts/signtest",
+			expect:    "testdata/chartpath/base",
 		},
 		{
 			name:      "current directory path",
@@ -244,13 +244,13 @@ func TestGetLocalPath(t *testing.T) {
 		},
 		{
 			name:      "invalid local path",
-			repo:      "file://../testdata/notexist",
+			repo:      "file://testdata/notexist",
 			chartpath: "testdata/chartpath",
 			err:       true,
 		},
 		{
 			name:      "invalid path under current directory",
-			repo:      "../charts/nonexistentdependency",
+			repo:      "charts/nonexistentdependency",
 			chartpath: "testdata/chartpath/charts",
 			err:       true,
 		},
diff --git a/internal/resolver/testdata/chartpath/base/Chart.yaml b/internal/resolver/testdata/chartpath/base/Chart.yaml
new file mode 100644
index 000000000..860b09091
--- /dev/null
+++ b/internal/resolver/testdata/chartpath/base/Chart.yaml
@@ -0,0 +1,3 @@
+apiVersion: v2
+name: base
+version: 0.1.0
diff --git a/pkg/action/dependency_test.go b/pkg/action/dependency_test.go
index 158acbfb9..4f3cb69a5 100644
--- a/pkg/action/dependency_test.go
+++ b/pkg/action/dependency_test.go
@@ -30,23 +30,23 @@ func TestList(t *testing.T) {
 	}{
 		{
 			chart:  "testdata/charts/chart-with-compressed-dependencies",
-			golden: "output/compressed-deps.txt",
+			golden: "output/list-compressed-deps.txt",
 		},
 		{
 			chart:  "testdata/charts/chart-with-compressed-dependencies-2.1.8.tgz",
-			golden: "output/compressed-deps-tgz.txt",
+			golden: "output/list-compressed-deps-tgz.txt",
 		},
 		{
 			chart:  "testdata/charts/chart-with-uncompressed-dependencies",
-			golden: "output/uncompressed-deps.txt",
+			golden: "output/list-uncompressed-deps.txt",
 		},
 		{
 			chart:  "testdata/charts/chart-with-uncompressed-dependencies-2.1.8.tgz",
-			golden: "output/uncompressed-deps-tgz.txt",
+			golden: "output/list-uncompressed-deps-tgz.txt",
 		},
 		{
 			chart:  "testdata/charts/chart-missing-deps",
-			golden: "output/missing-deps.txt",
+			golden: "output/list-missing-deps.txt",
 		},
 	} {
 		buf := bytes.Buffer{}
diff --git a/pkg/action/lint_test.go b/pkg/action/lint_test.go
index 68d3c4bb4..1828461f3 100644
--- a/pkg/action/lint_test.go
+++ b/pkg/action/lint_test.go
@@ -24,10 +24,10 @@ var (
 	values                  = make(map[string]interface{})
 	namespace               = "testNamespace"
 	strict                  = false
-	chart1MultipleChartLint = "../../cmd/helm/testdata/testcharts/multiplecharts-lint-chart-1"
-	chart2MultipleChartLint = "../../cmd/helm/testdata/testcharts/multiplecharts-lint-chart-2"
-	corruptedTgzChart       = "../../cmd/helm/testdata/testcharts/corrupted-compressed-chart.tgz"
-	chartWithNoTemplatesDir = "../../cmd/helm/testdata/testcharts/chart-with-no-templates-dir"
+	chart1MultipleChartLint = "testdata/charts/multiplecharts-lint-chart-1"
+	chart2MultipleChartLint = "testdata/charts/multiplecharts-lint-chart-2"
+	corruptedTgzChart       = "testdata/charts/corrupted-compressed-chart.tgz"
+	chartWithNoTemplatesDir = "testdata/charts/chart-with-no-templates-dir"
 )
 
 func TestLintChart(t *testing.T) {
@@ -38,41 +38,41 @@ func TestLintChart(t *testing.T) {
 	}{
 		{
 			name:      "decompressed-chart",
-			chartPath: "../../cmd/helm/testdata/testcharts/decompressedchart/",
+			chartPath: "testdata/charts/decompressedchart/",
 		},
 		{
 			name:      "archived-chart-path",
-			chartPath: "../../cmd/helm/testdata/testcharts/compressedchart-0.1.0.tgz",
+			chartPath: "testdata/charts/compressedchart-0.1.0.tgz",
 		},
 		{
 			name:      "archived-chart-path-with-hyphens",
-			chartPath: "../../cmd/helm/testdata/testcharts/compressedchart-with-hyphens-0.1.0.tgz",
+			chartPath: "testdata/charts/compressedchart-with-hyphens-0.1.0.tgz",
 		},
 		{
 			name:      "archived-tar-gz-chart-path",
-			chartPath: "../../cmd/helm/testdata/testcharts/compressedchart-0.1.0.tar.gz",
+			chartPath: "testdata/charts/compressedchart-0.1.0.tar.gz",
 		},
 		{
 			name:      "invalid-archived-chart-path",
-			chartPath: "../../cmd/helm/testdata/testcharts/invalidcompressedchart0.1.0.tgz",
+			chartPath: "testdata/charts/invalidcompressedchart0.1.0.tgz",
 			err:       true,
 		},
 		{
 			name:      "chart-missing-manifest",
-			chartPath: "../../cmd/helm/testdata/testcharts/chart-missing-manifest",
+			chartPath: "testdata/charts/chart-missing-manifest",
 			err:       true,
 		},
 		{
 			name:      "chart-with-schema",
-			chartPath: "../../cmd/helm/testdata/testcharts/chart-with-schema",
+			chartPath: "testdata/charts/chart-with-schema",
 		},
 		{
 			name:      "chart-with-schema-negative",
-			chartPath: "../../cmd/helm/testdata/testcharts/chart-with-schema-negative",
+			chartPath: "testdata/charts/chart-with-schema-negative",
 		},
 		{
 			name:      "pre-release-chart",
-			chartPath: "../../cmd/helm/testdata/testcharts/pre-release-chart-0.1.0-alpha.tgz",
+			chartPath: "testdata/charts/pre-release-chart-0.1.0-alpha.tgz",
 		},
 	}
 
diff --git a/pkg/action/show_test.go b/pkg/action/show_test.go
index 0a532746a..7be9daaa5 100644
--- a/pkg/action/show_test.go
+++ b/pkg/action/show_test.go
@@ -17,55 +17,50 @@ limitations under the License.
 package action
 
 import (
-	"io/ioutil"
-	"strings"
 	"testing"
+
+	"helm.sh/helm/v3/pkg/chart"
 )
 
 func TestShow(t *testing.T) {
 	client := NewShow(ShowAll)
-
-	output, err := client.Run("../../cmd/helm/testdata/testcharts/alpine")
-	if err != nil {
-		t.Fatal(err)
+	client.chart = &chart.Chart{
+		Metadata: &chart.Metadata{Name: "alpine"},
+		Files: []*chart.File{
+			{Name: "README.md", Data: []byte("README\n")},
+		},
+		Raw: []*chart.File{
+			{Name: "values.yaml", Data: []byte("VALUES\n")},
+		},
+		Values: map[string]interface{}{},
 	}
 
-	// Load the data from the textfixture directly.
-	cdata, err := ioutil.ReadFile("../../cmd/helm/testdata/testcharts/alpine/Chart.yaml")
+	output, err := client.Run("")
 	if err != nil {
 		t.Fatal(err)
 	}
-	data, err := ioutil.ReadFile("../../cmd/helm/testdata/testcharts/alpine/values.yaml")
-	if err != nil {
-		t.Fatal(err)
-	}
-	readmeData, err := ioutil.ReadFile("../../cmd/helm/testdata/testcharts/alpine/README.md")
-	if err != nil {
-		t.Fatal(err)
-	}
-	parts := strings.SplitN(output, "---", 3)
-	if len(parts) != 3 {
-		t.Fatalf("Expected 2 parts, got %d", len(parts))
-	}
 
-	expect := []string{
-		strings.ReplaceAll(strings.TrimSpace(string(cdata)), "\r", ""),
-		strings.ReplaceAll(strings.TrimSpace(string(data)), "\r", ""),
-		strings.ReplaceAll(strings.TrimSpace(string(readmeData)), "\r", ""),
-	}
+	expect := `name: alpine
+
+---
+VALUES
 
-	// Problem: ghodss/yaml doesn't marshal into struct order. To solve, we
-	// have to carefully craft the Chart.yaml to match.
-	for i, got := range parts {
-		got = strings.ReplaceAll(strings.TrimSpace(got), "\r", "")
-		if got != expect[i] {
-			t.Errorf("Expected\n%q\nGot\n%q\n", expect[i], got)
-		}
+---
+README
+
+`
+	if output != expect {
+		t.Errorf("Expected\n%q\nGot\n%q\n", expect, output)
 	}
+}
+
+func TestShowNoValues(t *testing.T) {
+	client := NewShow(ShowAll)
+	client.chart = new(chart.Chart)
 
 	// Regression tests for missing values. See issue #1024.
 	client.OutputFormat = ShowValues
-	output, err = client.Run("../../cmd/helm/testdata/testcharts/novals")
+	output, err := client.Run("")
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/pkg/action/testdata/charts/chart-missing-deps/.helmignore b/pkg/action/testdata/charts/chart-missing-deps/.helmignore
deleted file mode 100755
index e2cf7941f..000000000
--- a/pkg/action/testdata/charts/chart-missing-deps/.helmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.git
-# OWNERS file for Kubernetes
-OWNERS
-# example production yaml
-values-production.yaml
\ No newline at end of file
diff --git a/pkg/action/testdata/charts/chart-missing-deps/Chart.yaml b/pkg/action/testdata/charts/chart-missing-deps/Chart.yaml
index 8304984fd..ba10ee803 100755
--- a/pkg/action/testdata/charts/chart-missing-deps/Chart.yaml
+++ b/pkg/action/testdata/charts/chart-missing-deps/Chart.yaml
@@ -1,20 +1,2 @@
-appVersion: 4.9.8
-description: Web publishing platform for building blogs and websites.
-engine: gotpl
-home: http://www.wordpress.com/
-icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
-keywords:
-- wordpress
-- cms
-- blog
-- http
-- web
-- application
-- php
-maintainers:
-- email: containers@bitnami.com
-  name: bitnami-bot
 name: chart-with-missing-deps
-sources:
-- https://github.com/bitnami/bitnami-docker-wordpress
 version: 2.1.8
diff --git a/pkg/action/testdata/charts/chart-missing-deps/README.md b/pkg/action/testdata/charts/chart-missing-deps/README.md
deleted file mode 100755
index 5859a17fa..000000000
--- a/pkg/action/testdata/charts/chart-missing-deps/README.md
+++ /dev/null
@@ -1,232 +0,0 @@
-# WordPress
-
-[WordPress](https://wordpress.org/) is one of the most versatile open source content management systems on the market. A publishing platform for building blogs and websites.
-
-## TL;DR;
-
-```console
-$ helm install stable/wordpress
-```
-
-## Introduction
-
-This chart bootstraps a [WordPress](https://github.com/bitnami/bitnami-docker-wordpress) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
-
-It also packages the [Bitnami MariaDB chart](https://github.com/kubernetes/charts/tree/master/stable/mariadb) which is required for bootstrapping a MariaDB deployment for the database requirements of the WordPress application.
-
-## Prerequisites
-
-- Kubernetes 1.4+ with Beta APIs enabled
-- PV provisioner support in the underlying infrastructure
-
-## Installing the Chart
-
-To install the chart with the release name `my-release`:
-
-```console
-$ helm install --name my-release stable/wordpress
-```
-
-The command deploys WordPress on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
-
-> **Tip**: List all releases using `helm list`
-
-## Uninstalling the Chart
-
-To uninstall/delete the `my-release` deployment:
-
-```console
-$ helm delete my-release
-```
-
-The command removes all the Kubernetes components associated with the chart and deletes the release.
-
-## Configuration
-
-The following table lists the configurable parameters of the WordPress chart and their default values.
-
-|            Parameter             |                Description                 |                         Default                         |
-|----------------------------------|--------------------------------------------|---------------------------------------------------------|
-| `image.registry`                 | WordPress image registry                   | `docker.io`                                             |
-| `image.repository`               | WordPress image name                       | `bitnami/wordpress`                                     |
-| `image.tag`                      | WordPress image tag                        | `{VERSION}`                                             |
-| `image.pullPolicy`               | Image pull policy                          | `Always` if `imageTag` is `latest`, else `IfNotPresent` |
-| `image.pullSecrets`              | Specify image pull secrets                 | `nil`                                                   |
-| `wordpressUsername`              | User of the application                    | `user`                                                  |
-| `wordpressPassword`              | Application password                       | _random 10 character long alphanumeric string_          |
-| `wordpressEmail`                 | Admin email                                | `user@example.com`                                      |
-| `wordpressFirstName`             | First name                                 | `FirstName`                                             |
-| `wordpressLastName`              | Last name                                  | `LastName`                                              |
-| `wordpressBlogName`              | Blog name                                  | `User's Blog!`                                          |
-| `wordpressTablePrefix`           | Table prefix                               | `wp_`                                                   |
-| `allowEmptyPassword`             | Allow DB blank passwords                   | `yes`                                                   |
-| `smtpHost`                       | SMTP host                                  | `nil`                                                   |
-| `smtpPort`                       | SMTP port                                  | `nil`                                                   |
-| `smtpUser`                       | SMTP user                                  | `nil`                                                   |
-| `smtpPassword`                   | SMTP password                              | `nil`                                                   |
-| `smtpUsername`                   | User name for SMTP emails                  | `nil`                                                   |
-| `smtpProtocol`                   | SMTP protocol [`tls`, `ssl`]               | `nil`                                                   |
-| `replicaCount`                   | Number of WordPress Pods to run            | `1`                                                     |
-| `mariadb.enabled`                | Deploy MariaDB container(s)                | `true`                                                  |
-| `mariadb.rootUser.password`      | MariaDB admin password                     | `nil`                                                   |
-| `mariadb.db.name`                | Database name to create                    | `bitnami_wordpress`                                     |
-| `mariadb.db.user`                | Database user to create                    | `bn_wordpress`                                          |
-| `mariadb.db.password`            | Password for the database                  | _random 10 character long alphanumeric string_          |
-| `externalDatabase.host`          | Host of the external database              | `localhost`                                             |
-| `externalDatabase.user`          | Existing username in the external db       | `bn_wordpress`                                          |
-| `externalDatabase.password`      | Password for the above username            | `nil`                                                   |
-| `externalDatabase.database`      | Name of the existing database              | `bitnami_wordpress`                                     |
-| `externalDatabase.port`          | Database port number                       | `3306`                                                  |
-| `serviceType`                    | Kubernetes Service type                    | `LoadBalancer`                                          |
-| `serviceExternalTrafficPolicy`   | Enable client source IP preservation       | `Cluster`                                               |
-| `nodePorts.http`                 | Kubernetes http node port                  | `""`                                                    |
-| `nodePorts.https`                | Kubernetes https node port                 | `""`                                                    |
-| `healthcheckHttps`               | Use https for liveliness and readiness     | `false`                                                 |
-| `ingress.enabled`                | Enable ingress controller resource         | `false`                                                 |
-| `ingress.hosts[0].name`          | Hostname to your WordPress installation    | `wordpress.local`                                       |
-| `ingress.hosts[0].path`          | Path within the url structure              | `/`                                                     |
-| `ingress.hosts[0].tls`           | Utilize TLS backend in ingress             | `false`                                                 |
-| `ingress.hosts[0].tlsSecret`     | TLS Secret (certificates)                  | `wordpress.local-tls-secret`                            |
-| `ingress.hosts[0].annotations`   | Annotations for this host's ingress record | `[]`                                                    |
-| `ingress.secrets[0].name`        | TLS Secret Name                            | `nil`                                                   |
-| `ingress.secrets[0].certificate` | TLS Secret Certificate                     | `nil`                                                   |
-| `ingress.secrets[0].key`         | TLS Secret Key                             | `nil`                                                   |
-| `persistence.enabled`            | Enable persistence using PVC               | `true`                                                  |
-| `persistence.existingClaim`      | Enable persistence using an existing PVC   | `nil`                                                   |
-| `persistence.storageClass`       | PVC Storage Class                          | `nil` (uses alpha storage class annotation)             |
-| `persistence.accessMode`         | PVC Access Mode                            | `ReadWriteOnce`                                         |
-| `persistence.size`               | PVC Storage Request                        | `10Gi`                                                  |
-| `nodeSelector`                   | Node labels for pod assignment             | `{}`                                                    |
-| `tolerations`                    | List of node taints to tolerate            | `[]`                                                    |
-| `affinity`                       | Map of node/pod affinities                 | `{}`                                                    |
-
-The above parameters map to the env variables defined in [bitnami/wordpress](http://github.com/bitnami/bitnami-docker-wordpress). For more information please refer to the [bitnami/wordpress](http://github.com/bitnami/bitnami-docker-wordpress) image documentation.
-
-Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
-
-```console
-$ helm install --name my-release \
-  --set wordpressUsername=admin,wordpressPassword=password,mariadb.mariadbRootPassword=secretpassword \
-    stable/wordpress
-```
-
-The above command sets the WordPress administrator account username and password to `admin` and `password` respectively. Additionally, it sets the MariaDB `root` user password to `secretpassword`.
-
-Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example,
-
-```console
-$ helm install --name my-release -f values.yaml stable/wordpress
-```
-
-> **Tip**: You can use the default [values.yaml](values.yaml)
-
-## Production and horizontal scaling
-
-The following repo contains the recommended production settings for wordpress capture in an alternative [values file](values-production.yaml). Please read carefully the comments in the values-production.yaml file to set up your environment appropriately.
-
-To horizontally scale this chart, first download the [values-production.yaml](values-production.yaml) file to your local folder, then:
-
-```console
-$ helm install --name my-release -f ./values-production.yaml stable/wordpress
-```
-
-Note that [values-production.yaml](values-production.yaml) includes a replicaCount of 3, so there will be 3 WordPress pods. As a result, to use the /admin portal and to ensure you can scale wordpress you need to provide a ReadWriteMany PVC, if you don't have a provisioner for this type of storage, we recommend that you install the nfs provisioner and map it to a RWO volume.
-
-```console
-$ helm install stable/nfs-server-provisioner --set persistence.enabled=true,persistence.size=10Gi
-$ helm install --name my-release -f values-production.yaml --set persistence.storageClass=nfs stable/wordpress
-```
-
-## Persistence
-
-The [Bitnami WordPress](https://github.com/bitnami/bitnami-docker-wordpress) image stores the WordPress data and configurations at the `/bitnami` path of the container.
-
-Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube.
-See the [Configuration](#configuration) section to configure the PVC or to disable persistence.
-
-## Using an external database
-
-Sometimes you may want to have Wordpress connect to an external database rather than installing one inside your cluster, e.g. to use a managed database service, or use run a single database server for all your applications. To do this, the chart allows you to specify credentials for an external database under the [`externalDatabase` parameter](#configuration). You should also disable the MariaDB installation with the `mariadb.enabled` option. For example:
-
-```console
-$ helm install stable/wordpress \
-    --set mariadb.enabled=false,externalDatabase.host=myexternalhost,externalDatabase.user=myuser,externalDatabase.password=mypassword,externalDatabase.database=mydatabase,externalDatabase.port=3306
-```
-
-Note also if you disable MariaDB per above you MUST supply values for the `externalDatabase` connection.
-
-## Ingress
-
-This chart provides support for ingress resources. If you have an
-ingress controller installed on your cluster, such as [nginx-ingress](https://kubeapps.com/charts/stable/nginx-ingress)
-or [traefik](https://kubeapps.com/charts/stable/traefik) you can utilize
-the ingress controller to serve your WordPress application.
-
-To enable ingress integration, please set `ingress.enabled` to `true`
-
-### Hosts
-
-Most likely you will only want to have one hostname that maps to this
-WordPress installation, however, it is possible to have more than one
-host.  To facilitate this, the `ingress.hosts` object is an array.
-
-For each item, please indicate a `name`, `tls`, `tlsSecret`, and any
-`annotations` that you may want the ingress controller to know about.
-
-Indicating TLS will cause WordPress to generate HTTPS URLs, and
-WordPress will be connected to at port 443.  The actual secret that
-`tlsSecret` references do not have to be generated by this chart.
-However, please note that if TLS is enabled, the ingress record will not
-work until this secret exists.
-
-For annotations, please see [this document](https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md).
-Not all annotations are supported by all ingress controllers, but this
-document does a good job of indicating which annotation is supported by
-many popular ingress controllers.
-
-### TLS Secrets
-
-This chart will facilitate the creation of TLS secrets for use with the
-ingress controller, however, this is not required.  There are three
-common use cases:
-
-* helm generates/manages certificate secrets
-* user generates/manages certificates separately
-* an additional tool (like [kube-lego](https://kubeapps.com/charts/stable/kube-lego))
-manages the secrets for the application
-
-In the first two cases, one will need a certificate and a key.  We would
-expect them to look like this:
-
-* certificate files should look like (and there can be more than one
-certificate if there is a certificate chain)
-
-```
------BEGIN CERTIFICATE-----
-MIID6TCCAtGgAwIBAgIJAIaCwivkeB5EMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV
-...
-jScrvkiBO65F46KioCL9h5tDvomdU1aqpI/CBzhvZn1c0ZTf87tGQR8NK7v7
------END CERTIFICATE-----
-```
-* keys should look like:
-```
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEAvLYcyu8f3skuRyUgeeNpeDvYBCDcgq+LsWap6zbX5f8oLqp4
-...
-wrj2wDbCDCFmfqnSJ+dKI3vFLlEz44sAV8jX/kd4Y6ZTQhlLbYc=
------END RSA PRIVATE KEY-----
-````
-
-If you are going to use Helm to manage the certificates, please copy
-these values into the `certificate` and `key` values for a given
-`ingress.secrets` entry.
-
-If you are going are going to manage TLS secrets outside of Helm, please
-know that you can create a TLS secret by doing the following:
-
-```
-kubectl create secret tls wordpress.local-tls --key /path/to/key.key --cert /path/to/cert.crt
-```
-
-Please see [this example](https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx/examples/tls)
-for more information.
diff --git a/pkg/action/testdata/charts/chart-missing-deps/templates/NOTES.txt b/pkg/action/testdata/charts/chart-missing-deps/templates/NOTES.txt
deleted file mode 100755
index 55626e4d1..000000000
--- a/pkg/action/testdata/charts/chart-missing-deps/templates/NOTES.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-1. Get the WordPress URL:
-
-{{- if .Values.ingress.enabled }}
-
-  You should be able to access your new WordPress installation through
-
-  {{- range .Values.ingress.hosts }}
-  {{ if .tls }}https{{ else }}http{{ end }}://{{ .name }}/admin
-  {{- end }}
-  
-{{- else if contains "LoadBalancer" .Values.serviceType }}
-
-  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
-        Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "fullname" . }}'
-
-  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
-  echo "WordPress URL: http://$SERVICE_IP/"
-  echo "WordPress Admin URL: http://$SERVICE_IP/admin"
-
-{{- else if contains "ClusterIP"  .Values.serviceType }}
-
-  echo "WordPress URL: http://127.0.0.1:8080/"
-  echo "WordPress Admin URL: http://127.0.0.1:8080/admin"
-  kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "fullname" . }} 8080:80
-
-{{- else if contains "NodePort" .Values.serviceType }}
-
-  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "fullname" . }})
-  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
-  echo "WordPress URL: http://$NODE_IP:$NODE_PORT/"
-  echo "WordPress Admin URL: http://$NODE_IP:$NODE_PORT/admin"
-
-{{- end }}
-
-2. Login with the following credentials to see your blog
-
-  echo Username: {{ .Values.wordpressUsername }}
-  echo Password: $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "fullname" . }} -o jsonpath="{.data.wordpress-password}" | base64 --decode)
diff --git a/pkg/action/testdata/charts/chart-missing-deps/templates/_helpers.tpl b/pkg/action/testdata/charts/chart-missing-deps/templates/_helpers.tpl
deleted file mode 100755
index 1e52d321c..000000000
--- a/pkg/action/testdata/charts/chart-missing-deps/templates/_helpers.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{{/* vim: set filetype=mustache: */}}
-{{/*
-Expand the name of the chart.
-*/}}
-{{- define "name" -}}
-{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
-
-{{/*
-Create a default fully qualified app name.
-We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
-*/}}
-{{- define "fullname" -}}
-{{- $name := default .Chart.Name .Values.nameOverride -}}
-{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
-
-{{/*
-Create a default fully qualified app name.
-We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
-*/}}
-{{- define "mariadb.fullname" -}}
-{{- printf "%s-%s" .Release.Name "mariadb" | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
diff --git a/pkg/action/testdata/charts/chart-missing-deps/values.yaml b/pkg/action/testdata/charts/chart-missing-deps/values.yaml
deleted file mode 100755
index 3cb66dafd..000000000
--- a/pkg/action/testdata/charts/chart-missing-deps/values.yaml
+++ /dev/null
@@ -1,254 +0,0 @@
-## Bitnami WordPress image version
-## ref: https://hub.docker.com/r/bitnami/wordpress/tags/
-##
-image:
-  registry: docker.io
-  repository: bitnami/wordpress
-  tag: 4.9.8-debian-9
-  ## Specify a imagePullPolicy
-  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
-  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
-  ##
-  pullPolicy: IfNotPresent
-  ## Optionally specify an array of imagePullSecrets.
-  ## Secrets must be manually created in the namespace.
-  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
-  ##
-  # pullSecrets:
-  #   - myRegistrKeySecretName
-
-## User of the application
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressUsername: user
-
-## Application password
-## Defaults to a random 10-character alphanumeric string if not set
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-# wordpressPassword:
-
-## Admin email
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressEmail: user@example.com
-
-## First name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressFirstName: FirstName
-
-## Last name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressLastName: LastName
-
-## Blog name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressBlogName: User's Blog!
-
-## Table prefix
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressTablePrefix: wp_
-
-## Set to `yes` to allow the container to be started with blank passwords
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-allowEmptyPassword: yes
-
-## SMTP mail delivery configuration
-## ref: https://github.com/bitnami/bitnami-docker-wordpress/#smtp-configuration
-##
-# smtpHost:
-# smtpPort:
-# smtpUser:
-# smtpPassword:
-# smtpUsername:
-# smtpProtocol:
-
-replicaCount: 1
-
-externalDatabase:
-## All of these values are only used when mariadb.enabled is set to false
-  ## Database host
-  host: localhost
-
-  ## non-root Username for Wordpress Database
-  user: bn_wordpress
-
-  ## Database password
-  password: ""
-
-  ## Database name
-  database: bitnami_wordpress
-
-  ## Database port number
-  port: 3306
-
-##
-## MariaDB chart configuration
-##
-mariadb:
-  ## Whether to deploy a mariadb server to satisfy the applications database requirements. To use an external database set this to false and configure the externalDatabase parameters
-  enabled: true
-  ## Disable MariaDB replication
-  replication:
-    enabled: false
-
-  ## Create a database and a database user
-  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
-  ##
-  db:
-    name: bitnami_wordpress
-    user: bn_wordpress
-    ## If the password is not specified, mariadb will generates a random password
-    ##
-    # password:
-
-  ## MariaDB admin password
-  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
-  ##
-  # rootUser:
-  #   password:
-
-  ## Enable persistence using Persistent Volume Claims
-  ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
-  ##
-  master:
-    persistence:
-      enabled: true
-      ## mariadb data Persistent Volume Storage Class
-      ## If defined, storageClassName: <storageClass>
-      ## If set to "-", storageClassName: "", which disables dynamic provisioning
-      ## If undefined (the default) or set to null, no storageClassName spec is
-      ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
-      ##   GKE, AWS & OpenStack)
-      ##
-      # storageClass: "-"
-      accessMode: ReadWriteOnce
-      size: 8Gi
-
-## Kubernetes configuration
-## For minikube, set this to NodePort, elsewhere use LoadBalancer or ClusterIP
-##
-serviceType: LoadBalancer
-##
-## serviceType: NodePort
-## nodePorts:
-##   http: <to set explicitly, choose port between 30000-32767>
-##   https: <to set explicitly, choose port between 30000-32767>
-nodePorts:
-  http: ""
-  https: ""
-## Enable client source IP preservation
-## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
-##
-serviceExternalTrafficPolicy: Cluster
-
-## Allow health checks to be pointed at the https port
-healthcheckHttps: false
-
-## Configure extra options for liveness and readiness probes
-## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
-livenessProbe:
-  initialDelaySeconds: 120
-  periodSeconds: 10
-  timeoutSeconds: 5
-  failureThreshold: 6
-  successThreshold: 1
-readinessProbe:
-  initialDelaySeconds: 30
-  periodSeconds: 10
-  timeoutSeconds: 5
-  failureThreshold: 6
-  successThreshold: 1
-
-## Configure the ingress resource that allows you to access the
-## Wordpress installation. Set up the URL
-## ref: http://kubernetes.io/docs/user-guide/ingress/
-##
-ingress:
-  ## Set to true to enable ingress record generation
-  enabled: false
-
-  ## The list of hostnames to be covered with this ingress record.
-  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array
-  hosts:
-  - name: wordpress.local
-
-    ## Set this to true in order to enable TLS on the ingress record
-    ## A side effect of this will be that the backend wordpress service will be connected at port 443
-    tls: false
-
-    ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS
-    tlsSecret: wordpress.local-tls
-
-    ## Ingress annotations done as key:value pairs
-    ## If you're using kube-lego, you will want to add:
-    ## kubernetes.io/tls-acme: true
-    ##
-    ## For a full list of possible ingress annotations, please see
-    ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md
-    ##
-    ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set
-    annotations:
-    #  kubernetes.io/ingress.class: nginx
-    #  kubernetes.io/tls-acme: true
-
-  secrets:
-  ## If you're providing your own certificates, please use this to add the certificates as secrets
-  ## key and certificate should start with -----BEGIN CERTIFICATE----- or
-  ## -----BEGIN RSA PRIVATE KEY-----
-  ##
-  ## name should line up with a tlsSecret set further up
-  ## If you're using kube-lego, this is unneeded, as it will create the secret for you if it is not set
-  ##
-  ## It is also possible to create and manage the certificates outside of this helm chart
-  ## Please see README.md for more information
-  # - name: wordpress.local-tls
-  #   key:
-  #   certificate:
-
-## Enable persistence using Persistent Volume Claims
-## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
-##
-persistence:
-  enabled: true
-  ## wordpress data Persistent Volume Storage Class
-  ## If defined, storageClassName: <storageClass>
-  ## If set to "-", storageClassName: "", which disables dynamic provisioning
-  ## If undefined (the default) or set to null, no storageClassName spec is
-  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
-  ##   GKE, AWS & OpenStack)
-  ##
-  # storageClass: "-"
-  ##
-  ## If you want to reuse an existing claim, you can pass the name of the PVC using
-  ## the existingClaim variable
-  # existingClaim: your-claim
-  accessMode: ReadWriteOnce
-  size: 10Gi
-
-## Configure resource requests and limits
-## ref: http://kubernetes.io/docs/user-guide/compute-resources/
-##
-resources:
-  requests:
-    memory: 512Mi
-    cpu: 300m
-
-## Node labels for pod assignment
-## Ref: https://kubernetes.io/docs/user-guide/node-selection/
-##
-nodeSelector: {}
-
-## Tolerations for pod assignment
-## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
-##
-tolerations: []
-
-## Affinity for pod assignment
-## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
-##
-affinity: {}
diff --git a/pkg/action/testdata/charts/chart-with-compressed-dependencies/.helmignore b/pkg/action/testdata/charts/chart-with-compressed-dependencies/.helmignore
deleted file mode 100755
index e2cf7941f..000000000
--- a/pkg/action/testdata/charts/chart-with-compressed-dependencies/.helmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.git
-# OWNERS file for Kubernetes
-OWNERS
-# example production yaml
-values-production.yaml
\ No newline at end of file
diff --git a/pkg/action/testdata/charts/chart-with-compressed-dependencies/Chart.yaml b/pkg/action/testdata/charts/chart-with-compressed-dependencies/Chart.yaml
index 602644caa..1d16590b6 100755
--- a/pkg/action/testdata/charts/chart-with-compressed-dependencies/Chart.yaml
+++ b/pkg/action/testdata/charts/chart-with-compressed-dependencies/Chart.yaml
@@ -1,20 +1,2 @@
-appVersion: 4.9.8
-description: Web publishing platform for building blogs and websites.
-engine: gotpl
-home: http://www.wordpress.com/
-icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
-keywords:
-- wordpress
-- cms
-- blog
-- http
-- web
-- application
-- php
-maintainers:
-- email: containers@bitnami.com
-  name: bitnami-bot
 name: chart-with-compressed-dependencies
-sources:
-- https://github.com/bitnami/bitnami-docker-wordpress
 version: 2.1.8
diff --git a/pkg/action/testdata/charts/chart-with-compressed-dependencies/README.md b/pkg/action/testdata/charts/chart-with-compressed-dependencies/README.md
deleted file mode 100755
index 3174417e0..000000000
--- a/pkg/action/testdata/charts/chart-with-compressed-dependencies/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# WordPress
-
-This is a testing fork of the Wordpress chart. It is not operational.
diff --git a/pkg/action/testdata/charts/chart-with-compressed-dependencies/templates/NOTES.txt b/pkg/action/testdata/charts/chart-with-compressed-dependencies/templates/NOTES.txt
deleted file mode 100755
index 3b94f9157..000000000
--- a/pkg/action/testdata/charts/chart-with-compressed-dependencies/templates/NOTES.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-Placeholder
diff --git a/pkg/action/testdata/charts/chart-with-compressed-dependencies/values.yaml b/pkg/action/testdata/charts/chart-with-compressed-dependencies/values.yaml
deleted file mode 100755
index 3cb66dafd..000000000
--- a/pkg/action/testdata/charts/chart-with-compressed-dependencies/values.yaml
+++ /dev/null
@@ -1,254 +0,0 @@
-## Bitnami WordPress image version
-## ref: https://hub.docker.com/r/bitnami/wordpress/tags/
-##
-image:
-  registry: docker.io
-  repository: bitnami/wordpress
-  tag: 4.9.8-debian-9
-  ## Specify a imagePullPolicy
-  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
-  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
-  ##
-  pullPolicy: IfNotPresent
-  ## Optionally specify an array of imagePullSecrets.
-  ## Secrets must be manually created in the namespace.
-  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
-  ##
-  # pullSecrets:
-  #   - myRegistrKeySecretName
-
-## User of the application
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressUsername: user
-
-## Application password
-## Defaults to a random 10-character alphanumeric string if not set
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-# wordpressPassword:
-
-## Admin email
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressEmail: user@example.com
-
-## First name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressFirstName: FirstName
-
-## Last name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressLastName: LastName
-
-## Blog name
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressBlogName: User's Blog!
-
-## Table prefix
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-##
-wordpressTablePrefix: wp_
-
-## Set to `yes` to allow the container to be started with blank passwords
-## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables
-allowEmptyPassword: yes
-
-## SMTP mail delivery configuration
-## ref: https://github.com/bitnami/bitnami-docker-wordpress/#smtp-configuration
-##
-# smtpHost:
-# smtpPort:
-# smtpUser:
-# smtpPassword:
-# smtpUsername:
-# smtpProtocol:
-
-replicaCount: 1
-
-externalDatabase:
-## All of these values are only used when mariadb.enabled is set to false
-  ## Database host
-  host: localhost
-
-  ## non-root Username for Wordpress Database
-  user: bn_wordpress
-
-  ## Database password
-  password: ""
-
-  ## Database name
-  database: bitnami_wordpress
-
-  ## Database port number
-  port: 3306
-
-##
-## MariaDB chart configuration
-##
-mariadb:
-  ## Whether to deploy a mariadb server to satisfy the applications database requirements. To use an external database set this to false and configure the externalDatabase parameters
-  enabled: true
-  ## Disable MariaDB replication
-  replication:
-    enabled: false
-
-  ## Create a database and a database user
-  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
-  ##
-  db:
-    name: bitnami_wordpress
-    user: bn_wordpress
-    ## If the password is not specified, mariadb will generates a random password
-    ##
-    # password:
-
-  ## MariaDB admin password
-  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
-  ##
-  # rootUser:
-  #   password:
-
-  ## Enable persistence using Persistent Volume Claims
-  ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
-  ##
-  master:
-    persistence:
-      enabled: true
-      ## mariadb data Persistent Volume Storage Class
-      ## If defined, storageClassName: <storageClass>
-      ## If set to "-", storageClassName: "", which disables dynamic provisioning
-      ## If undefined (the default) or set to null, no storageClassName spec is
-      ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
-      ##   GKE, AWS & OpenStack)
-      ##
-      # storageClass: "-"
-      accessMode: ReadWriteOnce
-      size: 8Gi
-
-## Kubernetes configuration
-## For minikube, set this to NodePort, elsewhere use LoadBalancer or ClusterIP
-##
-serviceType: LoadBalancer
-##
-## serviceType: NodePort
-## nodePorts:
-##   http: <to set explicitly, choose port between 30000-32767>
-##   https: <to set explicitly, choose port between 30000-32767>
-nodePorts:
-  http: ""
-  https: ""
-## Enable client source IP preservation
-## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
-##
-serviceExternalTrafficPolicy: Cluster
-
-## Allow health checks to be pointed at the https port
-healthcheckHttps: false
-
-## Configure extra options for liveness and readiness probes
-## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
-livenessProbe:
-  initialDelaySeconds: 120
-  periodSeconds: 10
-  timeoutSeconds: 5
-  failureThreshold: 6
-  successThreshold: 1
-readinessProbe:
-  initialDelaySeconds: 30
-  periodSeconds: 10
-  timeoutSeconds: 5
-  failureThreshold: 6
-  successThreshold: 1
-
-## Configure the ingress resource that allows you to access the
-## Wordpress installation. Set up the URL
-## ref: http://kubernetes.io/docs/user-guide/ingress/
-##
-ingress:
-  ## Set to true to enable ingress record generation
-  enabled: false
-
-  ## The list of hostnames to be covered with this ingress record.
-  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array
-  hosts:
-  - name: wordpress.local
-
-    ## Set this to true in order to enable TLS on the ingress record
-    ## A side effect of this will be that the backend wordpress service will be connected at port 443
-    tls: false
-
-    ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS
-    tlsSecret: wordpress.local-tls
-
-    ## Ingress annotations done as key:value pairs
-    ## If you're using kube-lego, you will want to add:
-    ## kubernetes.io/tls-acme: true
-    ##
-    ## For a full list of possible ingress annotations, please see
-    ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md
-    ##
-    ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set
-    annotations:
-    #  kubernetes.io/ingress.class: nginx
-    #  kubernetes.io/tls-acme: true
-
-  secrets:
-  ## If you're providing your own certificates, please use this to add the certificates as secrets
-  ## key and certificate should start with -----BEGIN CERTIFICATE----- or
-  ## -----BEGIN RSA PRIVATE KEY-----
-  ##
-  ## name should line up with a tlsSecret set further up
-  ## If you're using kube-lego, this is unneeded, as it will create the secret for you if it is not set
-  ##
-  ## It is also possible to create and manage the certificates outside of this helm chart
-  ## Please see README.md for more information
-  # - name: wordpress.local-tls
-  #   key:
-  #   certificate:
-
-## Enable persistence using Persistent Volume Claims
-## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
-##
-persistence:
-  enabled: true
-  ## wordpress data Persistent Volume Storage Class
-  ## If defined, storageClassName: <storageClass>
-  ## If set to "-", storageClassName: "", which disables dynamic provisioning
-  ## If undefined (the default) or set to null, no storageClassName spec is
-  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
-  ##   GKE, AWS & OpenStack)
-  ##
-  # storageClass: "-"
-  ##
-  ## If you want to reuse an existing claim, you can pass the name of the PVC using
-  ## the existingClaim variable
-  # existingClaim: your-claim
-  accessMode: ReadWriteOnce
-  size: 10Gi
-
-## Configure resource requests and limits
-## ref: http://kubernetes.io/docs/user-guide/compute-resources/
-##
-resources:
-  requests:
-    memory: 512Mi
-    cpu: 300m
-
-## Node labels for pod assignment
-## Ref: https://kubernetes.io/docs/user-guide/node-selection/
-##
-nodeSelector: {}
-
-## Tolerations for pod assignment
-## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
-##
-tolerations: []
-
-## Affinity for pod assignment
-## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
-##
-affinity: {}
diff --git a/cmd/helm/testdata/testcharts/chart-with-no-templates-dir/Chart.yaml b/pkg/action/testdata/charts/chart-with-no-templates-dir/Chart.yaml
similarity index 100%
rename from cmd/helm/testdata/testcharts/chart-with-no-templates-dir/Chart.yaml
rename to pkg/action/testdata/charts/chart-with-no-templates-dir/Chart.yaml
diff --git a/pkg/action/testdata/charts/chart-with-schema-negative/Chart.yaml b/pkg/action/testdata/charts/chart-with-schema-negative/Chart.yaml
new file mode 100644
index 000000000..395d24f6a
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema-negative/Chart.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+description: Empty testing chart
+home: https://k8s.io/helm
+name: empty
+sources:
+- https://github.com/kubernetes/helm
+version: 0.1.0
diff --git a/pkg/action/testdata/charts/chart-with-schema-negative/templates/empty.yaml b/pkg/action/testdata/charts/chart-with-schema-negative/templates/empty.yaml
new file mode 100644
index 000000000..c80812f6e
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema-negative/templates/empty.yaml
@@ -0,0 +1,1 @@
+# This file is intentionally blank
diff --git a/pkg/action/testdata/charts/chart-with-schema-negative/values.schema.json b/pkg/action/testdata/charts/chart-with-schema-negative/values.schema.json
new file mode 100644
index 000000000..4df89bbe8
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema-negative/values.schema.json
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "properties": {
+    "addresses": {
+      "description": "List of addresses",
+      "items": {
+        "properties": {
+          "city": {
+            "type": "string"
+          },
+          "number": {
+            "type": "number"
+          },
+          "street": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "age": {
+      "description": "Age",
+      "minimum": 0,
+      "type": "integer"
+    },
+    "employmentInfo": {
+      "properties": {
+        "salary": {
+          "minimum": 0,
+          "type": "number"
+        },
+        "title": {
+          "type": "string"
+        }
+      },
+      "required": [
+        "salary"
+      ],
+      "type": "object"
+    },
+    "firstname": {
+      "description": "First name",
+      "type": "string"
+    },
+    "lastname": {
+      "type": "string"
+    },
+    "likesCoffee": {
+      "type": "boolean"
+    },
+    "phoneNumbers": {
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    }
+  },
+  "required": [
+    "firstname",
+    "lastname",
+    "addresses",
+    "employmentInfo"
+  ],
+  "title": "Values",
+  "type": "object"
+}
diff --git a/pkg/action/testdata/charts/chart-with-schema-negative/values.yaml b/pkg/action/testdata/charts/chart-with-schema-negative/values.yaml
new file mode 100644
index 000000000..5a1250bff
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema-negative/values.yaml
@@ -0,0 +1,14 @@
+firstname: John
+lastname: Doe
+age: -5
+likesCoffee: true
+addresses:
+  - city: Springfield
+    street: Main
+    number: 12345
+  - city: New York
+    street: Broadway
+    number: 67890
+phoneNumbers:
+  - "(888) 888-8888"
+  - "(555) 555-5555"
diff --git a/pkg/action/testdata/charts/chart-with-schema/Chart.yaml b/pkg/action/testdata/charts/chart-with-schema/Chart.yaml
new file mode 100644
index 000000000..395d24f6a
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema/Chart.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+description: Empty testing chart
+home: https://k8s.io/helm
+name: empty
+sources:
+- https://github.com/kubernetes/helm
+version: 0.1.0
diff --git a/pkg/action/testdata/charts/chart-with-schema/extra-values.yaml b/pkg/action/testdata/charts/chart-with-schema/extra-values.yaml
new file mode 100644
index 000000000..76c290c4f
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema/extra-values.yaml
@@ -0,0 +1,2 @@
+age: -5
+employmentInfo: null
diff --git a/pkg/action/testdata/charts/chart-with-schema/templates/empty.yaml b/pkg/action/testdata/charts/chart-with-schema/templates/empty.yaml
new file mode 100644
index 000000000..c80812f6e
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema/templates/empty.yaml
@@ -0,0 +1,1 @@
+# This file is intentionally blank
diff --git a/pkg/action/testdata/charts/chart-with-schema/values.schema.json b/pkg/action/testdata/charts/chart-with-schema/values.schema.json
new file mode 100644
index 000000000..4df89bbe8
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema/values.schema.json
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "properties": {
+    "addresses": {
+      "description": "List of addresses",
+      "items": {
+        "properties": {
+          "city": {
+            "type": "string"
+          },
+          "number": {
+            "type": "number"
+          },
+          "street": {
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "age": {
+      "description": "Age",
+      "minimum": 0,
+      "type": "integer"
+    },
+    "employmentInfo": {
+      "properties": {
+        "salary": {
+          "minimum": 0,
+          "type": "number"
+        },
+        "title": {
+          "type": "string"
+        }
+      },
+      "required": [
+        "salary"
+      ],
+      "type": "object"
+    },
+    "firstname": {
+      "description": "First name",
+      "type": "string"
+    },
+    "lastname": {
+      "type": "string"
+    },
+    "likesCoffee": {
+      "type": "boolean"
+    },
+    "phoneNumbers": {
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    }
+  },
+  "required": [
+    "firstname",
+    "lastname",
+    "addresses",
+    "employmentInfo"
+  ],
+  "title": "Values",
+  "type": "object"
+}
diff --git a/pkg/action/testdata/charts/chart-with-schema/values.yaml b/pkg/action/testdata/charts/chart-with-schema/values.yaml
new file mode 100644
index 000000000..042dea664
--- /dev/null
+++ b/pkg/action/testdata/charts/chart-with-schema/values.yaml
@@ -0,0 +1,17 @@
+firstname: John
+lastname: Doe
+age: 25
+likesCoffee: true
+employmentInfo:
+  title: Software Developer
+  salary: 100000
+addresses:
+  - city: Springfield
+    street: Main
+    number: 12345
+  - city: New York
+    street: Broadway
+    number: 67890
+phoneNumbers:
+  - "(888) 888-8888"
+  - "(555) 555-5555"