package session import ( "os" "path/filepath" "testing" ) func isolate(t *testing.T) { t.Helper() t.Setenv("XDG_CONFIG_HOME", t.TempDir()) } func TestSaveThenLoad(t *testing.T) { isolate(t) if got := Load("https://terdut.example.com"); got != "" { t.Fatalf("expected no session yet, got %q", got) } if err := Save("https://terdut.example.com", "tok"); err != nil { t.Fatalf("save: %v", err) } if got := Load("https://terdut.example.com"); got != "tok" { t.Errorf("expected tok, got %q", got) } // A trailing slash is the same server. if got := Load("https://terdut.example.com/"); got != "tok" { t.Errorf("a trailing slash should not lose the session, got %q", got) } } // A token is only ever valid for the server that issued it; offering it to a // different one would send a credential to somebody it was never meant for. func TestLoadIgnoresAnotherServersSession(t *testing.T) { isolate(t) if err := Save("https://a.example.com", "tok"); err != nil { t.Fatal(err) } if got := Load("https://b.example.com"); got != "" { t.Errorf("a session for another server must not be reused, got %q", got) } } func TestSaveIsOwnerOnly(t *testing.T) { isolate(t) if err := Save("https://a.example.com", "tok"); err != nil { t.Fatal(err) } p, _ := path() info, err := os.Stat(p) if err != nil { t.Fatal(err) } if perm := info.Mode().Perm(); perm != 0o600 { t.Errorf("the session file holds a credential and must be 0600, got %o", perm) } entries, _ := os.ReadDir(filepath.Dir(p)) for _, e := range entries { if e.Name() != "session.json" { t.Errorf("a temporary file was left behind: %s", e.Name()) } } } func TestClear(t *testing.T) { isolate(t) if err := Clear(); err != nil { t.Errorf("clearing nothing is not an error, got %v", err) } if err := Save("https://a.example.com", "tok"); err != nil { t.Fatal(err) } if err := Clear(); err != nil { t.Fatalf("clear: %v", err) } if got := Load("https://a.example.com"); got != "" { t.Errorf("expected the session gone, got %q", got) } } func TestLoadToleratesGarbage(t *testing.T) { isolate(t) p, _ := path() if err := os.MkdirAll(filepath.Dir(p), 0o700); err != nil { t.Fatal(err) } if err := os.WriteFile(p, []byte("{not json"), 0o600); err != nil { t.Fatal(err) } if got := Load("https://a.example.com"); got != "" { t.Errorf("an unreadable file means no session, got %q", got) } }