github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/piperenv/templating_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package piperenv
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestParseTemplate(t *testing.T) {
    16  	tt := []struct {
    17  		template      string
    18  		cpe           CPEMap
    19  		expected      string
    20  		expectedError error
    21  	}{
    22  		{template: `version: {{index .CPE "artifactVersion"}}, sha: {{git "commitId"}}`, expected: "version: 1.2.3, sha: thisIsMyTestSha"},
    23  		{template: "version: {{", expectedError: fmt.Errorf("failed to parse cpe template 'version: {{'")},
    24  	}
    25  
    26  	cpe := CPEMap{
    27  		"artifactVersion": "1.2.3",
    28  		"git/commitId":    "thisIsMyTestSha",
    29  	}
    30  
    31  	for _, test := range tt {
    32  		res, err := cpe.ParseTemplate(test.template)
    33  		if test.expectedError != nil {
    34  			assert.Contains(t, fmt.Sprint(err), fmt.Sprint(test.expectedError))
    35  		} else {
    36  			assert.NoError(t, err)
    37  			assert.Equal(t, test.expected, (*res).String())
    38  		}
    39  
    40  	}
    41  }
    42  
    43  func TestParseTemplateWithDelimiter(t *testing.T) {
    44  	tt := []struct {
    45  		template      string
    46  		cpe           CPEMap
    47  		expected      string
    48  		expectedError error
    49  	}{
    50  		{template: `version: [[index .CPE "artifactVersion"]], sha: [[git "commitId"]]`, expected: "version: 1.2.3, sha: thisIsMyTestSha"},
    51  		{template: "version: [[", expectedError: fmt.Errorf("failed to parse cpe template 'version: [['")},
    52  		{template: `version: [[index .CPE "artifactVersion"]], release: {{ .RELEASE }}`, expected: "version: 1.2.3, release: {{ .RELEASE }}"},
    53  	}
    54  
    55  	cpe := CPEMap{
    56  		"artifactVersion": "1.2.3",
    57  		"git/commitId":    "thisIsMyTestSha",
    58  	}
    59  
    60  	for _, test := range tt {
    61  		res, err := cpe.ParseTemplateWithDelimiter(test.template, "[[", "]]")
    62  		if test.expectedError != nil {
    63  			assert.Contains(t, fmt.Sprint(err), fmt.Sprint(test.expectedError))
    64  		} else {
    65  			assert.NoError(t, err)
    66  			assert.Equal(t, test.expected, (*res).String())
    67  		}
    68  
    69  	}
    70  }
    71  
    72  func TestTemplateFunctionCpe(t *testing.T) {
    73  	t.Run("CPE from object", func(t *testing.T) {
    74  		tt := []struct {
    75  			element  string
    76  			expected string
    77  		}{
    78  			{element: "artifactVersion", expected: "1.2.3"},
    79  			{element: "git/commitId", expected: "thisIsMyTestSha"},
    80  		}
    81  
    82  		cpe := CPEMap{
    83  			"artifactVersion": "1.2.3",
    84  			"git/commitId":    "thisIsMyTestSha",
    85  		}
    86  
    87  		for _, test := range tt {
    88  			assert.Equal(t, test.expected, cpe.cpe(test.element))
    89  		}
    90  	})
    91  
    92  	t.Run("CPE from files", func(t *testing.T) {
    93  		theVersion := "1.2.3"
    94  		dir := t.TempDir()
    95  		assert.NoError(t, os.WriteFile(filepath.Join(dir, "artifactVersion"), []byte(theVersion), 0o666))
    96  		cpe := CPEMap{}
    97  		assert.NoError(t, cpe.LoadFromDisk(dir))
    98  
    99  		res, err := cpe.ParseTemplate(`{{cpe "artifactVersion"}}`)
   100  		assert.NoError(t, err)
   101  		assert.Equal(t, theVersion, (*res).String())
   102  	})
   103  }
   104  
   105  func TestTemplateFunctionCustom(t *testing.T) {
   106  	tt := []struct {
   107  		element  string
   108  		expected string
   109  	}{
   110  		{element: "repositoryUrl", expected: "https://this.is.the.repo.url"},
   111  		{element: "repositoryId", expected: "repoTestId"},
   112  	}
   113  
   114  	cpe := CPEMap{
   115  		"custom/repositoryUrl": "https://this.is.the.repo.url",
   116  		"custom/repositoryId":  "repoTestId",
   117  	}
   118  
   119  	for _, test := range tt {
   120  		assert.Equal(t, test.expected, cpe.custom(test.element))
   121  	}
   122  }
   123  
   124  func TestTemplateFunctionGit(t *testing.T) {
   125  	tt := []struct {
   126  		element  string
   127  		expected string
   128  	}{
   129  		{element: "commitId", expected: "thisIsMyTestSha"},
   130  		{element: "repository", expected: "testRepo"},
   131  	}
   132  
   133  	cpe := CPEMap{
   134  		"git/commitId":      "thisIsMyTestSha",
   135  		"github/repository": "testRepo",
   136  	}
   137  
   138  	for _, test := range tt {
   139  		assert.Equal(t, test.expected, cpe.git(test.element))
   140  	}
   141  }
   142  
   143  func TestTemplateFunctionImageDigest(t *testing.T) {
   144  	t.Run("CPE from object", func(t *testing.T) {
   145  		tt := []struct {
   146  			imageName string
   147  			cpe       CPEMap
   148  			expected  string
   149  		}{
   150  			{
   151  				imageName: "image1",
   152  				cpe:       CPEMap{},
   153  				expected:  "",
   154  			},
   155  			{
   156  				imageName: "image2",
   157  				cpe: CPEMap{
   158  					"container/imageDigests": []interface{}{"digest1", "digest2", "digest3"},
   159  					"container/imageNames":   []interface{}{"image1", "image2", "image3"},
   160  				},
   161  				expected: "digest2",
   162  			},
   163  			{
   164  				imageName: "image4",
   165  				cpe: CPEMap{
   166  					"container/imageDigests": []interface{}{"digest1", "digest2", "digest3"},
   167  					"container/imageNames":   []interface{}{"image1", "image2", "image3"},
   168  				},
   169  				expected: "",
   170  			},
   171  			{
   172  				imageName: "image1",
   173  				cpe: CPEMap{
   174  					"container/imageDigests": []interface{}{"digest1", "digest3"},
   175  					"container/imageNames":   []interface{}{"image1", "image2", "image3"},
   176  				},
   177  				expected: "",
   178  			},
   179  		}
   180  
   181  		for _, test := range tt {
   182  			assert.Equal(t, test.expected, test.cpe.imageDigest(test.imageName))
   183  		}
   184  	})
   185  
   186  	t.Run("CPE from files", func(t *testing.T) {
   187  		dir := t.TempDir()
   188  
   189  		imageDigests := []string{"digest1", "digest2", "digest3"}
   190  		imageNames := []string{"image1", "image2", "image3"}
   191  		cpeOut := CPEMap{"container/imageDigests": imageDigests, "container/imageNames": imageNames}
   192  		assert.NoError(t, cpeOut.WriteToDisk(dir))
   193  
   194  		cpe := CPEMap{}
   195  		assert.NoError(t, cpe.LoadFromDisk(dir))
   196  
   197  		res, err := cpe.ParseTemplate(`{{imageDigest "image2"}}`)
   198  		assert.NoError(t, err)
   199  		assert.Equal(t, "digest2", (*res).String())
   200  	})
   201  }
   202  
   203  func TestTemplateFunctionImageTag(t *testing.T) {
   204  	t.Run("CPE from object", func(t *testing.T) {
   205  		tt := []struct {
   206  			imageName string
   207  			cpe       CPEMap
   208  			expected  string
   209  		}{
   210  			{
   211  				imageName: "image1",
   212  				cpe:       CPEMap{},
   213  				expected:  "",
   214  			},
   215  			{
   216  				imageName: "image2",
   217  				cpe: CPEMap{
   218  					"container/imageNameTags": []interface{}{"image1:tag1", "image2:tag2", "image3:tag3"},
   219  				},
   220  				expected: "tag2",
   221  			},
   222  			{
   223  				imageName: "image4",
   224  				cpe: CPEMap{
   225  					"container/imageNameTags": []interface{}{"image1:tag1", "image2:tag2", "image3:tag3"},
   226  				},
   227  				expected: "",
   228  			},
   229  		}
   230  
   231  		for _, test := range tt {
   232  			assert.Equal(t, test.expected, test.cpe.imageTag(test.imageName))
   233  		}
   234  	})
   235  
   236  	t.Run("CPE from files", func(t *testing.T) {
   237  		dir := t.TempDir()
   238  
   239  		imageNameTags := []string{"image1:tag1", "image2:tag2", "image3:tag3"}
   240  		imageNames := []string{"image1", "image2", "image3"}
   241  		cpeOut := CPEMap{"container/imageNameTags": imageNameTags, "container/imageNames": imageNames}
   242  		assert.NoError(t, cpeOut.WriteToDisk(dir))
   243  
   244  		cpe := CPEMap{}
   245  		assert.NoError(t, cpe.LoadFromDisk(dir))
   246  
   247  		res, err := cpe.ParseTemplate(`{{imageTag "image2"}}`)
   248  		assert.NoError(t, err)
   249  		assert.Equal(t, "tag2", (*res).String())
   250  	})
   251  }