github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/filter_test.go (about)

     1  package render
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/pkg/errors"
     8  	"github.com/spf13/afero"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func Test_removeDests(t *testing.T) {
    13  	type fileStruct struct {
    14  		name string
    15  		data string
    16  	}
    17  
    18  	tests := []struct {
    19  		name       string
    20  		inputFiles []fileStruct
    21  		dests      []string
    22  		wantFiles  []fileStruct
    23  		wantErr    bool
    24  	}{
    25  		{
    26  			name: "nonexistent dest",
    27  			inputFiles: []fileStruct{
    28  				{
    29  					name: "abc/xyz.test",
    30  					data: "this is a test file",
    31  				},
    32  			},
    33  			dests: []string{"notexist.abc"},
    34  			wantFiles: []fileStruct{
    35  				{
    36  					name: "abc/xyz.test",
    37  					data: "this is a test file",
    38  				},
    39  			},
    40  		},
    41  		{
    42  			name: "single file",
    43  			inputFiles: []fileStruct{
    44  				{
    45  					name: "abc/xyz.test",
    46  					data: "this is a test file",
    47  				},
    48  				{
    49  					name: "abc/test.file",
    50  					data: "this is a test file",
    51  				},
    52  			},
    53  			dests:     []string{"abc/test.file"},
    54  			wantFiles: []fileStruct{},
    55  		},
    56  		{
    57  			name: "single dir",
    58  			inputFiles: []fileStruct{
    59  				{
    60  					name: "abc/xyz.test",
    61  					data: "this is a test file",
    62  				},
    63  				{
    64  					name: "abc/test/a.file",
    65  					data: "this is a test file",
    66  				},
    67  			},
    68  			dests: []string{"abc/test"},
    69  			wantFiles: []fileStruct{
    70  				{
    71  					name: "abc/xyz.test",
    72  					data: "this is a test file",
    73  				},
    74  			},
    75  		},
    76  		{
    77  			name: "dir and file",
    78  			inputFiles: []fileStruct{
    79  				{
    80  					name: "another/test.test",
    81  					data: "this is a test file",
    82  				},
    83  				{
    84  					name: "abc/xyz.test",
    85  					data: "this is a test file",
    86  				},
    87  				{
    88  					name: "abc/test/a.file",
    89  					data: "this is a test file",
    90  				},
    91  				{
    92  					name: "abc/test/b.file",
    93  					data: "this is a test file",
    94  				},
    95  			},
    96  			dests: []string{"abc/test", "another/test.test"},
    97  			wantFiles: []fileStruct{
    98  				{
    99  					name: "abc/xyz.test",
   100  					data: "this is a test file",
   101  				},
   102  			},
   103  		},
   104  		{
   105  			name: "illegal absolute dest",
   106  			inputFiles: []fileStruct{
   107  				{
   108  					name: "abc/xyz.test",
   109  					data: "this is a test file",
   110  				},
   111  			},
   112  			dests: []string{"/illegal/absolute/path.abc"},
   113  			wantFiles: []fileStruct{
   114  				{
   115  					name: "abc/xyz.test",
   116  					data: "this is a test file",
   117  				},
   118  			},
   119  		},
   120  		{
   121  			name: "illegal relative dest",
   122  			inputFiles: []fileStruct{
   123  				{
   124  					name: "abc/xyz.test",
   125  					data: "this is a test file",
   126  				},
   127  			},
   128  			dests: []string{"../../../illegal/relative/path.abc"},
   129  			wantFiles: []fileStruct{
   130  				{
   131  					name: "abc/xyz.test",
   132  					data: "this is a test file",
   133  				},
   134  			},
   135  		},
   136  	}
   137  	for _, tt := range tests {
   138  		t.Run(tt.name, func(t *testing.T) {
   139  			req := require.New(t)
   140  
   141  			// setup input FS
   142  			mockFs := afero.Afero{Fs: afero.NewMemMapFs()}
   143  			req.NoError(mockFs.MkdirAll("", os.FileMode(0644)))
   144  			for _, inFile := range tt.inputFiles {
   145  				req.NoError(mockFs.WriteFile(inFile.name, []byte(inFile.data), os.FileMode(0644)))
   146  			}
   147  
   148  			if err := removeDests(&mockFs, tt.dests); (err != nil) != tt.wantErr {
   149  				t.Errorf("removeDests() error = %v, wantErr %v", err, tt.wantErr)
   150  			}
   151  
   152  			// compare output FS
   153  			var expectedFileNames, actualFileNames []string
   154  			for _, expectedFile := range tt.wantFiles {
   155  				expectedFileNames = append(expectedFileNames, expectedFile.name)
   156  			}
   157  			err := mockFs.Walk("", func(path string, info os.FileInfo, err error) error {
   158  				if err != nil {
   159  					return errors.Wrapf(err, "walk path %s", path)
   160  				}
   161  				if !info.IsDir() {
   162  					actualFileNames = append(actualFileNames, path)
   163  				}
   164  				return nil
   165  			})
   166  			req.NoError(err)
   167  
   168  			req.ElementsMatch(expectedFileNames, actualFileNames, "comparing expected and actual output files, expected %+v got %+v", expectedFileNames, actualFileNames)
   169  
   170  			for _, outFile := range tt.wantFiles {
   171  				fileBytes, err := mockFs.ReadFile(outFile.name)
   172  				req.NoError(err, "reading output file %s", outFile.name)
   173  
   174  				req.Equal(outFile.data, string(fileBytes), "compare file %s", outFile.name)
   175  			}
   176  		})
   177  	}
   178  }