github.com/splunk/dan1-qbec@v0.7.3/internal/commands/component_test.go (about)

     1  /*
     2     Copyright 2019 Splunk Inc.
     3  
     4     Licensed under the Apache License, Version 2.0 (the "License");
     5     you may not use this file except in compliance with the License.
     6     You may obtain a copy of the License at
     7  
     8         http://www.apache.org/licenses/LICENSE-2.0
     9  
    10     Unless required by applicable law or agreed to in writing, software
    11     distributed under the License is distributed on an "AS IS" BASIS,
    12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13     See the License for the specific language governing permissions and
    14     limitations under the License.
    15  */
    16  
    17  package commands
    18  
    19  import (
    20  	"regexp"
    21  	"strings"
    22  	"testing"
    23  
    24  	"github.com/stretchr/testify/assert"
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestComponentListBasic(t *testing.T) {
    29  	s := newScaffold(t)
    30  	defer s.reset()
    31  	err := s.executeCommand("component", "list", "dev")
    32  	require.Nil(t, err)
    33  	lines := strings.Split(strings.Trim(s.stdout(), "\n"), "\n")
    34  	a := assert.New(t)
    35  	a.Equal(4, len(lines))
    36  	s.assertOutputLineMatch(regexp.MustCompile(`COMPONENT\s+FILE`))
    37  	s.assertOutputLineMatch(regexp.MustCompile(`cluster-objects\s+components/cluster-objects.yaml`))
    38  	s.assertOutputLineMatch(regexp.MustCompile(`service2\s+components/service2.jsonnet`))
    39  	s.assertOutputLineMatch(regexp.MustCompile(`test-job\s+components/test-job.yaml`))
    40  }
    41  
    42  func TestComponentListYAML(t *testing.T) {
    43  	s := newScaffold(t)
    44  	defer s.reset()
    45  	err := s.executeCommand("component", "list", "dev", "-o", "yaml")
    46  	require.Nil(t, err)
    47  	out, err := s.yamlOutput()
    48  	require.Nil(t, err)
    49  	assert.True(t, len(out) > 0)
    50  }
    51  
    52  func TestComponentListJSON(t *testing.T) {
    53  	s := newScaffold(t)
    54  	defer s.reset()
    55  	err := s.executeCommand("component", "list", "dev", "-o", "json")
    56  	require.Nil(t, err)
    57  	var data interface{}
    58  	err = s.jsonOutput(&data)
    59  	require.Nil(t, err)
    60  }
    61  
    62  func TestComponentListObjects(t *testing.T) {
    63  	s := newScaffold(t)
    64  	defer s.reset()
    65  	err := s.executeCommand("component", "list", "dev", "-O")
    66  	require.Nil(t, err)
    67  	s.assertOutputLineMatch(regexp.MustCompile(`COMPONENT\s+KIND\s+NAME\s+NAMESPACE`))
    68  	s.assertOutputLineMatch(regexp.MustCompile(`cluster-objects\s+ClusterRole\s+allow-root-psp-policy`))
    69  	s.assertOutputLineMatch(regexp.MustCompile(`service2\s+ConfigMap\s+svc2-cm\s+bar-system`))
    70  }
    71  
    72  func TestComponentDiffBasic(t *testing.T) {
    73  	s := newScaffold(t)
    74  	defer s.reset()
    75  	err := s.executeCommand("component", "diff", "dev")
    76  	require.Nil(t, err)
    77  	s.assertOutputLineMatch(regexp.MustCompile(`--- baseline`))
    78  	s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: dev`))
    79  	s.assertOutputLineMatch(regexp.MustCompile(`\+service2\s+components/service2.jsonnet`))
    80  }
    81  
    82  func TestComponentDiff2Envs(t *testing.T) {
    83  	s := newScaffold(t)
    84  	defer s.reset()
    85  	err := s.executeCommand("component", "diff", "dev", "prod")
    86  	require.Nil(t, err)
    87  	s.assertOutputLineMatch(regexp.MustCompile(`--- environment: dev`))
    88  	s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: prod`))
    89  	s.assertOutputLineMatch(regexp.MustCompile(`\++service1\s+components/service1.jsonnet`))
    90  }
    91  
    92  func TestComponentDiff2EnvObjects(t *testing.T) {
    93  	s := newScaffold(t)
    94  	defer s.reset()
    95  	err := s.executeCommand("component", "diff", "dev", "prod", "-O")
    96  	require.Nil(t, err)
    97  	s.assertOutputLineMatch(regexp.MustCompile(`--- environment: dev`))
    98  	s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: prod`))
    99  	s.assertOutputLineMatch(regexp.MustCompile(`\+service1\s+ConfigMap\s+svc1-cm\s+foo-system`))
   100  }
   101  
   102  func TestComponentDiffObjects(t *testing.T) {
   103  	s := newScaffold(t)
   104  	defer s.reset()
   105  	err := s.executeCommand("component", "diff", "dev", "-O")
   106  	require.Nil(t, err)
   107  	s.assertOutputLineMatch(regexp.MustCompile(`--- baseline`))
   108  	s.assertOutputLineMatch(regexp.MustCompile(`\+\+\+ environment: dev`))
   109  	s.assertOutputLineMatch(regexp.MustCompile(`\+service2\s+ConfigMap\s+svc2-cm\s+bar-system`))
   110  	s.assertOutputLineMatch(regexp.MustCompile(`-service1\s+ConfigMap\s+svc1-cm\s+foo-system`))
   111  }
   112  
   113  func TestComponentNegative(t *testing.T) {
   114  	tests := []struct {
   115  		name     string
   116  		args     []string
   117  		asserter func(s *scaffold, err error)
   118  	}{
   119  		{
   120  			name: "list no env",
   121  			args: []string{"component", "list"},
   122  			asserter: func(s *scaffold, err error) {
   123  				a := assert.New(s.t)
   124  				a.True(isUsageError(err))
   125  				a.Equal("exactly one environment required", err.Error())
   126  			},
   127  		},
   128  		{
   129  			name: "list 2 envs",
   130  			args: []string{"component", "list", "dev", "prod"},
   131  			asserter: func(s *scaffold, err error) {
   132  				a := assert.New(s.t)
   133  				a.True(isUsageError(err))
   134  				a.Equal("exactly one environment required", err.Error())
   135  			},
   136  		},
   137  		{
   138  			name: "list bad format",
   139  			args: []string{"component", "list", "dev", "-o", "table"},
   140  			asserter: func(s *scaffold, err error) {
   141  				a := assert.New(s.t)
   142  				a.True(isUsageError(err))
   143  				a.Equal(`listComponents: unsupported format "table"`, err.Error())
   144  			},
   145  		},
   146  		{
   147  			name: "list bad env",
   148  			args: []string{"component", "list", "foo"},
   149  			asserter: func(s *scaffold, err error) {
   150  				a := assert.New(s.t)
   151  				a.False(isUsageError(err))
   152  				a.Equal(`invalid environment "foo"`, err.Error())
   153  			},
   154  		},
   155  		{
   156  			name: "diff no env",
   157  			args: []string{"component", "diff"},
   158  			asserter: func(s *scaffold, err error) {
   159  				a := assert.New(s.t)
   160  				a.True(isUsageError(err))
   161  				a.Equal(`one or two environments required`, err.Error())
   162  			},
   163  		},
   164  		{
   165  			name: "diff 3 envs",
   166  			args: []string{"component", "diff", "dev", "prod", "_"},
   167  			asserter: func(s *scaffold, err error) {
   168  				a := assert.New(s.t)
   169  				a.True(isUsageError(err))
   170  				a.Equal(`one or two environments required`, err.Error())
   171  			},
   172  		},
   173  		{
   174  			name: "diff bad envs",
   175  			args: []string{"component", "diff", "foo"},
   176  			asserter: func(s *scaffold, err error) {
   177  				a := assert.New(s.t)
   178  				a.False(isUsageError(err))
   179  				a.Equal(`invalid environment "foo"`, err.Error())
   180  			},
   181  		},
   182  	}
   183  
   184  	for _, test := range tests {
   185  		t.Run(test.name, func(t *testing.T) {
   186  			s := newScaffold(t)
   187  			defer s.reset()
   188  			err := s.executeCommand(test.args...)
   189  			require.NotNil(t, err)
   190  			test.asserter(s, err)
   191  		})
   192  	}
   193  }