github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/internal/commands/untrust_builder_test.go (about)

     1  package commands_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/heroku/color"
    11  	"github.com/sclevine/spec"
    12  	"github.com/sclevine/spec/report"
    13  
    14  	"github.com/buildpacks/pack/internal/commands"
    15  	"github.com/buildpacks/pack/internal/config"
    16  	"github.com/buildpacks/pack/internal/style"
    17  	"github.com/buildpacks/pack/pkg/logging"
    18  	h "github.com/buildpacks/pack/testhelpers"
    19  )
    20  
    21  func TestUntrustBuilderCommand(t *testing.T) {
    22  	color.Disable(true)
    23  	defer color.Disable(false)
    24  	spec.Run(t, "Commands", testUntrustBuilderCommand, spec.Random(), spec.Report(report.Terminal{}))
    25  }
    26  
    27  func testUntrustBuilderCommand(t *testing.T, when spec.G, it spec.S) {
    28  	var (
    29  		logger        logging.Logger
    30  		outBuf        bytes.Buffer
    31  		tempPackHome  string
    32  		configPath    string
    33  		configManager configManager
    34  	)
    35  
    36  	it.Before(func() {
    37  		var err error
    38  
    39  		logger = logging.NewLogWithWriters(&outBuf, &outBuf)
    40  
    41  		tempPackHome, err = os.MkdirTemp("", "pack-home")
    42  		h.AssertNil(t, err)
    43  		configPath = filepath.Join(tempPackHome, "config.toml")
    44  		configManager = newConfigManager(t, configPath)
    45  	})
    46  
    47  	it.After(func() {
    48  		h.AssertNil(t, os.RemoveAll(tempPackHome))
    49  	})
    50  
    51  	when("#UntrustBuilder", func() {
    52  		when("no builder is provided", func() {
    53  			it("prints usage", func() {
    54  				cfg := configManager.configWithTrustedBuilders()
    55  				command := commands.UntrustBuilder(logger, cfg, configPath)
    56  				command.SetArgs([]string{})
    57  				command.SetOut(&outBuf)
    58  
    59  				err := command.Execute()
    60  				h.AssertError(t, err, "accepts 1 arg(s), received 0")
    61  				h.AssertContains(t, outBuf.String(), "Usage:")
    62  			})
    63  		})
    64  
    65  		when("builder is already trusted", func() {
    66  			it("removes builder from the config", func() {
    67  				builderName := "some-builder"
    68  
    69  				cfg := configManager.configWithTrustedBuilders(builderName)
    70  				command := commands.UntrustBuilder(logger, cfg, configPath)
    71  				command.SetArgs([]string{builderName})
    72  
    73  				h.AssertNil(t, command.Execute())
    74  
    75  				b, err := os.ReadFile(configPath)
    76  				h.AssertNil(t, err)
    77  				h.AssertNotContains(t, string(b), builderName)
    78  
    79  				h.AssertContains(t,
    80  					outBuf.String(),
    81  					fmt.Sprintf("Builder %s is no longer trusted", style.Symbol(builderName)),
    82  				)
    83  			})
    84  
    85  			it("removes only the named builder when multiple builders are trusted", func() {
    86  				untrustBuilder := "stop/trusting:me"
    87  				stillTrustedBuilder := "very/safe/builder"
    88  
    89  				cfg := configManager.configWithTrustedBuilders(untrustBuilder, stillTrustedBuilder)
    90  				command := commands.UntrustBuilder(logger, cfg, configPath)
    91  				command.SetArgs([]string{untrustBuilder})
    92  
    93  				h.AssertNil(t, command.Execute())
    94  
    95  				b, err := os.ReadFile(configPath)
    96  				h.AssertNil(t, err)
    97  				h.AssertContains(t, string(b), stillTrustedBuilder)
    98  				h.AssertNotContains(t, string(b), untrustBuilder)
    99  			})
   100  		})
   101  
   102  		when("builder wasn't already trusted", func() {
   103  			it("does nothing and reports builder wasn't trusted", func() {
   104  				neverTrustedBuilder := "never/trusted-builder"
   105  				stillTrustedBuilder := "very/safe/builder"
   106  
   107  				cfg := configManager.configWithTrustedBuilders(stillTrustedBuilder)
   108  				command := commands.UntrustBuilder(logger, cfg, configPath)
   109  				command.SetArgs([]string{neverTrustedBuilder})
   110  
   111  				h.AssertNil(t, command.Execute())
   112  
   113  				b, err := os.ReadFile(configPath)
   114  				h.AssertNil(t, err)
   115  				h.AssertContains(t, string(b), stillTrustedBuilder)
   116  				h.AssertNotContains(t, string(b), neverTrustedBuilder)
   117  
   118  				h.AssertContains(t,
   119  					outBuf.String(),
   120  					fmt.Sprintf("Builder %s wasn't trusted", style.Symbol(neverTrustedBuilder)),
   121  				)
   122  			})
   123  		})
   124  
   125  		when("builder is a suggested builder", func() {
   126  			it("does nothing and reports that ", func() {
   127  				builder := "paketobuildpacks/builder-jammy-base"
   128  				command := commands.UntrustBuilder(logger, config.Config{}, configPath)
   129  				command.SetArgs([]string{builder})
   130  
   131  				err := command.Execute()
   132  				h.AssertError(t, err, fmt.Sprintf("Builder %s is a suggested builder, and is trusted by default", style.Symbol(builder)))
   133  			})
   134  		})
   135  	})
   136  }