github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/step/step_tag_test.go (about)

     1  // +build unit
     2  
     3  package step
     4  
     5  import (
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/olli-ai/jx/v2/pkg/cmd/opts/step"
    11  
    12  	"io/ioutil"
    13  	"os"
    14  	"path"
    15  
    16  	"github.com/olli-ai/jx/v2/pkg/cmd/opts"
    17  	"github.com/olli-ai/jx/v2/pkg/gits"
    18  	"github.com/olli-ai/jx/v2/pkg/util"
    19  	"github.com/stretchr/testify/assert"
    20  	"k8s.io/helm/pkg/chartutil"
    21  )
    22  
    23  func TestStepTagCharts(t *testing.T) {
    24  	t.Parallel()
    25  	f, err := ioutil.TempDir("", "test-step-tag-charts")
    26  	assert.NoError(t, err)
    27  	defer os.RemoveAll(f)
    28  
    29  	testData := path.Join("test_data", "step_tag_project")
    30  	_, err = os.Stat(testData)
    31  	assert.NoError(t, err)
    32  
    33  	err = util.CopyDir(testData, f, true)
    34  	assert.NoError(t, err)
    35  
    36  	expectedVersion := "1.2.3"
    37  	expectedImageName := "docker.io/jenkinsxio/awesome"
    38  
    39  	chartsDir := filepath.Join(f, "charts", "mydemo")
    40  	chartFile := filepath.Join(chartsDir, "Chart.yaml")
    41  	valuesFile := filepath.Join(chartsDir, "values.yaml")
    42  
    43  	o := StepTagOptions{
    44  		StepOptions: step.StepOptions{
    45  			CommonOptions: &opts.CommonOptions{},
    46  		},
    47  	}
    48  	//o.Out = tests.Output()
    49  	o.Flags.ChartsDir = chartsDir
    50  	o.Flags.Version = expectedVersion
    51  	o.Flags.ChartValueRepository = expectedImageName
    52  	o.SetGit(&gits.GitFake{})
    53  	err = o.Run()
    54  	assert.NoError(t, err)
    55  
    56  	// root file
    57  	chart, err := chartutil.LoadChartfile(chartFile)
    58  	assert.NoError(t, err, "failed to load file %s", chartFile)
    59  
    60  	assert.Equal(t, expectedVersion, chart.Version, "replaced chart version")
    61  	assert.Equal(t, expectedVersion, chart.AppVersion, "replaced chart appVersion")
    62  
    63  	data, err := ioutil.ReadFile(valuesFile)
    64  	assert.NoError(t, err, "failed to load file %s", valuesFile)
    65  	lines := strings.Split(string(data), "\n")
    66  
    67  	foundRepo := false
    68  	foundVersion := false
    69  	anotherImage := false
    70  	for _, line := range lines {
    71  		if strings.HasPrefix(line, "anotherImage:") {
    72  			anotherImage = true
    73  		}
    74  		if strings.HasPrefix(line, ValuesYamlRepositoryPrefix) {
    75  			value := strings.TrimSpace(strings.TrimPrefix(line, ValuesYamlRepositoryPrefix))
    76  			if anotherImage {
    77  				assert.Equal(t, "anotherImageRepoValue", value, "values.yaml anotherImage.repository: attribute")
    78  			} else {
    79  				foundRepo = true
    80  				assert.Equal(t, expectedImageName, value, "values.yaml repository: attribute")
    81  			}
    82  		} else if strings.HasPrefix(line, ValuesYamlTagPrefix) {
    83  			value := strings.TrimSpace(strings.TrimPrefix(line, ValuesYamlTagPrefix))
    84  			if anotherImage {
    85  				assert.Equal(t, "anotherImageTagValue", value, "values.yaml anotherImage.tag: attribute")
    86  			} else {
    87  				foundVersion = true
    88  				assert.Equal(t, expectedVersion, value, "values.yaml tag: attribute")
    89  			}
    90  		}
    91  	}
    92  
    93  	assert.True(t, foundRepo, "Failed to find tag '%s' in file %s", ValuesYamlRepositoryPrefix, valuesFile)
    94  	assert.True(t, foundVersion, "Failed to find tag '%s' in file %s", ValuesYamlTagPrefix, valuesFile)
    95  }
    96  
    97  func TestDefaultChartValueRepositoryValidName(t *testing.T) {
    98  	f, err := ioutil.TempDir("", "test-step-tag-valid-name")
    99  	assert.NoError(t, err)
   100  	defer os.RemoveAll(f)
   101  
   102  	if app, clean := os.LookupEnv("APP_NAME"); clean {
   103  		assert.NoError(t, os.Unsetenv("APP_NAME"))
   104  		defer os.Setenv("APP_NAME", app)
   105  	}
   106  	if app, clean := os.LookupEnv("REPO_NAME"); clean {
   107  		assert.NoError(t, os.Unsetenv("REPO_NAME"))
   108  		defer os.Setenv("REPO_NAME", app)
   109  	}
   110  
   111  	testData := path.Join("test_data", "step_tag_project")
   112  	_, err = os.Stat(testData)
   113  	assert.NoError(t, err)
   114  
   115  	err = util.CopyDir(testData, f, true)
   116  	assert.NoError(t, err)
   117  
   118  	expectedImageName := "docker.io/jenkinsxio/my-awesome-project-org"
   119  
   120  	o := StepTagOptions{
   121  		StepOptions: step.StepOptions{
   122  			CommonOptions: &opts.CommonOptions{},
   123  		},
   124  	}
   125  	chartsDir := filepath.Join(f, "charts", "mydemo")
   126  	o.Flags.Dir = f
   127  	o.Flags.ChartsDir = chartsDir
   128  	git := gits.GitFake{}
   129  	git.SetRemoteURL("", "origin", "https://github.com/My_Self/My_Awesome_Project.org")
   130  	o.SetGit(&git)
   131  
   132  	assert.Equal(t, expectedImageName, o.defaultChartValueRepository())
   133  }
   134  
   135  func TestFindChartsDir(t *testing.T) {
   136  	testData := path.Join("test_data", "step_tag_find_chart")
   137  	dir, err := os.Getwd()
   138  	assert.NoError(t, err)
   139  	defer os.Chdir(dir)
   140  	assert.NoError(t, os.Chdir(testData))
   141  
   142  	if val, ok := os.LookupEnv("APP_NAME"); ok {
   143  		assert.NoError(t, os.Unsetenv("APP_NAME"))
   144  		defer os.Setenv("APP_NAME", val)
   145  	} else {
   146  		defer os.Unsetenv("APP_NAME")
   147  	}
   148  	if val, ok := os.LookupEnv("REPO_NAME"); ok {
   149  		assert.NoError(t, os.Unsetenv("REPO_NAME"))
   150  		defer os.Setenv("REPO_NAME", val)
   151  	} else {
   152  		defer os.Unsetenv("REPO_NAME")
   153  	}
   154  
   155  	chartsDir := filepath.Join("charts", "my-project") + "/"
   156  	o := StepTagOptions{}
   157  
   158  	assert.NoError(t, os.Setenv("APP_NAME", "My.Project"))
   159  	val, err := o.findChartsDir()
   160  	assert.NoError(t, err)
   161  	assert.Equal(t, chartsDir, val)
   162  	assert.NoError(t, os.Unsetenv("APP_NAME"))
   163  
   164  	assert.NoError(t, os.Setenv("REPO_NAME", "my-project"))
   165  	val, err = o.findChartsDir()
   166  	assert.NoError(t, err)
   167  	assert.Equal(t, chartsDir, val)
   168  	assert.NoError(t, os.Unsetenv("REPO_NAME"))
   169  }
   170  
   171  func TestFindBestFitChart(t *testing.T) {
   172  	testData := path.Join("test_data", "step_tag_find_best_fit_chart")
   173  	dir, err := os.Getwd()
   174  	assert.NoError(t, err)
   175  	defer os.Chdir(dir)
   176  	assert.NoError(t, os.Chdir(testData))
   177  
   178  	if val, ok := os.LookupEnv("APP_NAME"); ok {
   179  		assert.NoError(t, os.Unsetenv("APP_NAME"))
   180  		defer os.Setenv("APP_NAME", val)
   181  	} else {
   182  		defer os.Unsetenv("APP_NAME")
   183  	}
   184  	if val, ok := os.LookupEnv("REPO_NAME"); ok {
   185  		assert.NoError(t, os.Unsetenv("REPO_NAME"))
   186  		defer os.Setenv("REPO_NAME", val)
   187  	} else {
   188  		defer os.Unsetenv("REPO_NAME")
   189  	}
   190  
   191  	chartsDir := filepath.Join("charts", "my-project") + "/"
   192  	o := StepTagOptions{}
   193  
   194  	assert.NoError(t, os.Setenv("APP_NAME", "My.Project"))
   195  	val, err := o.findChartsDir()
   196  	assert.NoError(t, err)
   197  	assert.Equal(t, chartsDir, val)
   198  	assert.NoError(t, os.Unsetenv("APP_NAME"))
   199  
   200  	assert.NoError(t, os.Setenv("REPO_NAME", "my-project"))
   201  	val, err = o.findChartsDir()
   202  	assert.NoError(t, err)
   203  	assert.Equal(t, chartsDir, val)
   204  	assert.NoError(t, os.Unsetenv("REPO_NAME"))
   205  }