github.com/jaylevin/jenkins-library@v1.230.4/pkg/cnbutils/project/descriptor_test.go (about)

     1  package project
     2  
     3  import (
     4  	"net/http"
     5  	"testing"
     6  
     7  	"github.com/SAP/jenkins-library/pkg/cnbutils"
     8  	"github.com/SAP/jenkins-library/pkg/mock"
     9  	"github.com/jarcoal/httpmock"
    10  	"github.com/stretchr/testify/assert"
    11  
    12  	piperhttp "github.com/SAP/jenkins-library/pkg/http"
    13  )
    14  
    15  func TestParseDescriptor(t *testing.T) {
    16  	t.Run("parses the project.toml file", func(t *testing.T) {
    17  		projectToml := `[project]
    18  id = "io.buildpacks.my-app"
    19  version = "0.1"
    20  
    21  [build]
    22  include = [
    23  	"cmd/",
    24  	"go.mod",
    25  	"go.sum",
    26  	"*.go"
    27  ]
    28  
    29  [[build.env]]
    30  name = "VAR1"
    31  value = "VAL1"
    32  
    33  [[build.env]]
    34  name = "VAR2"
    35  value = "VAL2"
    36  
    37  [[build.buildpacks]]
    38  id = "paketo-buildpacks/java"
    39  version = "5.9.1"
    40  
    41  [[build.buildpacks]]
    42  id = "paketo-buildpacks/nodejs"
    43  `
    44  		utils := &cnbutils.MockUtils{
    45  			FilesMock: &mock.FilesMock{},
    46  		}
    47  
    48  		fakeJavaResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"5.9.1\",\"_link\":\"https://test-java/5.9.1\"}]}"
    49  		fakeNodeJsResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"1.1.1\",\"_link\":\"https://test-nodejs/1.1.1\"}]}"
    50  
    51  		utils.AddFile("project.toml", []byte(projectToml))
    52  		httpmock.Activate()
    53  		defer httpmock.DeactivateAndReset()
    54  		httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/paketo-buildpacks/java", httpmock.NewStringResponder(200, fakeJavaResponse))
    55  		httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/paketo-buildpacks/nodejs", httpmock.NewStringResponder(200, fakeNodeJsResponse))
    56  
    57  		httpmock.RegisterResponder(http.MethodGet, "https://test-java/5.9.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test-java@5.9.1\"}"))
    58  		httpmock.RegisterResponder(http.MethodGet, "https://test-nodejs/1.1.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test-nodejs@1.1.1\"}"))
    59  		client := &piperhttp.Client{}
    60  		client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true})
    61  
    62  		descriptor, err := ParseDescriptor("project.toml", utils, client)
    63  
    64  		assert.NoError(t, err)
    65  		assert.Equal(t, descriptor.EnvVars["VAR1"], "VAL1")
    66  		assert.Equal(t, descriptor.EnvVars["VAR2"], "VAL2")
    67  
    68  		assert.Equal(t, descriptor.ProjectID, "io.buildpacks.my-app")
    69  
    70  		assert.Contains(t, descriptor.Buildpacks, "index.docker.io/test-java@5.9.1")
    71  		assert.Contains(t, descriptor.Buildpacks, "index.docker.io/test-nodejs@1.1.1")
    72  
    73  		assert.NotNil(t, descriptor.Include)
    74  
    75  		t3 := descriptor.Include.MatchesPath("cmd/cobra.go")
    76  		assert.True(t, t3)
    77  
    78  		t4 := descriptor.Include.MatchesPath("pkg/test/main.go")
    79  		assert.True(t, t4)
    80  
    81  		t5 := descriptor.Include.MatchesPath("Makefile")
    82  		assert.False(t, t5)
    83  	})
    84  
    85  	t.Run("fails with inline buildpack", func(t *testing.T) {
    86  		projectToml := `[project]
    87  id = "io.buildpacks.my-app"
    88  version = "0.1"
    89  
    90  [[build.buildpacks]]
    91  id = "test/inline"
    92  	[build.buildpacks.script]
    93  	api = "0.5"
    94  	shell = "/bin/bash"
    95  	inline = "date"
    96  `
    97  		utils := &cnbutils.MockUtils{
    98  			FilesMock: &mock.FilesMock{},
    99  		}
   100  
   101  		utils.AddFile("project.toml", []byte(projectToml))
   102  
   103  		_, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{})
   104  
   105  		assert.Error(t, err)
   106  		assert.Equal(t, "inline buildpacks are not supported", err.Error())
   107  	})
   108  
   109  	t.Run("fails with both exclude and include specified", func(t *testing.T) {
   110  		projectToml := `[project]
   111  id = "io.buildpacks.my-app"
   112  version = "0.1"
   113  
   114  [build]
   115  include = [
   116  	"test"
   117  ]
   118  
   119  exclude = [
   120  	"test"
   121  ]
   122  `
   123  
   124  		utils := &cnbutils.MockUtils{
   125  			FilesMock: &mock.FilesMock{},
   126  		}
   127  		utils.AddFile("project.toml", []byte(projectToml))
   128  
   129  		_, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{})
   130  
   131  		assert.Error(t, err)
   132  		assert.Equal(t, "project descriptor options 'exclude' and 'include' are mutually exclusive", err.Error())
   133  	})
   134  
   135  	t.Run("fails with file not found", func(t *testing.T) {
   136  		utils := &cnbutils.MockUtils{
   137  			FilesMock: &mock.FilesMock{},
   138  		}
   139  
   140  		_, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{})
   141  
   142  		assert.Error(t, err)
   143  		assert.Equal(t, "could not read 'project.toml'", err.Error())
   144  	})
   145  
   146  	t.Run("fails to parse corrupted project.toml", func(t *testing.T) {
   147  		projectToml := "test123"
   148  		utils := &cnbutils.MockUtils{
   149  			FilesMock: &mock.FilesMock{},
   150  		}
   151  		utils.AddFile("project.toml", []byte(projectToml))
   152  		_, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{})
   153  
   154  		assert.Error(t, err)
   155  		assert.Equal(t, "(1, 8): was expecting token =, but got EOF instead", err.Error())
   156  	})
   157  }