github.com/cloudfoundry/libcfbuildpack@v1.91.23/detect/detect_test.go (about)

     1  /*
     2   * Copyright 2018-2020 the original author or authors.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      https://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package detect_test
    18  
    19  import (
    20  	"path/filepath"
    21  	"testing"
    22  
    23  	"github.com/buildpack/libbuildpack/buildplan"
    24  	"github.com/cloudfoundry/libcfbuildpack/detect"
    25  	"github.com/cloudfoundry/libcfbuildpack/internal"
    26  	"github.com/cloudfoundry/libcfbuildpack/test"
    27  	"github.com/onsi/gomega"
    28  	"github.com/sclevine/spec"
    29  	"github.com/sclevine/spec/report"
    30  )
    31  
    32  func TestDetect(t *testing.T) {
    33  	spec.Run(t, "Detect", func(t *testing.T, _ spec.G, it spec.S) {
    34  
    35  		g := gomega.NewWithT(t)
    36  
    37  		var root string
    38  
    39  		it.Before(func() {
    40  			root = test.ScratchDir(t, "detect")
    41  		})
    42  
    43  		it("contains default values", func() {
    44  			defer internal.ReplaceWorkingDirectory(t, root)()
    45  			defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")()
    46  			defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))()
    47  
    48  			test.WriteFile(t, filepath.Join(root, "buildpack.toml"), `[buildpack]
    49  id = "buildpack-id"
    50  name = "buildpack-name"
    51  version = "buildpack-version"
    52  
    53  [[stacks]]
    54  id = 'stack-id'
    55  build-images = ["build-image-tag"]
    56  run-images = ["run-image-tag"]
    57  
    58  [metadata]
    59  test-key = "test-value"
    60  `)
    61  
    62  			d, err := detect.DefaultDetect()
    63  			g.Expect(err).NotTo(gomega.HaveOccurred())
    64  
    65  			g.Expect(d.Application).NotTo(gomega.BeZero())
    66  			g.Expect(d.Buildpack).NotTo(gomega.BeZero())
    67  			g.Expect(d.Logger).NotTo(gomega.BeZero())
    68  			g.Expect(d.Platform).NotTo(gomega.BeZero())
    69  			g.Expect(d.Services).NotTo(gomega.BeZero())
    70  			g.Expect(d.Stack).NotTo(gomega.BeZero())
    71  			g.Expect(d.Writer).NotTo(gomega.BeZero())
    72  		})
    73  
    74  		it("returns code when erroring", func() {
    75  			defer internal.ReplaceWorkingDirectory(t, root)()
    76  			defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")()
    77  			defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))()
    78  
    79  			test.TouchFile(t, root, "buildpack.toml")
    80  
    81  			d, err := detect.DefaultDetect()
    82  			g.Expect(err).NotTo(gomega.HaveOccurred())
    83  
    84  			g.Expect(d.Error(42)).To(gomega.Equal(42))
    85  		})
    86  
    87  		it("returns 100 when failing", func() {
    88  			defer internal.ReplaceWorkingDirectory(t, root)()
    89  			defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")()
    90  			defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))()
    91  
    92  			test.TouchFile(t, root, "buildpack.toml")
    93  
    94  			d, err := detect.DefaultDetect()
    95  			g.Expect(err).NotTo(gomega.HaveOccurred())
    96  
    97  			g.Expect(d.Fail()).To(gomega.Equal(detect.FailStatusCode))
    98  		})
    99  
   100  		it("returns 0 and Plan when passing", func() {
   101  			defer internal.ReplaceWorkingDirectory(t, root)()
   102  			defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")()
   103  			defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))()
   104  
   105  			test.TouchFile(t, root, "buildpack.toml")
   106  
   107  			d, err := detect.DefaultDetect()
   108  			g.Expect(err).NotTo(gomega.HaveOccurred())
   109  
   110  			g.Expect(d.Pass(buildplan.Plan{
   111  				Provides: []buildplan.Provided{
   112  					{"test-provided-1a"},
   113  					{"test-provided-1b"},
   114  				},
   115  				Requires: []buildplan.Required{
   116  					{"test-required-1a", "test-version-1a", buildplan.Metadata{"test-key-1a": "test-value-1a"}},
   117  					{"test-required-1b", "test-version-1b", buildplan.Metadata{"test-key-1b": "test-value-1b"}},
   118  				},
   119  			},
   120  				buildplan.Plan{
   121  					Provides: []buildplan.Provided{
   122  						{"test-provided-2a"},
   123  						{"test-provided-2b"},
   124  					},
   125  					Requires: []buildplan.Required{
   126  						{"test-required-2a", "test-version-2a", buildplan.Metadata{"test-key-2a": "test-value-2a"}},
   127  						{"test-required-2b", "test-version-2b", buildplan.Metadata{"test-key-2b": "test-value-2b"}},
   128  					},
   129  				},
   130  				buildplan.Plan{
   131  					Provides: []buildplan.Provided{
   132  						{"test-provided-3a"},
   133  						{"test-provided-3b"},
   134  					},
   135  					Requires: []buildplan.Required{
   136  						{"test-required-3a", "test-version-3a", buildplan.Metadata{"test-key-3a": "test-value-3a"}},
   137  						{"test-required-3b", "test-version-3b", buildplan.Metadata{"test-key-3b": "test-value-3b"}},
   138  					},
   139  				})).To(gomega.Equal(detect.PassStatusCode))
   140  
   141  			g.Expect(filepath.Join(root, "plan.toml")).To(test.HaveContent(`[[provides]]
   142    name = "test-provided-1a"
   143  
   144  [[provides]]
   145    name = "test-provided-1b"
   146  
   147  [[requires]]
   148    name = "test-required-1a"
   149    version = "test-version-1a"
   150    [requires.metadata]
   151      test-key-1a = "test-value-1a"
   152  
   153  [[requires]]
   154    name = "test-required-1b"
   155    version = "test-version-1b"
   156    [requires.metadata]
   157      test-key-1b = "test-value-1b"
   158  
   159  [[or]]
   160  
   161    [[or.provides]]
   162      name = "test-provided-2a"
   163  
   164    [[or.provides]]
   165      name = "test-provided-2b"
   166  
   167    [[or.requires]]
   168      name = "test-required-2a"
   169      version = "test-version-2a"
   170      [or.requires.metadata]
   171        test-key-2a = "test-value-2a"
   172  
   173    [[or.requires]]
   174      name = "test-required-2b"
   175      version = "test-version-2b"
   176      [or.requires.metadata]
   177        test-key-2b = "test-value-2b"
   178  
   179  [[or]]
   180  
   181    [[or.provides]]
   182      name = "test-provided-3a"
   183  
   184    [[or.provides]]
   185      name = "test-provided-3b"
   186  
   187    [[or.requires]]
   188      name = "test-required-3a"
   189      version = "test-version-3a"
   190      [or.requires.metadata]
   191        test-key-3a = "test-value-3a"
   192  
   193    [[or.requires]]
   194      name = "test-required-3b"
   195      version = "test-version-3b"
   196      [or.requires.metadata]
   197        test-key-3b = "test-value-3b"
   198  `))
   199  		})
   200  	}, spec.Report(report.Terminal{}))
   201  }
   202