github.com/redhat-appstudio/e2e-tests@v0.0.0-20230619105049-9a422b2094d7/pkg/utils/tekton/controller_test.go (about)

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