@ -17,10 +17,14 @@ package downloader
import (
"bytes"
"path/filepath"
"reflect"
"testing"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chartutil"
"helm.sh/helm/v3/pkg/getter"
"helm.sh/helm/v3/pkg/repo/repotest"
)
func TestVersionEquals ( t * testing . T ) {
@ -176,3 +180,106 @@ func TestGetRepoNames(t *testing.T) {
}
}
}
// This function is the skeleton test code of failing tests for #6416 and bugs due to #5874.
// This function is used by below tests that ensures success of build operation
// with optional fields, alias, condition, tags, and even with ranged version.
// Parent chart includes local-subchart 0.1.0 subchart from a fake repository, by default.
// If each of these main fields (name, version, repository) is not supplied by dep param, default value will be used.
func checkBuildWithOptionalFields ( t * testing . T , chartName string , dep chart . Dependency ) {
// Set up a fake repo
srv , err := repotest . NewTempServer ( "testdata/*.tgz*" )
if err != nil {
t . Fatal ( err )
}
defer srv . Stop ( )
if err := srv . LinkIndices ( ) ; err != nil {
t . Fatal ( err )
}
dir := func ( p ... string ) string {
return filepath . Join ( append ( [ ] string { srv . Root ( ) } , p ... ) ... )
}
// Set main fields if not exist
if dep . Name == "" {
dep . Name = "local-subchart"
}
if dep . Version == "" {
dep . Version = "0.1.0"
}
if dep . Repository == "" {
dep . Repository = srv . URL ( )
}
// Save a chart
c := & chart . Chart {
Metadata : & chart . Metadata {
Name : chartName ,
Version : "0.1.0" ,
APIVersion : "v1" ,
Dependencies : [ ] * chart . Dependency { & dep } ,
} ,
}
if err := chartutil . SaveDir ( c , dir ( ) ) ; err != nil {
t . Fatal ( err )
}
// Set-up a manager
b := bytes . NewBuffer ( nil )
g := getter . Providers { getter . Provider {
Schemes : [ ] string { "http" , "https" } ,
New : getter . NewHTTPGetter ,
} }
m := & Manager {
ChartPath : dir ( chartName ) ,
Out : b ,
Getters : g ,
RepositoryConfig : dir ( "repositories.yaml" ) ,
RepositoryCache : dir ( ) ,
}
// First build will update dependencies and create Chart.lock file.
err = m . Build ( )
if err != nil {
t . Fatal ( err )
}
// Second build should be passed. See PR #6655.
err = m . Build ( )
if err != nil {
t . Fatal ( err )
}
}
func TestBuild_WithoutOptionalFields ( t * testing . T ) {
// Dependency has main fields only (name/version/repository)
checkBuildWithOptionalFields ( t , "without-optional-fields" , chart . Dependency { } )
}
func TestBuild_WithSemVerRange ( t * testing . T ) {
// Dependency version is the form of SemVer range
checkBuildWithOptionalFields ( t , "with-semver-range" , chart . Dependency {
Version : ">=0.1.0" ,
} )
}
func TestBuild_WithAlias ( t * testing . T ) {
// Dependency has an alias
checkBuildWithOptionalFields ( t , "with-alias" , chart . Dependency {
Alias : "local-subchart-alias" ,
} )
}
func TestBuild_WithCondition ( t * testing . T ) {
// Dependency has a condition
checkBuildWithOptionalFields ( t , "with-condition" , chart . Dependency {
Condition : "some.condition" ,
} )
}
func TestBuild_WithTags ( t * testing . T ) {
// Dependency has several tags
checkBuildWithOptionalFields ( t , "with-tags" , chart . Dependency {
Tags : [ ] string { "tag1" , "tag2" } ,
} )
}