Something went wrong. Try again.
Go boilerplate library for building atproto apps
atproto go
Something went wrong. Try again.
Go
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195package sqlite
import ( "context" "database/sql" "testing" "time"
"github.com/bluesky-social/indigo/atproto/auth/oauth" "github.com/bluesky-social/indigo/atproto/syntax" _ "modernc.org/sqlite")
func testStore(t *testing.T) *Store { t.Helper() db, err := sql.Open("sqlite", ":memory:") if err != nil { t.Fatal(err) } s, err := New(db) if err != nil { t.Fatal(err) } t.Cleanup(func() { db.Close() }) return s}
func TestNew(t *testing.T) { s := testStore(t) if s == nil { t.Fatal("expected non-nil store") }}
func TestSessionCRUD(t *testing.T) { s := testStore(t) ctx := context.Background() did, _ := syntax.ParseDID("did:plc:test123")
sess := oauth.ClientSessionData{ AccountDID: did, SessionID: "sess-1", HostURL: "https://pds.example.com", }
// Save if err := s.SaveSession(ctx, sess); err != nil { t.Fatal(err) }
// Get got, err := s.GetSession(ctx, did, "sess-1") if err != nil { t.Fatal(err) } if got.HostURL != "https://pds.example.com" { t.Fatalf("got HostURL %q, want %q", got.HostURL, "https://pds.example.com") }
// Upsert sess.HostURL = "https://pds2.example.com" if err := s.SaveSession(ctx, sess); err != nil { t.Fatal(err) } got, _ = s.GetSession(ctx, did, "sess-1") if got.HostURL != "https://pds2.example.com" { t.Fatalf("upsert failed: got %q", got.HostURL) }
// Get non-existent _, err = s.GetSession(ctx, did, "no-such") if err == nil { t.Fatal("expected error for missing session") }
// Delete if err := s.DeleteSession(ctx, did, "sess-1"); err != nil { t.Fatal(err) } _, err = s.GetSession(ctx, did, "sess-1") if err == nil { t.Fatal("expected error after delete") }}
func TestAuthRequestCRUD(t *testing.T) { s := testStore(t) ctx := context.Background()
info := oauth.AuthRequestData{ State: "state-abc", AuthServerURL: "https://auth.example.com", PKCEVerifier: "verifier123", }
if err := s.SaveAuthRequestInfo(ctx, info); err != nil { t.Fatal(err) }
got, err := s.GetAuthRequestInfo(ctx, "state-abc") if err != nil { t.Fatal(err) } if got.PKCEVerifier != "verifier123" { t.Fatalf("got verifier %q", got.PKCEVerifier) }
_, err = s.GetAuthRequestInfo(ctx, "no-such") if err == nil { t.Fatal("expected error for missing auth request") }
if err := s.DeleteAuthRequestInfo(ctx, "state-abc"); err != nil { t.Fatal(err) } _, err = s.GetAuthRequestInfo(ctx, "state-abc") if err == nil { t.Fatal("expected error after delete") }}
func TestCleanupExpiredRequests(t *testing.T) { s := testStore(t) ctx := context.Background()
// Fresh row via the normal API (created_at = CURRENT_TIMESTAMP). fresh := oauth.AuthRequestData{State: "fresh"} if err := s.SaveAuthRequestInfo(ctx, fresh); err != nil { t.Fatal(err) }
// Backdated row inserted directly so it predates the cutoff. _, err := s.db.ExecContext(ctx, `INSERT INTO oauth_auth_requests (state, data, created_at) VALUES (?, ?, datetime('now', '-1 hour'))`, "stale", `{"State":"stale"}`, ) if err != nil { t.Fatal(err) }
deleted, err := s.CleanupExpiredRequests(ctx, 10*time.Minute) if err != nil { t.Fatal(err) } if deleted != 1 { t.Fatalf("expected 1 deleted, got %d", deleted) }
if _, err := s.GetAuthRequestInfo(ctx, "stale"); err == nil { t.Fatal("expected stale auth request to be gone") } if _, err := s.GetAuthRequestInfo(ctx, "fresh"); err != nil { t.Fatalf("fresh auth request should remain: %v", err) }}
func TestCleanupExpiredSessions(t *testing.T) { s := testStore(t) ctx := context.Background() did, _ := syntax.ParseDID("did:plc:test123")
fresh := oauth.ClientSessionData{ AccountDID: did, SessionID: "fresh", HostURL: "https://pds.example.com", } if err := s.SaveSession(ctx, fresh); err != nil { t.Fatal(err) }
// Backdated row. _, err := s.db.ExecContext(ctx, ` INSERT INTO oauth_sessions (did, session_id, data, updated_at) VALUES (?, ?, ?, datetime('now', '-100 days')) `, did.String(), "stale", `{"AccountDID":"did:plc:test123","SessionID":"stale"}`) if err != nil { t.Fatal(err) }
deleted, err := s.CleanupExpiredSessions(ctx, 90*24*time.Hour) if err != nil { t.Fatal(err) } if deleted != 1 { t.Fatalf("expected 1 deleted, got %d", deleted) }
if _, err := s.GetSession(ctx, did, "stale"); err == nil { t.Fatal("expected stale session to be gone") } if _, err := s.GetSession(ctx, did, "fresh"); err != nil { t.Fatalf("fresh session should remain: %v", err) }}