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  }