github.com/snyk/vervet/v6@v6.2.4/internal/cmd/scaffold_test.go (about)

     1  package cmd_test
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"testing"
     7  
     8  	qt "github.com/frankban/quicktest"
     9  	"github.com/urfave/cli/v2"
    10  
    11  	"github.com/snyk/vervet/v6/internal/cmd"
    12  	"github.com/snyk/vervet/v6/testdata"
    13  )
    14  
    15  var vervetConfigFile = "./.vervet.yaml"
    16  
    17  func appWithSubcommand(subcmd *cli.Command, prompt cmd.VervetPrompt) *cmd.VervetApp {
    18  	newCli := cmd.CLIApp
    19  	newCli.Commands = append(newCli.Commands, subcmd)
    20  	return cmd.NewApp(&newCli, cmd.VervetParams{
    21  		Stdin:  os.Stdin,
    22  		Stdout: os.Stdout,
    23  		Stderr: os.Stderr,
    24  		Prompt: prompt,
    25  	})
    26  }
    27  
    28  type testPrompt struct {
    29  	ReturnConfirm bool
    30  	ReturnSelect  string
    31  	ReturnEntry   string
    32  }
    33  
    34  func (tp *testPrompt) Confirm(label string) (bool, error) {
    35  	return tp.ReturnConfirm, nil
    36  }
    37  
    38  func (tp *testPrompt) Entry(label string) (string, error) {
    39  	return tp.ReturnEntry, nil
    40  }
    41  
    42  func (tp *testPrompt) Select(label string, items []string) (string, error) {
    43  	return tp.ReturnSelect, nil
    44  }
    45  
    46  var filemark = "bad wolf"
    47  
    48  // markFile adds a string to a file so we can check if that file is being overwritten.
    49  func markTestFile(filename string) error {
    50  	// Write a string to the file; we should see this string removed when
    51  	f, err := os.OpenFile(filename, os.O_WRONLY, 0644)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	defer f.Close()
    56  
    57  	if err != nil {
    58  		return err
    59  	}
    60  	_, err = f.Write([]byte(filemark))
    61  	return err
    62  }
    63  
    64  // markInFile checks if the filemark is present, determining if the file has been
    65  // overwritten.
    66  func markInFile(filename string) (bool, error) {
    67  	content, err := os.ReadFile(filename)
    68  	if err != nil {
    69  		return false, err
    70  	}
    71  	return strings.Contains(string(content), "bad wolf"), nil
    72  }
    73  
    74  func TestScaffold(t *testing.T) {
    75  	c := qt.New(t)
    76  	dstDir := c.TempDir()
    77  	cd(c, dstDir)
    78  
    79  	prompt := &testPrompt{}
    80  	testScaffoldCmd := appWithSubcommand(&cmd.Scaffold, prompt)
    81  
    82  	// Running init creates the project files.
    83  	err := testScaffoldCmd.Run([]string{"vervet", "scaffold", "init", testdata.Path("test-scaffold")})
    84  	c.Assert(err, qt.IsNil)
    85  
    86  	// Rerunning init asks the user if they want to overwrite; if they say no
    87  	// the command ends...
    88  	prompt.ReturnConfirm = false
    89  	err = markTestFile(vervetConfigFile)
    90  	c.Assert(err, qt.IsNil)
    91  	err = testScaffoldCmd.Run([]string{"vervet", "scaffold", "init", testdata.Path("test-scaffold")})
    92  	c.Assert(err, qt.IsNil)
    93  	fileMarked, err := markInFile(vervetConfigFile)
    94  	c.Assert(err, qt.IsNil)
    95  	c.Assert(fileMarked, qt.IsTrue)
    96  
    97  	// ...if the user selects yes, it will overwrite the project files.
    98  	prompt.ReturnConfirm = true
    99  	err = testScaffoldCmd.Run([]string{"vervet", "scaffold", "init", testdata.Path("test-scaffold")})
   100  	c.Assert(err, qt.IsNil)
   101  	fileMarked, err = markInFile(vervetConfigFile)
   102  	c.Assert(err, qt.IsNil)
   103  	c.Assert(fileMarked, qt.IsFalse)
   104  
   105  	// Rerunning init with the force option overwrites the project files.
   106  	prompt.ReturnConfirm = false
   107  	err = markTestFile(vervetConfigFile)
   108  	c.Assert(err, qt.IsNil)
   109  	err = testScaffoldCmd.Run([]string{"vervet", "scaffold", "init", "--force", testdata.Path("test-scaffold")})
   110  	c.Assert(err, qt.IsNil)
   111  	fileMarked, err = markInFile(vervetConfigFile)
   112  	c.Assert(err, qt.IsNil)
   113  	c.Assert(fileMarked, qt.IsFalse)
   114  }