github.com/wmuizelaar/kpt@v0.0.0-20221018115725-bd564717b2ed/thirdparty/cmdconfig/commands/runner/runner_test.go (about)

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package runner
     5  
     6  import (
     7  	"bytes"
     8  	"io"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  	"sigs.k8s.io/kustomize/kyaml/errors"
    16  )
    17  
    18  func TestExecuteCmdOnPkgs(t *testing.T) {
    19  	var tests = []struct {
    20  		name        string
    21  		recurse     bool
    22  		pkgPath     string
    23  		needOpenAPI bool
    24  		errMsg      string
    25  		expectedOut string
    26  	}{
    27  		{
    28  			name:        "need_Kptfile_error",
    29  			recurse:     true,
    30  			needOpenAPI: true,
    31  			pkgPath:     "subpkg1/subdir1",
    32  			errMsg:      `unable to find "Kptfile" in package`,
    33  		},
    34  		{
    35  			name:        "Kptfile_not_needed_no_err",
    36  			recurse:     true,
    37  			needOpenAPI: false,
    38  			pkgPath:     "subpkg1/subdir1",
    39  			expectedOut: `${baseDir}/subpkg1/subdir1/
    40  `,
    41  		},
    42  		{
    43  			name:        "executeCmd_returns_error",
    44  			recurse:     true,
    45  			needOpenAPI: false,
    46  			pkgPath:     "subpkg4",
    47  			expectedOut: `${baseDir}/subpkg4/
    48  `,
    49  			errMsg: `this command returns an error if package has error.txt file`,
    50  		},
    51  		{
    52  			name:        "executeCmd_prints_pkgpaths",
    53  			recurse:     true,
    54  			needOpenAPI: false,
    55  			pkgPath:     "subpkg2",
    56  			expectedOut: `${baseDir}/subpkg2/
    57  
    58  ${baseDir}/subpkg2/subpkg3/
    59  `,
    60  		},
    61  	}
    62  
    63  	dir, err := os.MkdirTemp("", "")
    64  	if !assert.NoError(t, err) {
    65  		t.FailNow()
    66  	}
    67  	defer os.RemoveAll(dir)
    68  	err = createTestDirStructure(dir)
    69  	if !assert.NoError(t, err) {
    70  		t.FailNow()
    71  	}
    72  
    73  	for i := range tests {
    74  		test := tests[i]
    75  		t.Run(test.name, func(t *testing.T) {
    76  			actual := &bytes.Buffer{}
    77  			r := &TestRunner{}
    78  			e := ExecuteCmdOnPkgs{
    79  				NeedOpenAPI:        test.needOpenAPI,
    80  				Writer:             actual,
    81  				RootPkgPath:        filepath.Join(dir, test.pkgPath),
    82  				RecurseSubPackages: test.recurse,
    83  				CmdRunner:          r,
    84  			}
    85  			err := e.Execute()
    86  			if test.errMsg == "" {
    87  				if !assert.NoError(t, err) {
    88  					t.FailNow()
    89  				}
    90  			} else {
    91  				if !assert.Error(t, err) {
    92  					t.FailNow()
    93  				}
    94  				if !assert.Contains(t, err.Error(), test.errMsg) {
    95  					t.FailNow()
    96  				}
    97  			}
    98  
    99  			// normalize path format for windows
   100  			actualNormalized := strings.ReplaceAll(
   101  				strings.ReplaceAll(actual.String(), "\\", "/"),
   102  				"//", "/")
   103  
   104  			expected := strings.ReplaceAll(test.expectedOut, "${baseDir}", dir+"/")
   105  			expectedNormalized := strings.ReplaceAll(
   106  				strings.ReplaceAll(expected, "\\", "/"),
   107  				"//", "/")
   108  			if !assert.Equal(t, expectedNormalized, actualNormalized) {
   109  				t.FailNow()
   110  			}
   111  		})
   112  	}
   113  }
   114  
   115  func createTestDirStructure(dir string) error {
   116  	/*
   117  			Adds the folders to the input dir with following structure
   118  			dir
   119  			├── subpkg1
   120  			│   ├── Kptfile
   121  			│   └── subdir1
   122  		  ├── subpkg4
   123  		  │   ├── Kptfile
   124  		  │   └── error.txt
   125  			└── subpkg2
   126  		      ├── subpkg3
   127  		      │   ├── Kptfile
   128  		      │   └── subdir2
   129  			    └── Kptfile
   130  	*/
   131  	err := os.MkdirAll(filepath.Join(dir, "subpkg1/subdir1"), 0777|os.ModeDir)
   132  	if err != nil {
   133  		return err
   134  	}
   135  	err = os.MkdirAll(filepath.Join(dir, "subpkg2/subpkg3/subdir2"), 0777|os.ModeDir)
   136  	if err != nil {
   137  		return err
   138  	}
   139  	err = os.MkdirAll(filepath.Join(dir, "subpkg4"), 0777|os.ModeDir)
   140  	if err != nil {
   141  		return err
   142  	}
   143  	err = os.WriteFile(filepath.Join(dir, "subpkg1", "Kptfile"), []byte(""), 0777)
   144  	if err != nil {
   145  		return err
   146  	}
   147  	err = os.WriteFile(filepath.Join(dir, "subpkg2", "Kptfile"), []byte(""), 0777)
   148  	if err != nil {
   149  		return err
   150  	}
   151  	err = os.WriteFile(filepath.Join(dir, "subpkg2/subpkg3", "Kptfile"), []byte(""), 0777)
   152  	if err != nil {
   153  		return err
   154  	}
   155  	err = os.WriteFile(filepath.Join(dir, "subpkg4", "error.txt"), []byte(""), 0777)
   156  	if err != nil {
   157  		return err
   158  	}
   159  	err = os.WriteFile(filepath.Join(dir, "subpkg4", "Kptfile"), []byte(""), 0777)
   160  	if err != nil {
   161  		return err
   162  	}
   163  	err = os.WriteFile(filepath.Join(dir, "Kptfile"), []byte(""), 0777)
   164  	if err != nil {
   165  		return err
   166  	}
   167  	return nil
   168  }
   169  
   170  type TestRunner struct{}
   171  
   172  func (r *TestRunner) ExecuteCmd(w io.Writer, pkgPath string) error {
   173  	children, err := os.ReadDir(pkgPath)
   174  	if err != nil {
   175  		return err
   176  	}
   177  	for _, child := range children {
   178  		if child.Name() == "error.txt" {
   179  			return errors.Errorf("this command returns an error if package has error.txt file")
   180  		}
   181  	}
   182  	return nil
   183  }