From cd2258e2679de4a32c03a4727425b6a8a8bf5f6b Mon Sep 17 00:00:00 2001 From: Micheal Wilkinson Date: Fri, 20 Mar 2026 18:04:27 +0000 Subject: [PATCH] test(rc): add failing --force parity coverage --- internal/homesick/cli/cli_test.go | 22 ++++++++++++++++++++++ internal/homesick/core/rc_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/internal/homesick/cli/cli_test.go b/internal/homesick/cli/cli_test.go index 43434ec..e2fa185 100644 --- a/internal/homesick/cli/cli_test.go +++ b/internal/homesick/cli/cli_test.go @@ -86,6 +86,28 @@ func (s *CLISuite) TestRun_PullAll_NoCastlesIsNoop() { require.Empty(s.T(), s.stderr.String()) } +func (s *CLISuite) TestRun_Rc_HomesickrcRequiresForce() { + castleRoot := filepath.Join(s.homeDir, ".homesick", "repos", "dotfiles") + require.NoError(s.T(), os.MkdirAll(castleRoot, 0o755)) + require.NoError(s.T(), os.WriteFile(filepath.Join(castleRoot, ".homesickrc"), []byte("# ruby\n"), 0o644)) + + exitCode := cli.Run([]string{"rc", "dotfiles"}, s.stdout, s.stderr) + + require.NotEqual(s.T(), 0, exitCode) + require.Contains(s.T(), s.stderr.String(), "--force") +} + +func (s *CLISuite) TestRun_Rc_WithForceRuns() { + castleRoot := filepath.Join(s.homeDir, ".homesick", "repos", "dotfiles") + require.NoError(s.T(), os.MkdirAll(castleRoot, 0o755)) + require.NoError(s.T(), os.WriteFile(filepath.Join(castleRoot, ".homesickrc"), []byte("# ruby\n"), 0o644)) + + exitCode := cli.Run([]string{"rc", "--force", "dotfiles"}, s.stdout, s.stderr) + + require.Equal(s.T(), 0, exitCode) + require.Empty(s.T(), s.stderr.String()) +} + func (s *CLISuite) TestRun_CloneSubcommandHelp() { exitCode := cli.Run([]string{"clone", "--help"}, s.stdout, s.stderr) diff --git a/internal/homesick/core/rc_test.go b/internal/homesick/core/rc_test.go index b9db070..7361024 100644 --- a/internal/homesick/core/rc_test.go +++ b/internal/homesick/core/rc_test.go @@ -64,6 +64,31 @@ func (s *RcSuite) TestRc_NoScriptsAndNoHomesickrcIsNoop() { require.NoError(s.T(), s.app.Rc("dotfiles")) } +// TestRc_HomesickrcRequiresForce ensures legacy .homesickrc does not run +// unless force mode is enabled. +func (s *RcSuite) TestRc_HomesickrcRequiresForce() { + castleRoot := s.createCastle("dotfiles") + homesickRc := filepath.Join(castleRoot, ".homesickrc") + require.NoError(s.T(), os.WriteFile(homesickRc, []byte("# ruby setup code\n"), 0o644)) + + err := s.app.Rc("dotfiles") + require.Error(s.T(), err) + require.Contains(s.T(), err.Error(), "--force") + require.NoFileExists(s.T(), filepath.Join(castleRoot, ".homesick.d", "parity.rb")) +} + +// TestRc_HomesickrcRunsWithForce ensures legacy .homesickrc handling proceeds +// when force mode is enabled. +func (s *RcSuite) TestRc_HomesickrcRunsWithForce() { + castleRoot := s.createCastle("dotfiles") + homesickRc := filepath.Join(castleRoot, ".homesickrc") + require.NoError(s.T(), os.WriteFile(homesickRc, []byte("# ruby setup code\n"), 0o644)) + + s.app.Force = true + require.NoError(s.T(), s.app.Rc("dotfiles")) + require.FileExists(s.T(), filepath.Join(castleRoot, ".homesick.d", "parity.rb")) +} + // TestRc_ExecutesScriptsInSortedOrder verifies that executable scripts inside // .homesick.d are run in lexicographic (sorted) order. func (s *RcSuite) TestRc_ExecutesScriptsInSortedOrder() {