github.com/splunk/dan1-qbec@v0.7.3/internal/commands/diff_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  	"encoding/base64"
    21  	"regexp"
    22  	"testing"
    23  
    24  	"github.com/stretchr/testify/assert"
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestDiffBasicNoDiffs(t *testing.T) {
    29  	s := newScaffold(t)
    30  	defer s.reset()
    31  	d := &dg{cmValue: "bar"}
    32  	s.client.getFunc = d.get
    33  	err := s.executeCommand("diff", "dev", "-k", "configmaps", "--ignore-all-annotations", "--ignore-all-labels", "--show-deletes=false")
    34  	require.Nil(t, err)
    35  }
    36  
    37  func TestDiffBasic(t *testing.T) {
    38  	s := newScaffold(t)
    39  	defer s.reset()
    40  	d := &dg{cmValue: "baz", secretValue: "baz"}
    41  	s.client.getFunc = d.get
    42  	s.client.listFunc = stdLister
    43  	err := s.executeCommand("diff", "dev")
    44  	require.NotNil(t, err)
    45  	stats := s.outputStats()
    46  	a := assert.New(t)
    47  	a.True(regexp.MustCompile(`\d+ object\(s\) different`).MatchString(err.Error()))
    48  	a.EqualValues([]interface{}{"ConfigMap:bar-system:svc2-cm", "Secret:bar-system:svc2-secret"}, stats["changes"])
    49  	a.EqualValues([]interface{}{"Deployment:bar-system:svc2-previous-deploy"}, stats["deletions"])
    50  	adds, ok := stats["additions"].([]interface{})
    51  	require.True(t, ok)
    52  	a.Contains(adds, "Job::tj-<xxxxx>")
    53  	secretValue := base64.StdEncoding.EncodeToString([]byte("baz"))
    54  	redactedValue := base64.RawStdEncoding.EncodeToString([]byte("redacted."))
    55  	a.Contains(s.stdout(), redactedValue)
    56  	a.Contains(s.stdout(), "qbec.io/component: service2")
    57  	a.NotContains(s.stdout(), secretValue)
    58  }
    59  
    60  func TestDiffGetFail(t *testing.T) {
    61  	s := newScaffold(t)
    62  	defer s.reset()
    63  	err := s.executeCommand("diff", "dev", "--parallel=1")
    64  	require.NotNil(t, err)
    65  	a := assert.New(t)
    66  	a.Contains(err.Error(), "not implemented")
    67  }
    68  
    69  func TestDiffListFail(t *testing.T) {
    70  	s := newScaffold(t)
    71  	defer s.reset()
    72  	d := &dg{cmValue: "baz", secretValue: "baz"}
    73  	s.client.getFunc = d.get
    74  	err := s.executeCommand("diff", "dev")
    75  	require.NotNil(t, err)
    76  	a := assert.New(t)
    77  	a.Contains(err.Error(), "not implemented")
    78  }
    79  
    80  func TestDiffBasicNoLabels(t *testing.T) {
    81  	s := newScaffold(t)
    82  	defer s.reset()
    83  	d := &dg{cmValue: "baz", secretValue: "baz"}
    84  	s.client.getFunc = d.get
    85  	err := s.executeCommand("diff", "dev", "--ignore-all-labels", "-S", "--show-deletes=false")
    86  	require.NotNil(t, err)
    87  	a := assert.New(t)
    88  	secretValue := base64.StdEncoding.EncodeToString([]byte("baz"))
    89  	redactedValue := base64.RawStdEncoding.EncodeToString([]byte("redacted."))
    90  	a.NotContains(s.stdout(), redactedValue)
    91  	a.Contains(s.stdout(), secretValue)
    92  	a.NotContains(s.stdout(), "qbec.io/environment")
    93  }
    94  
    95  func TestDiffBasicNoSpecificLabels(t *testing.T) {
    96  	s := newScaffold(t)
    97  	defer s.reset()
    98  	d := &dg{cmValue: "baz", secretValue: "baz"}
    99  	s.client.getFunc = d.get
   100  	err := s.executeCommand("diff", "dev", "--ignore-label", "qbec.io/environment", "--show-deletes=false")
   101  	require.NotNil(t, err)
   102  	a := assert.New(t)
   103  	a.NotContains(s.stdout(), "qbec.io/environment:")
   104  	a.Contains(s.stdout(), "qbec.io/application:")
   105  }
   106  
   107  func TestDiffBasicNoSpecificAnnotation(t *testing.T) {
   108  	s := newScaffold(t)
   109  	defer s.reset()
   110  	d := &dg{cmValue: "baz", secretValue: "baz"}
   111  	s.client.getFunc = d.get
   112  	err := s.executeCommand("diff", "dev", "--ignore-annotation", "ann/foo", "--show-deletes=false")
   113  	require.NotNil(t, err)
   114  	a := assert.New(t)
   115  	a.NotContains(s.stdout(), "ann/foo")
   116  	a.Contains(s.stdout(), "ann/bar")
   117  }
   118  
   119  func TestDiffBasicNoAnnotations(t *testing.T) {
   120  	s := newScaffold(t)
   121  	defer s.reset()
   122  	d := &dg{cmValue: "baz", secretValue: "baz"}
   123  	s.client.getFunc = d.get
   124  	err := s.executeCommand("diff", "dev", "--ignore-all-annotations", "--show-deletes=false")
   125  	require.NotNil(t, err)
   126  	a := assert.New(t)
   127  	a.NotContains(s.stdout(), "ann/foo")
   128  	a.NotContains(s.stdout(), "ann/bar")
   129  }
   130  
   131  func TestDiffNegative(t *testing.T) {
   132  	tests := []struct {
   133  		name     string
   134  		args     []string
   135  		asserter func(s *scaffold, err error)
   136  	}{
   137  		{
   138  			name: "no env",
   139  			args: []string{"diff"},
   140  			asserter: func(s *scaffold, err error) {
   141  				a := assert.New(s.t)
   142  				a.True(isUsageError(err))
   143  				a.Equal("exactly one environment required", err.Error())
   144  			},
   145  		},
   146  		{
   147  			name: "2 envs",
   148  			args: []string{"diff", "dev", "prod"},
   149  			asserter: func(s *scaffold, err error) {
   150  				a := assert.New(s.t)
   151  				a.True(isUsageError(err))
   152  				a.Equal("exactly one environment required", err.Error())
   153  			},
   154  		},
   155  		{
   156  			name: "bad env",
   157  			args: []string{"diff", "foo"},
   158  			asserter: func(s *scaffold, err error) {
   159  				a := assert.New(s.t)
   160  				a.False(isUsageError(err))
   161  				a.Equal("invalid environment \"foo\"", err.Error())
   162  			},
   163  		},
   164  		{
   165  			name: "baseline env",
   166  			args: []string{"diff", "_"},
   167  			asserter: func(s *scaffold, err error) {
   168  				a := assert.New(s.t)
   169  				a.True(isUsageError(err))
   170  				a.Equal("cannot diff baseline environment, use a real environment", err.Error())
   171  			},
   172  		},
   173  		{
   174  			name: "c and C",
   175  			args: []string{"diff", "dev", "-c", "cluster-objects", "-C", "service2"},
   176  			asserter: func(s *scaffold, err error) {
   177  				a := assert.New(s.t)
   178  				a.True(isUsageError(err))
   179  				a.Equal(`cannot include as well as exclude components, specify one or the other`, err.Error())
   180  			},
   181  		},
   182  		{
   183  			name: "k and K",
   184  			args: []string{"diff", "dev", "-k", "namespace", "-K", "secret"},
   185  			asserter: func(s *scaffold, err error) {
   186  				a := assert.New(s.t)
   187  				a.True(isUsageError(err))
   188  				a.Equal(`cannot include as well as exclude kinds, specify one or the other`, err.Error())
   189  			},
   190  		},
   191  	}
   192  	for _, test := range tests {
   193  		t.Run(test.name, func(t *testing.T) {
   194  			s := newScaffold(t)
   195  			defer s.reset()
   196  			err := s.executeCommand(test.args...)
   197  			require.NotNil(t, err)
   198  			test.asserter(s, err)
   199  		})
   200  	}
   201  
   202  }