+// -
+// ========================LICENSE_START=================================
+// O-RAN-SC
+// %%
+// Copyright (C) 2022: Nordix Foundation
+// %%
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// ========================LICENSE_END===================================
+//
+
+package helmmanagement
+
+import (
+ "bufio"
+ "bytes"
+ "log"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
+ "gopkg.in/yaml.v2"
+ "helm.sh/helm/v3/pkg/cli"
+ "helm.sh/helm/v3/pkg/getter"
+ "helm.sh/helm/v3/pkg/repo"
+ "helm.sh/helm/v3/pkg/time"
+ "oransc.org/nonrtric/capifcore/internal/helmmanagement/mocks"
+)
+
+func TestSetUpRepo_repoShouldBeAddedToReposFile(t *testing.T) {
+ settings := createReposFile(t)
+
+ managerUnderTest := NewHelmManager(settings)
+
+ repoName := "repoName"
+ repoURL := "http://url"
+ managerUnderTest.repo = getChartRepo(settings)
+
+ res := managerUnderTest.SetUpRepo(repoName, repoURL)
+
+ assert.Nil(t, res)
+ assert.True(t, containsRepo(settings.RepositoryConfig, repoName))
+}
+
+func createReposFile(t *testing.T) *cli.EnvSettings {
+ reposDir, err := os.MkdirTemp("", "helm")
+ if err != nil {
+ t.Errorf("Unable to create temporary directory for repos due to: %v", err)
+ }
+ t.Cleanup(func() {
+ os.RemoveAll(reposDir)
+ })
+
+ reposFile := reposDir + "/repositories.yaml"
+ settings := &cli.EnvSettings{
+ RepositoryConfig: reposFile,
+ }
+
+ repoData := repo.File{
+ Generated: time.Now().Time,
+ Repositories: []*repo.Entry{},
+ }
+ data, err := yaml.Marshal(&repoData)
+ if err != nil {
+ assert.Fail(t, "Unable to marshal repo config yaml")
+ }
+ err2 := os.WriteFile(settings.RepositoryConfig, data, 0666)
+ if err2 != nil {
+ assert.Fail(t, "Unable to write repo config file")
+ }
+ return settings
+}
+
+func getChartRepo(settings *cli.EnvSettings) *repo.ChartRepository {
+ repoURL := "http://repoURL"
+ c := repo.Entry{
+ Name: "",
+ URL: repoURL,
+ }
+ r, _ := repo.NewChartRepository(&c, getter.All(settings))
+ r.Client = getCLientMock(repoURL)
+ return r
+}
+
+func getCLientMock(repoURL string) *mocks.Getter {
+ clientMock := &mocks.Getter{}
+ b := []byte("apiVersion: v1\nentries: {}\ngenerated: \"2022-10-28T09:14:08+02:00\"\nserverInfo: {}\n")
+ z := bytes.NewBuffer(b)
+ clientMock.On("Get", repoURL+"/index.yaml", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(z, nil)
+ return clientMock
+}
+
+func containsRepo(repoFile, repoName string) bool {
+ file, err := os.Open(repoFile)
+ if err != nil {
+ log.Fatalf("Error opening repository file: %v", err)
+ }
+ defer func(file *os.File) {
+ _ = file.Close()
+ }(file)
+
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ row := scanner.Text()
+ if strings.Contains(row, repoName) {
+ return true
+ }
+ }
+ return false
+}