From f443e96f9e1bc76f14b37ed5a793f82b2e581aed Mon Sep 17 00:00:00 2001 From: Micheal Wilkinson Date: Thu, 19 Mar 2026 14:19:29 +0000 Subject: [PATCH] test(core): add failing track behavior suite --- internal/homesick/core/track_test.go | 100 +++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 internal/homesick/core/track_test.go diff --git a/internal/homesick/core/track_test.go b/internal/homesick/core/track_test.go new file mode 100644 index 0000000..30b7f73 --- /dev/null +++ b/internal/homesick/core/track_test.go @@ -0,0 +1,100 @@ +package core_test + +import ( + "io" + "os" + "path/filepath" + "testing" + + "git.hrafn.xyz/aether/gosick/internal/homesick/core" + git "github.com/go-git/go-git/v5" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" +) + +type TrackSuite struct { + suite.Suite + tmpDir string + homeDir string + reposDir string + app *core.App +} + +func TestTrackSuite(t *testing.T) { + suite.Run(t, new(TrackSuite)) +} + +func (s *TrackSuite) SetupTest() { + s.tmpDir = s.T().TempDir() + s.homeDir = filepath.Join(s.tmpDir, "home") + s.reposDir = filepath.Join(s.homeDir, ".homesick", "repos") + require.NoError(s.T(), os.MkdirAll(s.reposDir, 0o755)) + + s.app = &core.App{ + HomeDir: s.homeDir, + ReposDir: s.reposDir, + Stdout: io.Discard, + Stderr: io.Discard, + } +} + +func (s *TrackSuite) createCastleRepo(castle string) string { + castleRoot := filepath.Join(s.reposDir, castle) + require.NoError(s.T(), os.MkdirAll(filepath.Join(castleRoot, "home"), 0o755)) + _, err := git.PlainInit(castleRoot, false) + require.NoError(s.T(), err) + return castleRoot +} + +func (s *TrackSuite) writeFile(path string, content string) { + require.NoError(s.T(), os.MkdirAll(filepath.Dir(path), 0o755)) + require.NoError(s.T(), os.WriteFile(path, []byte(content), 0o644)) +} + +func (s *TrackSuite) TestTrack_AfterRelinkTracksFileAndUpdatesSubdir() { + castleRoot := s.createCastleRepo("parity-castle") + castleHome := filepath.Join(castleRoot, "home") + + s.writeFile(filepath.Join(castleHome, ".vimrc"), "set number\n") + s.writeFile(filepath.Join(castleRoot, ".homesick_subdir"), ".config\n") + s.writeFile(filepath.Join(castleHome, ".config", "myapp", "config.toml"), "ok=true\n") + + require.NoError(s.T(), s.app.Link("parity-castle")) + require.NoError(s.T(), s.app.Unlink("parity-castle")) + require.NoError(s.T(), s.app.Link("parity-castle")) + + toolPath := filepath.Join(s.homeDir, ".local", "bin", "tool") + s.writeFile(toolPath, "#!/usr/bin/env bash\n") + + require.NoError(s.T(), s.app.Track(toolPath, "parity-castle")) + + expectedTarget := filepath.Join(castleHome, ".local", "bin", "tool") + info, err := os.Lstat(toolPath) + require.NoError(s.T(), err) + require.True(s.T(), info.Mode()&os.ModeSymlink != 0) + + target, err := os.Readlink(toolPath) + require.NoError(s.T(), err) + require.Equal(s.T(), expectedTarget, target) + + subdirData, err := os.ReadFile(filepath.Join(castleRoot, ".homesick_subdir")) + require.NoError(s.T(), err) + require.Contains(s.T(), string(subdirData), ".local/bin\n") +} + +func (s *TrackSuite) TestTrack_DefaultCastleName() { + castleRoot := s.createCastleRepo("dotfiles") + castleHome := filepath.Join(castleRoot, "home") + + filePath := filepath.Join(s.homeDir, ".tmux.conf") + s.writeFile(filePath, "set -g mouse on\n") + + require.NoError(s.T(), s.app.Track(filePath, "")) + + expectedTarget := filepath.Join(castleHome, ".tmux.conf") + require.FileExists(s.T(), expectedTarget) + + linkTarget, err := os.Readlink(filePath) + require.NoError(s.T(), err) + require.Equal(s.T(), expectedTarget, linkTarget) +}