diff --git a/internal/config/project.go b/internal/config/project.go index 247f907d..a453fed1 100644 --- a/internal/config/project.go +++ b/internal/config/project.go @@ -58,7 +58,6 @@ type ProjectConfigManager interface { ReadProjectConfigFile(ctx context.Context) (ProjectConfig, error) WriteProjectConfigFile(ctx context.Context, projectConfig ProjectConfig) (string, error) ProjectConfigJSONFileExists(projectDirPath string) bool - GetProjectDirPath() (string, error) Cache() cache.Cacher } @@ -95,7 +94,7 @@ func (c *ProjectConfig) InitProjectID(ctx context.Context, overwriteExistingProj defer span.Finish() // Check that current directory is a project - if _, err := c.GetProjectDirPath(); err != nil { + if _, err := GetProjectDirPath(c.fs, c.os); err != nil { return "", err } @@ -245,7 +244,7 @@ func (c *ProjectConfig) ReadProjectConfigFile(ctx context.Context) (ProjectConfi var projectConfig ProjectConfig - projectDirPath, err := c.GetProjectDirPath() + projectDirPath, err := GetProjectDirPath(c.fs, c.os) if err != nil { return projectConfig, err } @@ -285,7 +284,7 @@ func (c *ProjectConfig) WriteProjectConfigFile(ctx context.Context, projectConfi return "", err } - projectDirPath, err := c.GetProjectDirPath() + projectDirPath, err := GetProjectDirPath(c.fs, c.os) if err != nil { return "", err } @@ -308,21 +307,21 @@ func (c *ProjectConfig) ProjectConfigJSONFileExists(projectDirPath string) bool // GetProjectDirPath returns the path to the project directory or an error if not a Slack project // TODO(@mbrooks) Standardize the definition of a validate project directory and merge with `cmdutil.ValidProjectDirectoryOrExit` -func (c *ProjectConfig) GetProjectDirPath() (string, error) { - currentDir, _ := c.os.Getwd() +func GetProjectDirPath(fs afero.Fs, os types.Os) (string, error) { + currentDir, _ := os.Getwd() // Verify project-level hooks.json exists projectHooksJSONPath := GetProjectHooksJSONFilePath(currentDir) - if _, err := c.fs.Stat(projectHooksJSONPath); os.IsNotExist(err) { + if _, err := fs.Stat(projectHooksJSONPath); os.IsNotExist(err) { // Fallback check for slack.json and .slack/slack.json file // DEPRECATED(semver:major): remove both fallbacks next major release projectSlackJSONPath := filepath.Join(currentDir, "slack.json") - if _, err := c.fs.Stat(projectSlackJSONPath); err == nil { + if _, err := fs.Stat(projectSlackJSONPath); err == nil { return currentDir, nil } projectDotSlackSlackJSONPath := filepath.Join(currentDir, ".slack", "slack.json") - if _, err := c.fs.Stat(projectDotSlackSlackJSONPath); err == nil { + if _, err := fs.Stat(projectDotSlackSlackJSONPath); err == nil { return currentDir, nil } return "", slackerror.New(slackerror.ErrInvalidAppDirectory) @@ -333,7 +332,7 @@ func (c *ProjectConfig) GetProjectDirPath() (string, error) { // Cache loads the cached project values func (c *ProjectConfig) Cache() cache.Cacher { - path, err := c.GetProjectDirPath() + path, err := GetProjectDirPath(c.fs, c.os) if err != nil { return &cache.Cache{} } diff --git a/internal/config/project_mock.go b/internal/config/project_mock.go index 83e9a48e..8037dbfc 100644 --- a/internal/config/project_mock.go +++ b/internal/config/project_mock.go @@ -83,11 +83,6 @@ func (m *ProjectConfigMock) ProjectConfigJSONFileExists(projectDirPath string) b return args.Bool(0) } -func (m *ProjectConfigMock) GetProjectDirPath() (string, error) { - args := m.Called() - return args.String(0), args.Error(1) -} - // Cache returns a persistent mock cache func (m *ProjectConfigMock) Cache() cache.Cacher { args := m.Called() diff --git a/internal/config/project_test.go b/internal/config/project_test.go index 3bb96db4..ab94c713 100644 --- a/internal/config/project_test.go +++ b/internal/config/project_test.go @@ -343,7 +343,7 @@ func Test_ProjectConfig_ReadProjectConfigFile(t *testing.T) { addProjectMocks(t, fs) projectConfig := NewProjectConfig(fs, os) - projectDirPath, err := projectConfig.GetProjectDirPath() + projectDirPath, err := GetProjectDirPath(fs, os) require.NoError(t, err) projectConfigFilePath := GetProjectConfigJSONFilePath(projectDirPath) @@ -462,8 +462,7 @@ func Test_ProjectConfig_GetProjectDirPath(t *testing.T) { err := fs.Remove(GetProjectHooksJSONFilePath(slackdeps.MockWorkingDirectory)) require.NoError(t, err) - projectConfig := NewProjectConfig(fs, os) - projectDirPath, err := projectConfig.GetProjectDirPath() + projectDirPath, err := GetProjectDirPath(fs, os) require.Error(t, err) require.Empty(t, projectDirPath) }) @@ -478,8 +477,7 @@ func Test_ProjectConfig_GetProjectDirPath(t *testing.T) { // Use project mocks to create project in filesystem addProjectMocks(t, fs) - projectConfig := NewProjectConfig(fs, os) - projectDirPath, err := projectConfig.GetProjectDirPath() + projectDirPath, err := GetProjectDirPath(fs, os) require.NoError(t, err) require.Equal(t, slackdeps.MockWorkingDirectory, projectDirPath) // MockWorkingDirectory is the test's project directory }) @@ -796,6 +794,6 @@ func addProjectMocks(t require.TestingT, fs afero.Fs) { require.NoError(t, err) // Fixture: project/.slack/hooks.json file - err = afero.WriteFile(fs, GetProjectHooksJSONFilePath(slackdeps.MockWorkingDirectory), []byte("{}\n"), 0600) + err = afero.WriteFile(fs, GetProjectHooksJSONFilePath(slackdeps.MockWorkingDirectory), []byte("{}\n"), 0644) require.NoError(t, err) } diff --git a/internal/slackdeps/os_mock.go b/internal/slackdeps/os_mock.go index 04d91a18..bc93c55f 100644 --- a/internal/slackdeps/os_mock.go +++ b/internal/slackdeps/os_mock.go @@ -25,7 +25,7 @@ import ( const MockHomeDirectory = "/Users/user.name" // MockWorkingDirectory is the default returned by Getwd(). -const MockWorkingDirectory = "/Users/user.name/app" +const MockWorkingDirectory = "/Users/user.name/project" // MockCustomConfigDirectory is a custom config directory for ConfigDirFlag const MockCustomConfigDirectory = "/tmp/tmp.user.name.123" @@ -50,6 +50,7 @@ func (m *OsMock) AddDefaultMocks() { m.On("UserHomeDir").Return(MockHomeDirectory, nil) m.On("GetExecutionDir").Return(MockHomeDirectory, nil) m.On("SetExecutionDir", mock.Anything) + m.On("IsNotExist", nil).Return(false) m.On("IsNotExist", mock.Anything).Return(true) m.On("Exit", mock.Anything).Return() m.On("Stat", mock.Anything).Return()