github.com/redhat-appstudio/e2e-tests@v0.0.0-20240520140907-9709f6f59323/pkg/clients/tekton/controller_test.go (about) 1 package tekton 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/h2non/gock" 8 "github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestCosignResultShouldPresence(t *testing.T) { 13 assert.False(t, tekton.CosignResult{}.IsPresent()) 14 15 assert.False(t, tekton.CosignResult{ 16 SignatureImageRef: "something", 17 }.IsPresent()) 18 19 assert.False(t, tekton.CosignResult{ 20 AttestationImageRef: "something", 21 }.IsPresent()) 22 23 assert.True(t, tekton.CosignResult{ 24 SignatureImageRef: "something", 25 AttestationImageRef: "something", 26 }.IsPresent()) 27 } 28 29 func TestCosignResultMissingFormat(t *testing.T) { 30 assert.Equal(t, "prefix.sig and prefix.att", tekton.CosignResult{}.Missing("prefix")) 31 32 assert.Equal(t, "prefix.att", tekton.CosignResult{ 33 SignatureImageRef: "something", 34 }.Missing("prefix")) 35 36 assert.Equal(t, "prefix.sig", tekton.CosignResult{ 37 AttestationImageRef: "something", 38 }.Missing("prefix")) 39 40 assert.Empty(t, tekton.CosignResult{ 41 SignatureImageRef: "something", 42 AttestationImageRef: "something", 43 }.Missing("prefix")) 44 } 45 46 func createHttpMock(urlPath, tag string, response any) { 47 s := gock.New("https://quay.io/api/v1") 48 if len(tag) > 0 { 49 s.MatchParam("specificTag", tag) 50 } 51 s.Get(urlPath). 52 Reply(200). 53 JSON(response) 54 } 55 56 func TestFindingCosignResults(t *testing.T) { 57 const imageRegistryName = "quay.io" 58 const imageRepo = "test/repo" 59 const imageTag = "123" 60 const imageDigest = "sha256:abc" 61 const cosignImageTag = "sha256-abc" 62 const imageRef = imageRegistryName + "/" + imageRepo + ":" + imageTag + "@" + imageDigest 63 const signatureImageDigest = "sha256:signature" 64 const attestationImageDigest = "sha256:attestation" 65 const SignatureImageRef = imageRegistryName + "/" + imageRepo + "@" + signatureImageDigest 66 const AttestationImageRef = imageRegistryName + "/" + imageRepo + "@" + attestationImageDigest 67 68 cases := []struct { 69 Name string 70 SignatureImagePresent bool 71 AttestationImagePresent bool 72 AttestationImageLayers []any 73 ExpectedErrors []string 74 Result *tekton.CosignResult 75 }{ 76 {"happy day", true, true, []any{""}, []string{}, &tekton.CosignResult{ 77 SignatureImageRef: SignatureImageRef, 78 AttestationImageRef: AttestationImageRef, 79 }}, 80 {"happy day multiple attestations", true, true, []any{"", ""}, []string{}, &tekton.CosignResult{ 81 SignatureImageRef: SignatureImageRef, 82 AttestationImageRef: AttestationImageRef, 83 }}, 84 {"missing signature", false, true, []any{""}, []string{"error when getting signature"}, &tekton.CosignResult{ 85 SignatureImageRef: "", 86 AttestationImageRef: AttestationImageRef, 87 }}, 88 {"missing attestation", true, false, []any{""}, []string{"error when getting attestation"}, &tekton.CosignResult{ 89 SignatureImageRef: SignatureImageRef, 90 AttestationImageRef: "", 91 }}, 92 {"missing signature and attestation", false, false, []any{""}, []string{"error when getting attestation", "error when getting signature"}, &tekton.CosignResult{ 93 SignatureImageRef: "", 94 AttestationImageRef: "", 95 }}, 96 {"missing layers in attestation", true, true, []any{}, []string{"cannot get layers from"}, &tekton.CosignResult{ 97 SignatureImageRef: SignatureImageRef, 98 AttestationImageRef: "", 99 }}, 100 } 101 102 for _, cse := range cases { 103 t.Run(cse.Name, func(t *testing.T) { 104 defer gock.Off() 105 106 if cse.SignatureImagePresent { 107 createHttpMock(fmt.Sprintf("/repository/%s/tag", imageRepo), cosignImageTag+".sig", &tekton.TagResponse{Tags: []tekton.Tag{{Digest: signatureImageDigest}}}) 108 } 109 if cse.AttestationImagePresent { 110 createHttpMock(fmt.Sprintf("/repository/%s/tag", imageRepo), cosignImageTag+".att", &tekton.TagResponse{Tags: []tekton.Tag{{Digest: attestationImageDigest}}}) 111 } 112 createHttpMock(fmt.Sprintf("/repository/%s/manifest/%s", imageRepo, attestationImageDigest), "", &tekton.ManifestResponse{Layers: cse.AttestationImageLayers}) 113 114 result, err := tekton.FindCosignResultsForImage(imageRef) 115 116 if err != nil { 117 assert.NotEmpty(t, cse.ExpectedErrors) 118 for _, errSubstring := range cse.ExpectedErrors { 119 assert.Contains(t, err.Error(), errSubstring) 120 } 121 } else { 122 assert.Empty(t, cse.ExpectedErrors) 123 } 124 assert.Equal(t, cse.Result, result) 125 }) 126 } 127 128 }