github.com/SAP/jenkins-library@v1.362.0/cmd/containerExecuteStructureTests_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package cmd
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/SAP/jenkins-library/pkg/mock"
    12  	"github.com/pkg/errors"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  type containerStructureTestsMockUtils struct {
    17  	shouldFail bool
    18  	*mock.FilesMock
    19  	*mock.ExecMockRunner
    20  }
    21  
    22  func (m *containerStructureTestsMockUtils) Glob(pattern string) (matches []string, err error) {
    23  	switch pattern {
    24  	case "**.yaml":
    25  		return []string{"config1.yaml", "config2.yaml"}, nil
    26  	case "empty":
    27  		return []string{}, nil
    28  	case "error":
    29  		return nil, errors.New("failed to find fies")
    30  	}
    31  
    32  	return nil, nil
    33  }
    34  
    35  func newContainerStructureTestsMockUtils() containerStructureTestsMockUtils {
    36  	utils := containerStructureTestsMockUtils{
    37  		shouldFail:     false,
    38  		FilesMock:      &mock.FilesMock{},
    39  		ExecMockRunner: &mock.ExecMockRunner{},
    40  	}
    41  	return utils
    42  }
    43  
    44  func TestRunContainerExecuteStructureTests(t *testing.T) {
    45  	t.Run("success case", func(t *testing.T) {
    46  		config := &containerExecuteStructureTestsOptions{
    47  			PullImage:          true,
    48  			TestConfiguration:  "**.yaml",
    49  			TestDriver:         "docker",
    50  			TestImage:          "reg/image:tag",
    51  			TestReportFilePath: "report.json",
    52  		}
    53  
    54  		mockUtils := newContainerStructureTestsMockUtils()
    55  
    56  		// test
    57  		err := runContainerExecuteStructureTests(config, &mockUtils)
    58  		// assert
    59  		expectedParams := []string{
    60  			"test",
    61  			"--config", "config1.yaml",
    62  			"--config", "config2.yaml",
    63  			"--driver", "docker",
    64  			"--pull",
    65  			"--image", "reg/image:tag",
    66  			"--test-report", "report.json",
    67  		}
    68  
    69  		assert.NoError(t, err)
    70  		if assert.Equal(t, 1, len(mockUtils.Calls)) {
    71  			assert.Equal(t, "./container-structure-test", mockUtils.Calls[0].Exec)
    72  			assert.Equal(t, expectedParams, mockUtils.Calls[0].Params)
    73  		}
    74  	})
    75  
    76  	t.Run("success case - without pulling image", func(t *testing.T) {
    77  		config := &containerExecuteStructureTestsOptions{
    78  			TestConfiguration:  "**.yaml",
    79  			TestDriver:         "docker",
    80  			TestImage:          "reg/image:tag",
    81  			TestReportFilePath: "report.json",
    82  		}
    83  
    84  		mockUtils := newContainerStructureTestsMockUtils()
    85  
    86  		// test
    87  		err := runContainerExecuteStructureTests(config, &mockUtils)
    88  		// assert
    89  		expectedParams := []string{
    90  			"test",
    91  			"--config", "config1.yaml",
    92  			"--config", "config2.yaml",
    93  			"--driver", "docker",
    94  			"--image", "reg/image:tag",
    95  			"--test-report", "report.json",
    96  		}
    97  
    98  		assert.NoError(t, err)
    99  		if assert.Equal(t, 1, len(mockUtils.Calls)) {
   100  			assert.Equal(t, "./container-structure-test", mockUtils.Calls[0].Exec)
   101  			assert.Equal(t, expectedParams, mockUtils.Calls[0].Params)
   102  		}
   103  	})
   104  
   105  	t.Run("success case - verbose", func(t *testing.T) {
   106  		GeneralConfig.Verbose = true
   107  		config := &containerExecuteStructureTestsOptions{
   108  			TestConfiguration:  "**.yaml",
   109  			TestDriver:         "docker",
   110  			TestImage:          "reg/image:tag",
   111  			TestReportFilePath: "report.json",
   112  		}
   113  
   114  		mockUtils := newContainerStructureTestsMockUtils()
   115  
   116  		// test
   117  		err := runContainerExecuteStructureTests(config, &mockUtils)
   118  		// assert
   119  		expectedParams := []string{
   120  			"test",
   121  			"--config", "config1.yaml",
   122  			"--config", "config2.yaml",
   123  			"--driver", "docker",
   124  			"--image", "reg/image:tag",
   125  			"--test-report", "report.json",
   126  			"--verbosity", "debug",
   127  		}
   128  
   129  		assert.NoError(t, err)
   130  		if assert.Equal(t, 1, len(mockUtils.Calls)) {
   131  			assert.Equal(t, "./container-structure-test", mockUtils.Calls[0].Exec)
   132  			assert.Equal(t, expectedParams, mockUtils.Calls[0].Params)
   133  		}
   134  		GeneralConfig.Verbose = false
   135  	})
   136  
   137  	t.Run("success case - run on k8s", func(t *testing.T) {
   138  		if err := os.Setenv("ON_K8S", "true"); err != nil {
   139  			t.Error(err)
   140  		}
   141  		config := &containerExecuteStructureTestsOptions{
   142  			TestConfiguration:  "**.yaml",
   143  			TestImage:          "reg/image:tag",
   144  			TestReportFilePath: "report.json",
   145  		}
   146  
   147  		mockUtils := newContainerStructureTestsMockUtils()
   148  
   149  		// test
   150  		err := runContainerExecuteStructureTests(config, &mockUtils)
   151  		// assert
   152  		expectedParams := []string{
   153  			"test",
   154  			"--config", "config1.yaml",
   155  			"--config", "config2.yaml",
   156  			"--driver", "tar",
   157  			"--image", "reg/image:tag",
   158  			"--test-report", "report.json",
   159  		}
   160  
   161  		assert.NoError(t, err)
   162  		if assert.Equal(t, 1, len(mockUtils.Calls)) {
   163  			assert.Equal(t, "./container-structure-test", mockUtils.Calls[0].Exec)
   164  			assert.Equal(t, expectedParams, mockUtils.Calls[0].Params)
   165  		}
   166  		os.Unsetenv("ON_K8S")
   167  	})
   168  
   169  	t.Run("error case - execution failed", func(t *testing.T) {
   170  		config := &containerExecuteStructureTestsOptions{
   171  			PullImage:          true,
   172  			TestConfiguration:  "**.yaml",
   173  			TestDriver:         "docker",
   174  			TestImage:          "reg/image:tag",
   175  			TestReportFilePath: "report.json",
   176  		}
   177  		mockUtils := newContainerStructureTestsMockUtils()
   178  		mockUtils.ExecMockRunner = &mock.ExecMockRunner{
   179  			ShouldFailOnCommand: map[string]error{"container-structure-test": fmt.Errorf("container-structure-test run failed")},
   180  		}
   181  
   182  		// test
   183  		err := runContainerExecuteStructureTests(config, &mockUtils)
   184  		// assert
   185  		assert.EqualError(t, err, "failed to run executable, command: '[./container-structure-test test --config config1.yaml --config config2.yaml --driver docker --pull --image reg/image:tag --test-report report.json]', error: container-structure-test run failed: container-structure-test run failed")
   186  	})
   187  
   188  	t.Run("error case - configuration is missing", func(t *testing.T) {
   189  		config := &containerExecuteStructureTestsOptions{
   190  			PullImage:          true,
   191  			TestConfiguration:  "empty",
   192  			TestDriver:         "docker",
   193  			TestReportFilePath: "report.json",
   194  		}
   195  		mockUtils := newContainerStructureTestsMockUtils()
   196  
   197  		// test
   198  		err := runContainerExecuteStructureTests(config, &mockUtils)
   199  		// assert
   200  		assert.EqualError(t, err, "config files mustn't be missing")
   201  	})
   202  
   203  	t.Run("error case - failed to find config files", func(t *testing.T) {
   204  		config := &containerExecuteStructureTestsOptions{
   205  			PullImage:          true,
   206  			TestConfiguration:  "error",
   207  			TestDriver:         "docker",
   208  			TestReportFilePath: "report.json",
   209  		}
   210  		mockUtils := newContainerStructureTestsMockUtils()
   211  
   212  		// test
   213  		err := runContainerExecuteStructureTests(config, &mockUtils)
   214  		// assert
   215  		assert.EqualError(t, err, "failed to find config files, error: failed to find fies: failed to find fies")
   216  	})
   217  
   218  	t.Run("error case - incorrect driver type", func(t *testing.T) {
   219  		config := &containerExecuteStructureTestsOptions{
   220  			PullImage:          true,
   221  			TestConfiguration:  "**.yaml",
   222  			TestDriver:         "wrongDriver",
   223  			TestReportFilePath: "report.json",
   224  		}
   225  		mockUtils := newContainerStructureTestsMockUtils()
   226  
   227  		// test
   228  		err := runContainerExecuteStructureTests(config, &mockUtils)
   229  		// assert
   230  		assert.EqualError(t, err, "test driver wrongDriver is incorrect. Possible drivers: docker, tar")
   231  	})
   232  }