diff --git a/cmd/olliesrv/internal/session/session.go b/cmd/olliesrv/internal/session/session.go index ee195d0..8d6e7ea 100644 --- a/cmd/olliesrv/internal/session/session.go +++ b/cmd/olliesrv/internal/session/session.go @@ -100,9 +100,10 @@ func (s *Session) Cwd() string { } // SetCwd sets the session working directory. +// Tilde and environment variables in cwd are expanded before storing. func (s *Session) SetCwd(cwd string) { s.mu.Lock() - s.cwd = cwd + s.cwd = util.ExpandHome(os.ExpandEnv(cwd)) s.mu.Unlock() go s.saveSession() } diff --git a/cmd/olliesrv/internal/session/session_test.go b/cmd/olliesrv/internal/session/session_test.go new file mode 100644 index 0000000..40e8180 --- /dev/null +++ b/cmd/olliesrv/internal/session/session_test.go @@ -0,0 +1,43 @@ +package session + +import ( + "os" + "testing" +) + +func TestSetCwd_ExpandsTilde(t *testing.T) { + home, err := os.UserHomeDir() + if err != nil || home == "" { + t.Skip("cannot determine home directory") + } + + s := &Session{} + s.SetCwd("~/projects") + + want := home + "/projects" + if got := s.Cwd(); got != want { + t.Errorf("SetCwd(~/projects): got %q, want %q", got, want) + } +} + +func TestSetCwd_ExpandsEnvVars(t *testing.T) { + t.Setenv("OLLIE_TEST_DIR", "/tmp/testdir") + + s := &Session{} + s.SetCwd("$OLLIE_TEST_DIR/sub") + + want := "/tmp/testdir/sub" + if got := s.Cwd(); got != want { + t.Errorf("SetCwd($OLLIE_TEST_DIR/sub): got %q, want %q", got, want) + } +} + +func TestSetCwd_AbsolutePathUnchanged(t *testing.T) { + s := &Session{} + s.SetCwd("/usr/local/bin") + + want := "/usr/local/bin" + if got := s.Cwd(); got != want { + t.Errorf("SetCwd(/usr/local/bin): got %q, want %q", got, want) + } +}