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  }