diff --git a/pkg/repo/chartrepo_test.go b/pkg/repo/chartrepo_test.go index 8e2071b01..df624cfca 100644 --- a/pkg/repo/chartrepo_test.go +++ b/pkg/repo/chartrepo_test.go @@ -17,6 +17,7 @@ limitations under the License. package repo import ( + "bytes" "io/ioutil" "net/http" "net/http/httptest" @@ -30,6 +31,8 @@ import ( "helm.sh/helm/pkg/chart" "helm.sh/helm/pkg/cli" "helm.sh/helm/pkg/getter" + + "sigs.k8s.io/yaml" ) const ( @@ -108,6 +111,64 @@ func TestIndex(t *testing.T) { verifyIndex(t, second) } +type CustomGetter struct { + repoUrls []string +} + +func (g *CustomGetter) Get(href string) (*bytes.Buffer, error) { + index := &IndexFile{ + APIVersion: "v1", + Generated: time.Now(), + } + indexBytes, err := yaml.Marshal(index) + if err != nil { + return nil, err + } + g.repoUrls = append(g.repoUrls, href) + return bytes.NewBuffer(indexBytes), nil +} + +func TestIndexCustomSchemeDownload(t *testing.T) { + repoName := "gcs-repo" + repoURL := "gs://some-gcs-bucket" + myCustomGetter := &CustomGetter{} + customGetterConstructor := func(options ...getter.Option) (getter.Getter, error) { + return myCustomGetter, nil + } + providers := getter.Providers{ + { + Schemes: []string{"gs"}, + New: customGetterConstructor, + }, + } + repo, err := NewChartRepository(&Entry{ + Name: repoName, + URL: repoURL, + }, providers) + if err != nil { + t.Fatalf("Problem loading chart repository from %s: %v", repoURL, err) + } + + tempIndexFile, err := ioutil.TempFile("", "test-repo") + if err != nil { + t.Fatalf("Failed to create temp index file: %v", err) + } + defer os.Remove(tempIndexFile.Name()) + + if err := repo.DownloadIndexFile(tempIndexFile.Name()); err != nil { + t.Fatalf("Failed to download index file: %v", err) + } + + if len(myCustomGetter.repoUrls) != 1 { + t.Fatalf("Custom Getter.Get should be called once") + } + + expectedRepoIndexURL := repoURL + "/index.yaml" + if myCustomGetter.repoUrls[0] != expectedRepoIndexURL { + t.Fatalf("Custom Getter.Get should be called with %s", expectedRepoIndexURL) + } +} + func verifyIndex(t *testing.T, actual *IndexFile) { var empty time.Time if actual.Generated == empty {