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 }