Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions internal/session/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,13 @@ const (
var (
sessionDir string
legacySessionDir string
sessionFile string
currentProvider = ProviderFrisco
)

func init() {
home, _ := os.UserHomeDir()
sessionDir = filepath.Join(home, ".martmart-cli")
legacySessionDir = filepath.Join(home, ".frisco-cli")
sessionFile = filepath.Join(sessionDir, "frisco-session.json")
}

// Session is persisted per provider in ~/.martmart-cli/.
Expand Down Expand Up @@ -122,9 +120,6 @@ func SessionFilePath(provider string) string {
case ProviderDelio:
return filepath.Join(sessionDir, "delio-session.json")
default:
if strings.TrimSpace(sessionFile) != "" {
return sessionFile
}
return filepath.Join(sessionDir, "frisco-session.json")
}
}
Expand Down
133 changes: 121 additions & 12 deletions internal/session/session_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -852,21 +852,31 @@ func TestRequireUserID_ErrorWhenMissing(t *testing.T) {
// Load / Save / EnsureDir
// ============================================================================

// setTempSession overrides the package-level sessionDir and sessionFile to
// point at a temporary directory for the duration of the test, then restores
// the original values via t.Cleanup.
// setTempSession overrides the package-level sessionDir to point at a
// temporary directory for the duration of the test, then restores the
// original values via t.Cleanup.
func setTempSession(t *testing.T, dir string) {
t.Helper()
origDir := sessionDir
origLegacyDir := legacySessionDir
origFile := sessionFile
sessionDir = dir
legacySessionDir = ""
sessionFile = filepath.Join(dir, "frisco-session.json")
t.Cleanup(func() {
sessionDir = origDir
legacySessionDir = origLegacyDir
sessionFile = origFile
})
}

// setTempProvider overrides the package-level currentProvider for the
// duration of the test, then restores the original value via t.Cleanup.
func setTempProvider(t *testing.T, provider string) {
t.Helper()
orig := currentProvider
if err := SetCurrentProvider(provider); err != nil {
t.Fatalf("SetCurrentProvider(%q): %v", provider, err)
}
t.Cleanup(func() {
currentProvider = orig
})
}

Expand Down Expand Up @@ -932,7 +942,7 @@ func TestLoad_InvalidJSON(t *testing.T) {
dir := t.TempDir()
setTempSession(t, dir)

if err := os.WriteFile(sessionFile, []byte("{not valid json"), 0o600); err != nil {
if err := os.WriteFile(SessionFilePath(ProviderFrisco), []byte("{not valid json"), 0o600); err != nil {
t.Fatalf("writing bad JSON: %v", err)
}

Expand All @@ -959,8 +969,9 @@ func TestSave_CreatesDir(t *testing.T) {
if _, err := os.Stat(newDir); os.IsNotExist(err) {
t.Errorf("Save should have created directory %q", newDir)
}
if _, err := os.Stat(sessionFile); os.IsNotExist(err) {
t.Errorf("Save should have written session file %q", sessionFile)
friscoFile := SessionFilePath(ProviderFrisco)
if _, err := os.Stat(friscoFile); os.IsNotExist(err) {
t.Errorf("Save should have written session file %q", friscoFile)
}
}

Expand Down Expand Up @@ -1015,14 +1026,11 @@ func TestLoadProvider_FallsBackToLegacyDir(t *testing.T) {

origDir := sessionDir
origLegacyDir := legacySessionDir
origFile := sessionFile
sessionDir = newDir
legacySessionDir = legacyDir
sessionFile = filepath.Join(newDir, "frisco-session.json")
t.Cleanup(func() {
sessionDir = origDir
legacySessionDir = origLegacyDir
sessionFile = origFile
})

if err := os.MkdirAll(legacyDir, 0o700); err != nil {
Expand All @@ -1044,3 +1052,104 @@ func TestLoadProvider_FallsBackToLegacyDir(t *testing.T) {
t.Fatalf("UserIDString: got %q, want 42", UserIDString(s))
}
}

func TestSaveProvider_WritesToProviderSpecificFile(t *testing.T) {
dir := t.TempDir()
setTempSession(t, dir)
setTempProvider(t, ProviderDelio)

s := &Session{
BaseURL: DefaultDelioBaseURL,
Token: "tok_delio",
UserID: "99",
Headers: map[string]string{"Cookie": "d=e"},
}
if err := Save(s); err != nil {
t.Fatalf("Save: %v", err)
}

delioFile := filepath.Join(dir, "delio-session.json")
if _, err := os.Stat(delioFile); os.IsNotExist(err) {
t.Errorf("Save should have written Delio session file %q", delioFile)
}

friscoFile := filepath.Join(dir, "frisco-session.json")
if _, err := os.Stat(friscoFile); err == nil {
t.Errorf("Save must not write Frisco session file when provider is Delio: %q exists", friscoFile)
}
}

func TestLoadProvider_ReadsFromProviderSpecificFile(t *testing.T) {
dir := t.TempDir()
setTempSession(t, dir)

friscoFile := filepath.Join(dir, "frisco-session.json")
if err := os.WriteFile(friscoFile, []byte(`{"base_url":"https://www.frisco.pl","token":"tok_frisco","user_id":"1","headers":{"Cookie":"f=1"}}`), 0o600); err != nil {
t.Fatalf("WriteFile frisco: %v", err)
}
delioFile := filepath.Join(dir, "delio-session.json")
if err := os.WriteFile(delioFile, []byte(`{"base_url":"https://delio.com.pl","token":"tok_delio","user_id":"2","headers":{"Cookie":"d=2"}}`), 0o600); err != nil {
t.Fatalf("WriteFile delio: %v", err)
}

setTempProvider(t, ProviderFrisco)
got, err := Load()
if err != nil {
t.Fatalf("Load (frisco): %v", err)
}
if TokenString(got) != "tok_frisco" {
t.Errorf("Frisco Load token: got %q, want tok_frisco", TokenString(got))
}
if UserIDString(got) != "1" {
t.Errorf("Frisco Load user_id: got %q, want 1", UserIDString(got))
}

// Now re-point currentProvider to Delio and ensure Load reads delio data.
if err := SetCurrentProvider(ProviderDelio); err != nil {
t.Fatalf("SetCurrentProvider(Delio): %v", err)
}
got, err = Load()
if err != nil {
t.Fatalf("Load (delio): %v", err)
}
if TokenString(got) != "tok_delio" {
t.Errorf("Delio Load token: got %q, want tok_delio", TokenString(got))
}
if UserIDString(got) != "2" {
t.Errorf("Delio Load user_id: got %q, want 2", UserIDString(got))
}
}

func TestLoadProvider_LegacyFallbackForDelio(t *testing.T) {
base := t.TempDir()
newDir := filepath.Join(base, "martmart-cli")
legacyDir := filepath.Join(base, "frisco-cli")

origDir := sessionDir
origLegacyDir := legacySessionDir
sessionDir = newDir
legacySessionDir = legacyDir
t.Cleanup(func() {
sessionDir = origDir
legacySessionDir = origLegacyDir
})

if err := os.MkdirAll(legacyDir, 0o700); err != nil {
t.Fatalf("MkdirAll legacy dir: %v", err)
}
legacyFile := filepath.Join(legacyDir, "delio-session.json")
if err := os.WriteFile(legacyFile, []byte(`{"base_url":"https://delio.com.pl","token":"tok_delio_legacy","user_id":"7","headers":{"Cookie":"a=b"}}`), 0o600); err != nil {
t.Fatalf("WriteFile legacy delio session: %v", err)
}

s, err := LoadProvider(ProviderDelio)
if err != nil {
t.Fatalf("LoadProvider: %v", err)
}
if TokenString(s) != "tok_delio_legacy" {
t.Fatalf("TokenString: got %q, want tok_delio_legacy", TokenString(s))
}
if UserIDString(s) != "7" {
t.Fatalf("UserIDString: got %q, want 7", UserIDString(s))
}
}
Loading