github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/unfork/unforker_test.go (about)

     1  package unfork
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/replicatedhq/ship/pkg/testing/logger"
     7  	"github.com/replicatedhq/ship/pkg/util"
     8  	"github.com/spf13/afero"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestContainsNonGVK(t *testing.T) {
    13  	req := require.New(t)
    14  
    15  	onlyGvk := `apiVersion: v1
    16  kind: Secret
    17  metadata:
    18    name: "foo"
    19    labels:
    20      something: false`
    21  
    22  	check, err := containsNonGVK([]byte(onlyGvk))
    23  	req.NoError(err)
    24  	req.False(check, "yaml witih only gvk keys should not report that it contains non gvk keys")
    25  
    26  	extraKeys := `apiVersion: v1
    27  kind: Service
    28  metadata:
    29    name: "bar"
    30  spec:
    31    type: ClusterIP`
    32  
    33  	check, err = containsNonGVK([]byte(extraKeys))
    34  	req.NoError(err)
    35  	req.True(check, "yaml with non gvk keys should report that it contains extra keys")
    36  }
    37  
    38  type testFile struct {
    39  	path     string
    40  	contents string
    41  }
    42  
    43  func TestUnforker_mapUpstream(t *testing.T) {
    44  	tests := []struct {
    45  		name         string
    46  		testFiles    []testFile
    47  		upstreamPath string
    48  		want         map[util.MinimalK8sYaml]string
    49  	}{
    50  		{
    51  			name: "simple",
    52  			testFiles: []testFile{
    53  				{
    54  					path: "base/strawberry.yaml",
    55  					contents: `kind: Deployment
    56  apiVersion: extensions/v1beta1
    57  metadata:
    58    name: strawberry
    59  spec:
    60    hi: hello
    61  `,
    62  				},
    63  			},
    64  			upstreamPath: "base",
    65  			want: map[util.MinimalK8sYaml]string{
    66  				util.MinimalK8sYaml{
    67  					Kind: "Deployment",
    68  					Metadata: util.MinimalK8sMetadata{
    69  						Name: "strawberry",
    70  					},
    71  				}: "base/strawberry.yaml",
    72  			},
    73  		},
    74  		{
    75  			name: "not native k8s",
    76  			testFiles: []testFile{
    77  				{
    78  					path: "base/apple.yaml",
    79  					contents: `kind: Fruit
    80  apiVersion: fruity
    81  metadata:
    82    name: apple
    83  spec:
    84    late: night
    85  `,
    86  				},
    87  			},
    88  			upstreamPath: "base",
    89  			want:         map[util.MinimalK8sYaml]string{},
    90  		},
    91  		{
    92  			name: "complex",
    93  			testFiles: []testFile{
    94  				{
    95  					path: "base/strawberry.yaml",
    96  					contents: `kind: Service
    97  apiVersion: v1
    98  metadata:
    99    name: strawberry
   100  spec:
   101    hi: hello
   102  `,
   103  				},
   104  				{
   105  					path: "base/nested/banana.yaml",
   106  					contents: `kind: StatefulSet
   107  apiVersion: apps/v1beta1
   108  metadata:
   109    name: banana
   110  spec:
   111    bye: goodbye
   112  `,
   113  				},
   114  				{
   115  					path: "base/nested/avocado.yaml",
   116  					contents: `kind: ConfigMap
   117  apiVersion: v1
   118  metadata:
   119    name: avocado
   120  spec:
   121    what: ami
   122  `,
   123  				},
   124  				{
   125  					path: "base/another/pomegranate.yaml",
   126  					contents: `kind: Service
   127  apiVersion: v1
   128  metadata:
   129    name: pomegranate
   130  spec:
   131    laugh: lol
   132  `,
   133  				},
   134  			},
   135  			upstreamPath: "base",
   136  			want: map[util.MinimalK8sYaml]string{
   137  				util.MinimalK8sYaml{
   138  					Kind: "Service",
   139  					Metadata: util.MinimalK8sMetadata{
   140  						Name: "strawberry",
   141  					},
   142  				}: "base/strawberry.yaml",
   143  				util.MinimalK8sYaml{
   144  					Kind: "StatefulSet",
   145  					Metadata: util.MinimalK8sMetadata{
   146  						Name: "banana",
   147  					},
   148  				}: "base/nested/banana.yaml",
   149  				util.MinimalK8sYaml{
   150  					Kind: "ConfigMap",
   151  					Metadata: util.MinimalK8sMetadata{
   152  						Name: "avocado",
   153  					},
   154  				}: "base/nested/avocado.yaml",
   155  				util.MinimalK8sYaml{
   156  					Kind: "Service",
   157  					Metadata: util.MinimalK8sMetadata{
   158  						Name: "pomegranate",
   159  					},
   160  				}: "base/another/pomegranate.yaml",
   161  			},
   162  		},
   163  	}
   164  
   165  	for _, tt := range tests {
   166  		req := require.New(t)
   167  		mockFS := afero.Afero{Fs: afero.NewMemMapFs()}
   168  		err := addTestFiles(mockFS, tt.testFiles)
   169  		req.NoError(err)
   170  
   171  		t.Run(tt.name, func(t *testing.T) {
   172  			l := &Unforker{
   173  				Logger: &logger.TestLogger{T: t},
   174  				FS:     mockFS,
   175  			}
   176  			upstreamMap := map[util.MinimalK8sYaml]string{}
   177  			err := l.mapUpstream(upstreamMap, tt.upstreamPath)
   178  			req.NoError(err)
   179  
   180  			req.Equal(tt.want, upstreamMap)
   181  		})
   182  	}
   183  }
   184  
   185  func addTestFiles(fs afero.Afero, testFiles []testFile) error {
   186  	for _, testFile := range testFiles {
   187  		if err := fs.WriteFile(testFile.path, []byte(testFile.contents), 0777); err != nil {
   188  			return err
   189  		}
   190  	}
   191  	return nil
   192  }
   193  
   194  func TestUnforker_findMatchingUpstreamPath(t *testing.T) {
   195  	tests := []struct {
   196  		name          string
   197  		upstreamMap   map[util.MinimalK8sYaml]string
   198  		forkedMinimal util.MinimalK8sYaml
   199  		want          string
   200  	}{
   201  		{
   202  			name: "matching names",
   203  			upstreamMap: map[util.MinimalK8sYaml]string{
   204  				util.MinimalK8sYaml{
   205  					Kind: "Deployment",
   206  					Metadata: util.MinimalK8sMetadata{
   207  						Name: "some-deployment",
   208  					},
   209  				}: "some/deployment.yaml",
   210  				util.MinimalK8sYaml{
   211  					Kind: "Deployment",
   212  					Metadata: util.MinimalK8sMetadata{
   213  						Name: "some-service",
   214  					},
   215  				}: "some/service.yaml",
   216  			},
   217  			forkedMinimal: util.MinimalK8sYaml{
   218  				Kind: "Deployment",
   219  				Metadata: util.MinimalK8sMetadata{
   220  					Name: "some-deployment",
   221  				},
   222  			},
   223  			want: "some/deployment.yaml",
   224  		},
   225  		{
   226  			name: "forked minimal name has a prefix",
   227  			upstreamMap: map[util.MinimalK8sYaml]string{
   228  				util.MinimalK8sYaml{
   229  					Kind: "Deployment",
   230  					Metadata: util.MinimalK8sMetadata{
   231  						Name: "deployment",
   232  					},
   233  				}: "some/deployment.yaml",
   234  				util.MinimalK8sYaml{
   235  					Kind: "Deployment",
   236  					Metadata: util.MinimalK8sMetadata{
   237  						Name: "service",
   238  					},
   239  				}: "some/service.yaml",
   240  			},
   241  			forkedMinimal: util.MinimalK8sYaml{
   242  				Kind: "Deployment",
   243  				Metadata: util.MinimalK8sMetadata{
   244  					Name: "some-deployment",
   245  				},
   246  			},
   247  			want: "some/deployment.yaml",
   248  		},
   249  		{
   250  			name: "upstream resources have a prefix",
   251  			upstreamMap: map[util.MinimalK8sYaml]string{
   252  				util.MinimalK8sYaml{
   253  					Kind: "Deployment",
   254  					Metadata: util.MinimalK8sMetadata{
   255  						Name: "some-deployment",
   256  					},
   257  				}: "some/deployment.yaml",
   258  				util.MinimalK8sYaml{
   259  					Kind: "Service",
   260  					Metadata: util.MinimalK8sMetadata{
   261  						Name: "some-service",
   262  					},
   263  				}: "some/service.yaml",
   264  			},
   265  			forkedMinimal: util.MinimalK8sYaml{
   266  				Kind: "Service",
   267  				Metadata: util.MinimalK8sMetadata{
   268  					Name: "service",
   269  				},
   270  			},
   271  			want: "some/service.yaml",
   272  		},
   273  		{
   274  			name: "no matching resource",
   275  			upstreamMap: map[util.MinimalK8sYaml]string{
   276  				util.MinimalK8sYaml{
   277  					Kind: "Deployment",
   278  					Metadata: util.MinimalK8sMetadata{
   279  						Name: "some-deployment",
   280  					},
   281  				}: "some/deployment.yaml",
   282  				util.MinimalK8sYaml{
   283  					Kind: "Service",
   284  					Metadata: util.MinimalK8sMetadata{
   285  						Name: "some-service",
   286  					},
   287  				}: "some/service.yaml",
   288  			},
   289  			forkedMinimal: util.MinimalK8sYaml{
   290  				Kind: "ConfigMap",
   291  				Metadata: util.MinimalK8sMetadata{
   292  					Name: "some-configmap",
   293  				},
   294  			},
   295  			want: "",
   296  		},
   297  	}
   298  	for _, tt := range tests {
   299  		req := require.New(t)
   300  		t.Run(tt.name, func(t *testing.T) {
   301  			l := &Unforker{}
   302  			got := l.findMatchingUpstreamPath(tt.upstreamMap, tt.forkedMinimal)
   303  			req.Equal(tt.want, got)
   304  		})
   305  	}
   306  }