github.com/w3security/vervet/v5@v5.3.1-0.20230618081846-5bd9b5d799dc/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/w3security/vervet/v5/internal/cmd" 12 "github.com/w3security/vervet/v5/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 }