github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/runners/scripts/edit_test.go (about) 1 package scripts 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 "testing" 8 9 "github.com/ActiveState/cli/internal/testhelpers/suite" 10 "gopkg.in/yaml.v2" 11 12 "github.com/ActiveState/cli/internal/config" 13 "github.com/ActiveState/cli/internal/fileutils" 14 "github.com/ActiveState/cli/internal/scriptfile" 15 "github.com/ActiveState/cli/internal/testhelpers/outputhelper" 16 "github.com/ActiveState/cli/pkg/project" 17 "github.com/ActiveState/cli/pkg/projectfile" 18 ) 19 20 type EditTestSuite struct { 21 suite.Suite 22 projectFile *projectfile.Project 23 project *project.Project 24 scriptFile *scriptfile.ScriptFile 25 originalEditor string 26 cfg projectfile.ConfigGetter 27 } 28 29 func (suite *EditTestSuite) BeforeTest(suiteName, testName string) { 30 var err error 31 suite.cfg, err = config.New() 32 suite.Require().NoError(err) 33 34 suite.projectFile = &projectfile.Project{} 35 contents := strings.TrimSpace(` 36 project: "https://platform.activestate.com/EditOrg/EditProject" 37 constants: 38 - name: HELLO 39 value: hello 40 scripts: 41 - name: hello 42 value: echo hello 43 - name: hello-constant 44 value: echo $constants.HELLO 45 - name: replace 46 value: echo replaced 47 `) 48 49 tempDir := os.TempDir() 50 err = os.Chdir(tempDir) 51 suite.Require().NoError(err, "should change directories without issue") 52 53 err = yaml.Unmarshal([]byte(contents), suite.projectFile) 54 suite.Require().NoError(err, "unexpected error marshalling yaml") 55 56 suite.projectFile.SetPath(filepath.Join(tempDir, "activestate.yaml")) 57 err = suite.projectFile.Save(suite.cfg) 58 suite.Require().NoError(err, "should be able to save in temp dir") 59 60 suite.project, err = project.New(suite.projectFile, nil) 61 suite.Require().NoError(err, "unexpected error creating project") 62 63 suite.originalEditor = os.Getenv("EDITOR") 64 } 65 66 func (suite *EditTestSuite) AfterTest(suiteName, testName string) { 67 err := os.Remove(suite.projectFile.Path()) 68 suite.Require().NoError(err, "unexpected error removing project file") 69 70 if suite.scriptFile != nil { 71 suite.scriptFile.Clean() 72 } 73 74 os.Setenv("EDITOR", suite.originalEditor) 75 suite.Require().NoError(suite.cfg.Close()) 76 } 77 78 func (suite *EditTestSuite) TestCreateScriptFile() { 79 script := suite.project.ScriptByName("hello") 80 81 var err error 82 suite.scriptFile, err = createScriptFile(script, false) 83 suite.Require().NoError(err, "should create file") 84 } 85 86 func (suite *EditTestSuite) TestCreateScriptFile_Expand() { 87 script := suite.project.ScriptByName("hello-constant") 88 89 var err error 90 suite.scriptFile, err = createScriptFile(script, true) 91 suite.Require().NoError(err, "should create file") 92 93 content, err := fileutils.ReadFile(suite.scriptFile.Filename()) 94 suite.Require().NoError(err, "unexpected error reading file contents") 95 v, err := script.Value() 96 suite.Require().NoError(err) 97 suite.Equal(v, string(content)) 98 } 99 100 func (suite *EditTestSuite) TestNewScriptWatcher() { 101 script := suite.project.ScriptByName("hello") 102 103 var err error 104 suite.scriptFile, err = createScriptFile(script, false) 105 suite.Require().NoError(err, "should create file") 106 107 watcher, err := newScriptWatcher(suite.scriptFile) 108 suite.Require().NoError(err, "unexpected error creating script watcher") 109 110 catcher := outputhelper.NewCatcher() 111 proj, err := project.Get() 112 suite.Require().NoError(err, "unexpected error getting project") 113 go watcher.run("hello", catcher.Outputer, suite.cfg, proj) 114 115 watcher.done <- true 116 117 select { 118 case err = <-watcher.errs: 119 suite.Require().NoError(err, "should not get error from running watcher") 120 default: 121 // Do nothing, test passed 122 } 123 } 124 125 func (suite *EditTestSuite) TestUpdateProjectFile() { 126 replace := suite.project.ScriptByName("replace") 127 128 var err error 129 suite.scriptFile, err = createScriptFile(replace, false) 130 suite.Require().NoError(err, "unexpected error creating script file") 131 132 proj, err := project.Get() 133 suite.Require().NoError(err, "unexpected error getting project") 134 err = updateProjectFile(suite.cfg, proj, suite.scriptFile, "replace") 135 suite.Require().NoError(err, "should be able to update script file") 136 137 updatedProject, err := project.Get() 138 suite.Require().NoError(err, "unexpected error getting project") 139 v1, err := replace.Value() 140 suite.Require().NoError(err) 141 v2, err := updatedProject.ScriptByName("replace").Value() 142 suite.Require().NoError(err) 143 suite.Equal(v1, v2) 144 } 145 146 func TestEditSuite(t *testing.T) { 147 suite.Run(t, new(EditTestSuite)) 148 }