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

     1  // +build unit
     2  
     3  package pr_test
     4  
     5  import (
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"github.com/olli-ai/jx/v2/pkg/cmd/clients/fake"
    12  
    13  	"github.com/olli-ai/jx/v2/pkg/cmd/opts/step"
    14  
    15  	"github.com/olli-ai/jx/v2/pkg/cmd/step/create/pr"
    16  
    17  	"github.com/olli-ai/jx/v2/pkg/helm"
    18  	"github.com/olli-ai/jx/v2/pkg/tests"
    19  	"github.com/olli-ai/jx/v2/pkg/util"
    20  	"github.com/petergtz/pegomock"
    21  	"github.com/stretchr/testify/assert"
    22  	"k8s.io/helm/pkg/proto/hapi/chart"
    23  
    24  	"github.com/olli-ai/jx/v2/pkg/cmd/opts"
    25  	"github.com/olli-ai/jx/v2/pkg/gits"
    26  	helm_test "github.com/olli-ai/jx/v2/pkg/helm/mocks"
    27  	"github.com/olli-ai/jx/v2/pkg/kube"
    28  	resources_test "github.com/olli-ai/jx/v2/pkg/kube/resources/mocks"
    29  	"k8s.io/apimachinery/pkg/runtime"
    30  
    31  	"github.com/olli-ai/jx/v2/pkg/cmd/testhelpers"
    32  )
    33  
    34  func TestCreatePullRequestUpdateVersionFilesFn(t *testing.T) {
    35  	commonOpts := &opts.CommonOptions{}
    36  	commonOpts.SetFactory(fake.NewFakeFactory())
    37  
    38  	gitter := gits.NewGitCLI()
    39  	roadRunnerOrg, err := gits.NewFakeRepository("acme", "roadrunner", func(dir string) error {
    40  		return ioutil.WriteFile(filepath.Join(dir, "README"), []byte("TODO"), 0600)
    41  	}, gitter)
    42  	assert.NoError(t, err)
    43  	wileOrg, err := gits.NewFakeRepository("acme", "wile", func(dir string) error {
    44  		return ioutil.WriteFile(filepath.Join(dir, "README"), []byte("TODO"), 0600)
    45  	}, gitter)
    46  	assert.NoError(t, err)
    47  	gitProvider := gits.NewFakeProvider(roadRunnerOrg, wileOrg)
    48  	helmer := helm_test.NewMockHelmer()
    49  
    50  	testhelpers.ConfigureTestOptionsWithResources(commonOpts,
    51  		[]runtime.Object{},
    52  		[]runtime.Object{
    53  			kube.NewPermanentEnvironment("EnvWhereApplicationIsDeployed"),
    54  		},
    55  		gitter,
    56  		gitProvider,
    57  		helmer,
    58  		resources_test.NewMockInstaller(),
    59  	)
    60  	o := pr.StepCreatePullRequestVersionsOptions{
    61  		StepCreatePrOptions: pr.StepCreatePrOptions{
    62  			StepCreateOptions: step.StepCreateOptions{
    63  				StepOptions: step.StepOptions{
    64  					CommonOptions: commonOpts,
    65  				},
    66  			},
    67  		},
    68  	}
    69  	t.Run("star", func(t *testing.T) {
    70  		pegomock.RegisterMockTestingT(t)
    71  
    72  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/wile"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
    73  			{
    74  				Name:         "wile",
    75  				ChartVersion: "1.0.1",
    76  				AppVersion:   "1.0.1",
    77  				Description:  "",
    78  			},
    79  			{
    80  				Name:         "wile",
    81  				ChartVersion: "1.0.0",
    82  				AppVersion:   "1.0.0",
    83  				Description:  "",
    84  			},
    85  		}), pegomock.ReturnValue(nil))
    86  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/roadrunner"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
    87  			{
    88  				Name:         "roadrunner",
    89  				ChartVersion: "2.0.1",
    90  				AppVersion:   "2.0.1",
    91  				Description:  "",
    92  			},
    93  			{
    94  				Name:         "roadrunner",
    95  				ChartVersion: "1.0.1",
    96  				AppVersion:   "1.0.1",
    97  				Description:  "",
    98  			},
    99  		}), pegomock.ReturnValue(nil))
   100  		helm_test.StubFetchChart("acme/wile", "1.0.1", "", &chart.Chart{
   101  			Metadata: &chart.Metadata{
   102  				Name:    "wile",
   103  				Version: "1.0.1",
   104  			},
   105  		}, helmer)
   106  		helm_test.StubFetchChart("acme/roadrunner", "2.0.1", "", &chart.Chart{
   107  			Metadata: &chart.Metadata{
   108  				Name:    "roadrunner",
   109  				Version: "2.0.1",
   110  				Sources: []string{
   111  					"https://fake.git/acme/roadrunner",
   112  				},
   113  			},
   114  		}, helmer)
   115  		pegomock.When(helmer.IsRepoMissing("https://acme.com/charts")).ThenReturn(pegomock.ReturnValue(false), pegomock.ReturnValue("acme"), pegomock.ReturnValue(nil))
   116  		fn := o.CreatePullRequestUpdateVersionFilesFn([]string{"*"}, make([]string, 0), "charts", helmer)
   117  		dir, err := ioutil.TempDir("", "")
   118  		defer func() {
   119  			err := os.RemoveAll(dir)
   120  			assert.NoError(t, err)
   121  		}()
   122  		assert.NoError(t, err)
   123  		err = util.CopyDir(filepath.Join("testdata/TestCreatePullRequestUpdateVersionFilesFn"), dir, true)
   124  		assert.NoError(t, err)
   125  		err = gitter.Init(dir)
   126  		assert.NoError(t, err)
   127  		err = gitter.Add(dir, "*")
   128  		assert.NoError(t, err)
   129  		err = gitter.CommitDir(dir, "Initial commit")
   130  		assert.NoError(t, err)
   131  		gitInfo, err := gits.ParseGitURL("https://fake.git/acme/e")
   132  		answer, err := fn(dir, gitInfo)
   133  		assert.NoError(t, err)
   134  		assert.Len(t, answer, 0)
   135  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "wile.yml"), "version: 1.0.1")
   136  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "roadrunner.yml"), "version: 2.0.1")
   137  	})
   138  	t.Run("excludes", func(t *testing.T) {
   139  		pegomock.RegisterMockTestingT(t)
   140  
   141  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/wile"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
   142  			{
   143  				Name:         "wile",
   144  				ChartVersion: "1.0.1",
   145  				AppVersion:   "1.0.1",
   146  				Description:  "",
   147  			},
   148  			{
   149  				Name:         "wile",
   150  				ChartVersion: "1.0.0",
   151  				AppVersion:   "1.0.0",
   152  				Description:  "",
   153  			},
   154  		}), pegomock.ReturnValue(nil))
   155  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/roadrunner"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
   156  			{
   157  				Name:         "roadrunner",
   158  				ChartVersion: "2.0.1",
   159  				AppVersion:   "2.0.1",
   160  				Description:  "",
   161  			},
   162  			{
   163  				Name:         "roadrunner",
   164  				ChartVersion: "1.0.1",
   165  				AppVersion:   "1.0.1",
   166  				Description:  "",
   167  			},
   168  		}), pegomock.ReturnValue(nil))
   169  		helm_test.StubFetchChart("acme/wile", "1.0.1", "", &chart.Chart{
   170  			Metadata: &chart.Metadata{
   171  				Name:    "wile",
   172  				Version: "1.0.1",
   173  			},
   174  		}, helmer)
   175  		helm_test.StubFetchChart("acme/roadrunner", "2.0.1", "", &chart.Chart{
   176  			Metadata: &chart.Metadata{
   177  				Name:    "roadrunner",
   178  				Version: "2.0.1",
   179  				Sources: []string{
   180  					"https://fake.git/acme/roadrunner",
   181  				},
   182  			},
   183  		}, helmer)
   184  		pegomock.When(helmer.IsRepoMissing("https://acme.com/charts")).ThenReturn(pegomock.ReturnValue(false), pegomock.ReturnValue("acme"), pegomock.ReturnValue(nil))
   185  		fn := o.CreatePullRequestUpdateVersionFilesFn([]string{"*"}, []string{"acme/wile"}, "charts", helmer)
   186  		dir, err := ioutil.TempDir("", "")
   187  		defer func() {
   188  			err := os.RemoveAll(dir)
   189  			assert.NoError(t, err)
   190  		}()
   191  		assert.NoError(t, err)
   192  		err = util.CopyDir(filepath.Join("testdata/TestCreatePullRequestUpdateVersionFilesFn"), dir, true)
   193  		assert.NoError(t, err)
   194  		err = gitter.Init(dir)
   195  		assert.NoError(t, err)
   196  		err = gitter.Add(dir, "*")
   197  		assert.NoError(t, err)
   198  		err = gitter.CommitDir(dir, "Initial commit")
   199  		assert.NoError(t, err)
   200  		gitInfo, err := gits.ParseGitURL("https://fake.git/acme/e")
   201  		answer, err := fn(dir, gitInfo)
   202  		assert.NoError(t, err)
   203  		assert.Len(t, answer, 0)
   204  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "wile.yml"), "version: 1.0.0")
   205  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "roadrunner.yml"), "version: 2.0.1")
   206  	})
   207  	t.Run("specific", func(t *testing.T) {
   208  		pegomock.RegisterMockTestingT(t)
   209  
   210  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/wile"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
   211  			{
   212  				Name:         "wile",
   213  				ChartVersion: "1.0.1",
   214  				AppVersion:   "1.0.1",
   215  				Description:  "",
   216  			},
   217  			{
   218  				Name:         "wile",
   219  				ChartVersion: "1.0.0",
   220  				AppVersion:   "1.0.0",
   221  				Description:  "",
   222  			},
   223  		}), pegomock.ReturnValue(nil))
   224  		pegomock.When(helmer.SearchCharts(pegomock.EqString("acme/roadrunner"), pegomock.EqBool(true))).ThenReturn(pegomock.ReturnValue([]helm.ChartSummary{
   225  			{
   226  				Name:         "roadrunner",
   227  				ChartVersion: "2.0.1",
   228  				AppVersion:   "2.0.1",
   229  				Description:  "",
   230  			},
   231  			{
   232  				Name:         "roadrunner",
   233  				ChartVersion: "1.0.1",
   234  				AppVersion:   "1.0.1",
   235  				Description:  "",
   236  			},
   237  		}), pegomock.ReturnValue(nil))
   238  		helm_test.StubFetchChart("acme/wile", "1.0.1", "", &chart.Chart{
   239  			Metadata: &chart.Metadata{
   240  				Name:    "wile",
   241  				Version: "1.0.1",
   242  			},
   243  		}, helmer)
   244  		helm_test.StubFetchChart("acme/roadrunner", "2.0.1", "", &chart.Chart{
   245  			Metadata: &chart.Metadata{
   246  				Name:    "roadrunner",
   247  				Version: "2.0.1",
   248  				Sources: []string{
   249  					"https://fake.git/acme/roadrunner",
   250  				},
   251  			},
   252  		}, helmer)
   253  		pegomock.When(helmer.IsRepoMissing("https://acme.com/charts")).ThenReturn(pegomock.ReturnValue(false), pegomock.ReturnValue("acme"), pegomock.ReturnValue(nil))
   254  		fn := o.CreatePullRequestUpdateVersionFilesFn([]string{"acme/roadrunner"}, make([]string, 0), "charts", helmer)
   255  		dir, err := ioutil.TempDir("", "")
   256  		defer func() {
   257  			err := os.RemoveAll(dir)
   258  			assert.NoError(t, err)
   259  		}()
   260  		assert.NoError(t, err)
   261  		err = util.CopyDir(filepath.Join("testdata/TestCreatePullRequestUpdateVersionFilesFn"), dir, true)
   262  		assert.NoError(t, err)
   263  		err = gitter.Init(dir)
   264  		assert.NoError(t, err)
   265  		err = gitter.Add(dir, "*")
   266  		assert.NoError(t, err)
   267  		err = gitter.CommitDir(dir, "Initial commit")
   268  		assert.NoError(t, err)
   269  		gitInfo, err := gits.ParseGitURL("https://fake.git/acme/e")
   270  		answer, err := fn(dir, gitInfo)
   271  		assert.NoError(t, err)
   272  		assert.Len(t, answer, 0)
   273  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "wile.yml"), "version: 1.0.0")
   274  		tests.AssertFileContains(t, filepath.Join(dir, "charts", "acme", "roadrunner.yml"), "version: 2.0.1")
   275  	})
   276  }