github.com/jenkins-x/jx/v2@v2.1.155/pkg/cmd/edit/requirements/requirements_test.go (about)

     1  // +build unit
     2  
     3  package requirements_test
     4  
     5  import (
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	"github.com/jenkins-x/jx/v2/pkg/cmd/clients/fake"
    16  	"github.com/jenkins-x/jx/v2/pkg/cmd/edit/requirements"
    17  	"github.com/jenkins-x/jx/v2/pkg/cmd/opts"
    18  	"github.com/jenkins-x/jx/v2/pkg/config"
    19  	"github.com/jenkins-x/jx/v2/pkg/util"
    20  )
    21  
    22  func TestCmdEditRequirements(t *testing.T) {
    23  	t.Parallel()
    24  
    25  	type testData struct {
    26  		name        string
    27  		args        []string
    28  		callback    func(t *testing.T, req *config.RequirementsConfig)
    29  		fail        bool
    30  		initialFile string
    31  	}
    32  
    33  	gitOpsEnabled := filepath.Join("test_data", "gitops-enabled.yml")
    34  	tests := []testData{
    35  		{
    36  			name: "bbs",
    37  			args: []string{"--git-kind=bitbucketserver"},
    38  			callback: func(t *testing.T, req *config.RequirementsConfig) {
    39  				assert.Equal(t, "bitbucketserver", req.Cluster.GitKind, "req.Cluster.GitKind")
    40  				assert.True(t, req.GitOps, "req.GitOps")
    41  			},
    42  			initialFile: gitOpsEnabled,
    43  		},
    44  		{
    45  			name: "enable-gitops",
    46  			args: []string{"--gitops"},
    47  			callback: func(t *testing.T, req *config.RequirementsConfig) {
    48  				assert.True(t, req.GitOps, "req.GitOps")
    49  			},
    50  			initialFile: gitOpsEnabled,
    51  		},
    52  		{
    53  			name: "disable-gitops",
    54  			args: []string{"--gitops=false"},
    55  			callback: func(t *testing.T, req *config.RequirementsConfig) {
    56  				assert.False(t, req.GitOps, "req.GitOps")
    57  			},
    58  			initialFile: gitOpsEnabled,
    59  		},
    60  		{
    61  			name: "bucket-logs",
    62  			args: []string{"--bucket-logs", "gs://foo"},
    63  			callback: func(t *testing.T, req *config.RequirementsConfig) {
    64  				assert.Equal(t, "gs://foo", req.Storage.Logs.URL, "req.Storage.Logs.URL")
    65  				assert.True(t, req.Storage.Logs.Enabled, "req.Storage.Logs.Enabled")
    66  			},
    67  			initialFile: gitOpsEnabled,
    68  		},
    69  		{
    70  			name:        "bad-git-kind",
    71  			args:        []string{"--git-kind=gitlob"},
    72  			fail:        true,
    73  			initialFile: gitOpsEnabled,
    74  		},
    75  		{
    76  			name:        "bad-secret",
    77  			args:        []string{"--secret=vaulx"},
    78  			fail:        true,
    79  			initialFile: gitOpsEnabled,
    80  		},
    81  	}
    82  
    83  	commonOpts := opts.NewCommonOptionsWithFactory(fake.NewFakeFactory())
    84  	commonOpts.Out = os.Stdout
    85  	commonOpts.Err = os.Stderr
    86  
    87  	tmpDir, err := ioutil.TempDir("", "jx-cmd-req-")
    88  	require.NoError(t, err, "failed to create temp dir")
    89  	require.DirExists(t, tmpDir, "could not create temp dir for running tests")
    90  
    91  	for i, tt := range tests {
    92  		if tt.name == "" {
    93  			tt.name = fmt.Sprintf("test%d", i)
    94  		}
    95  		t.Logf("running test %s", tt.name)
    96  		dir := filepath.Join(tmpDir, tt.name)
    97  
    98  		err = os.MkdirAll(dir, util.DefaultWritePermissions)
    99  		require.NoError(t, err, "failed to create dir %s", dir)
   100  
   101  		localReqFile := filepath.Join(dir, config.RequirementsConfigFileName)
   102  		if tt.initialFile != "" {
   103  			err = util.CopyFile(tt.initialFile, localReqFile)
   104  			require.NoError(t, err, "failed to copy %s to %s", tt.initialFile, localReqFile)
   105  			require.FileExists(t, localReqFile, "file should have been copied")
   106  		}
   107  
   108  		cmd := requirements.NewCmdEditRequirements(&commonOpts)
   109  		args := append(tt.args, "--dir", dir)
   110  
   111  		err := cmd.ParseFlags(args)
   112  		require.NoError(t, err, "failed to parse arguments %#v for test %", args, tt.name)
   113  
   114  		old := os.Args
   115  		os.Args = args
   116  		err = cmd.RunE(cmd, args)
   117  		if err != nil {
   118  			if tt.fail {
   119  				t.Logf("got exected failure for test %s: %s", tt.name, err.Error())
   120  				continue
   121  			}
   122  			t.Errorf("test %s reported error: %s", tt.name, err)
   123  			continue
   124  		}
   125  		os.Args = old
   126  
   127  		// now lets parse the requirements
   128  		file := localReqFile
   129  		require.FileExists(t, file, "should have generated the requirements file")
   130  
   131  		req, _, err := config.LoadRequirementsConfig(dir, config.DefaultFailOnValidationError)
   132  		require.NoError(t, err, "failed to load requirements from dir %s", dir)
   133  
   134  		if tt.callback != nil {
   135  			tt.callback(t, req)
   136  		}
   137  
   138  	}
   139  
   140  }