@ -17,13 +17,9 @@ package main
import (
import (
"bytes"
"bytes"
"fmt"
"io/ioutil"
"os"
"os"
"path/filepath"
"path/filepath"
"regexp"
"regexp"
"runtime"
"strings"
"testing"
"testing"
"github.com/spf13/cobra"
"github.com/spf13/cobra"
@ -31,15 +27,9 @@ import (
"helm.sh/helm/v3/internal/test/ensure"
"helm.sh/helm/v3/internal/test/ensure"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chart/loader"
"helm.sh/helm/v3/pkg/chart/loader"
"helm.sh/helm/v3/pkg/chartutil"
)
)
func TestPackage ( t * testing . T ) {
func TestPackage ( t * testing . T ) {
statFileMsg := "no such file or directory"
if runtime . GOOS == "windows" {
statFileMsg = "The system cannot find the file specified."
}
tests := [ ] struct {
tests := [ ] struct {
name string
name string
flags map [ string ] string
flags map [ string ] string
@ -108,13 +98,6 @@ func TestPackage(t *testing.T) {
hasfile : "chart-missing-deps-0.1.0.tgz" ,
hasfile : "chart-missing-deps-0.1.0.tgz" ,
err : true ,
err : true ,
} ,
} ,
{
name : "package --values does-not-exist" ,
args : [ ] string { "testdata/testcharts/alpine" } ,
flags : map [ string ] string { "values" : "does-not-exist" } ,
expect : fmt . Sprintf ( "does-not-exist: %s" , statFileMsg ) ,
err : true ,
} ,
{
{
name : "package testdata/testcharts/chart-bad-type" ,
name : "package testdata/testcharts/chart-bad-type" ,
args : [ ] string { "testdata/testcharts/chart-bad-type" } ,
args : [ ] string { "testdata/testcharts/chart-bad-type" } ,
@ -213,159 +196,6 @@ func TestSetAppVersion(t *testing.T) {
}
}
}
}
func TestPackageValues ( t * testing . T ) {
defer resetEnv ( ) ( )
repoFile := "testdata/helmhome/helm/repositories.yaml"
testCases := [ ] struct {
desc string
args [ ] string
valuefilesContents [ ] string
flags map [ string ] string
expected [ ] string
} {
{
desc : "helm package, single values file" ,
args : [ ] string { "testdata/testcharts/alpine" } ,
flags : map [ string ] string { "repository-config" : repoFile } ,
valuefilesContents : [ ] string { "Name: chart-name-foo" } ,
expected : [ ] string { "Name: chart-name-foo" } ,
} ,
{
desc : "helm package, multiple values files" ,
args : [ ] string { "testdata/testcharts/alpine" } ,
flags : map [ string ] string { "repository-config" : repoFile } ,
valuefilesContents : [ ] string { "Name: chart-name-foo" , "foo: bar" } ,
expected : [ ] string { "Name: chart-name-foo" , "foo: bar" } ,
} ,
{
desc : "helm package, with set option" ,
args : [ ] string { "testdata/testcharts/alpine" } ,
flags : map [ string ] string { "set" : "Name=chart-name-foo" , "repository-config" : repoFile } ,
expected : [ ] string { "Name: chart-name-foo" } ,
} ,
{
desc : "helm package, set takes precedence over value file" ,
args : [ ] string { "testdata/testcharts/alpine" } ,
valuefilesContents : [ ] string { "Name: chart-name-foo" } ,
flags : map [ string ] string { "set" : "Name=chart-name-bar" , "repository-config" : repoFile } ,
expected : [ ] string { "Name: chart-name-bar" } ,
} ,
}
for _ , tc := range testCases {
var files [ ] string
for _ , contents := range tc . valuefilesContents {
f := createValuesFile ( t , contents )
files = append ( files , f )
}
valueFiles := strings . Join ( files , "," )
expected , err := chartutil . ReadValues ( [ ] byte ( strings . Join ( tc . expected , "\n" ) ) )
if err != nil {
t . Errorf ( "unexpected error parsing values: %q" , err )
}
outputDir := ensure . TempDir ( t )
if len ( tc . flags ) == 0 {
tc . flags = make ( map [ string ] string )
}
tc . flags [ "destination" ] = outputDir
if len ( valueFiles ) > 0 {
tc . flags [ "values" ] = valueFiles
}
cmd := newPackageCmd ( & bytes . Buffer { } )
setFlags ( cmd , tc . flags )
if err := cmd . RunE ( cmd , tc . args ) ; err != nil {
t . Fatalf ( "unexpected error: %q" , err )
}
outputFile := filepath . Join ( outputDir , "alpine-0.1.0.tgz" )
verifyOutputChartExists ( t , outputFile )
actual , err := getChartValues ( outputFile )
if err != nil {
t . Fatalf ( "unexpected error extracting chart values: %q" , err )
}
verifyValues ( t , actual , expected )
}
}
func TestNonExistentDirAndBadPermission ( t * testing . T ) {
nonExistentDir := "testdata/testcharts/non-existent-directory"
tests := [ ] struct {
name string
flags map [ string ] string
args [ ] string
expect string
hasfile string
err bool
} {
{
name : "package testdata/testcharts/non-existent-directory" ,
args : [ ] string { "testdata/testcharts/non-existent-directory" } ,
expect : fmt . Sprintf ( "stat %s: no such file or directory" , nonExistentDir ) ,
err : true ,
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
var buf bytes . Buffer
c := newPackageCmd ( & buf )
re := regexp . MustCompile ( tt . expect )
err := c . RunE ( c , tt . args )
if err != nil {
if tt . err && re . MatchString ( err . Error ( ) ) {
return
}
t . Fatalf ( "%q: expected error %q, got %q" , tt . name , tt . expect , err )
}
} )
}
}
func createValuesFile ( t * testing . T , data string ) string {
outputDir := ensure . TempDir ( t )
outputFile := filepath . Join ( outputDir , "values.yaml" )
if err := ioutil . WriteFile ( outputFile , [ ] byte ( data ) , 0644 ) ; err != nil {
t . Fatalf ( "err: %s" , err )
}
return outputFile
}
func getChartValues ( chartPath string ) ( chartutil . Values , error ) {
chart , err := loader . Load ( chartPath )
if err != nil {
return nil , err
}
return chart . Values , nil
}
func verifyValues ( t * testing . T , actual , expected chartutil . Values ) {
t . Helper ( )
for key , value := range expected . AsMap ( ) {
if got := actual [ key ] ; got != value {
t . Errorf ( "Expected %q, got %q (%v)" , value , got , actual )
}
}
}
func verifyOutputChartExists ( t * testing . T , chartPath string ) {
if chartFile , err := os . Stat ( chartPath ) ; err != nil {
t . Errorf ( "expected file %q, got err %q" , chartPath , err )
} else if chartFile . Size ( ) == 0 {
t . Errorf ( "file %q has zero bytes." , chartPath )
}
}
func setFlags ( cmd * cobra . Command , flags map [ string ] string ) {
func setFlags ( cmd * cobra . Command , flags map [ string ] string ) {
dest := cmd . Flags ( )
dest := cmd . Flags ( )
for f , v := range flags {
for f , v := range flags {