package store_test import ( "testing" "atlas9.dev/c/core" "atlas9.dev/c/core/assert" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" "atlas9.dev/c/demo/lib" "atlas9.dev/c/demo/store" ) func testOAuthStore(t *testing.T, setup func(t *testing.T) iam.OAuthStore, newUsers func(t *testing.T, n int) []core.ID) { t.Run("AddProvider and GetUserByProvider", func(t *testing.T) { s := setup(t) ctx := t.Context() user := newUsers(t, 1)[0] assert.Ok(t, s.AddProvider(ctx, user, "github", "gh-123")) var got iam.User err := s.GetUserByProvider(ctx, "github", "gh-123", &got) assert.Ok(t, err) assert.Eq(t, got.ID, user) }) t.Run("GetUserByProvider not found", func(t *testing.T) { s := setup(t) var got iam.User err := s.GetUserByProvider(t.Context(), "github", "nonexistent", &got) assert.Eq(t, err, core.ErrNotFound) }) t.Run("AddProvider idempotent", func(t *testing.T) { s := setup(t) ctx := t.Context() user := newUsers(t, 1)[0] assert.Ok(t, s.AddProvider(ctx, user, "github", "gh-456")) assert.Ok(t, s.AddProvider(ctx, user, "github", "gh-456")) var got iam.User err := s.GetUserByProvider(ctx, "github", "gh-456", &got) assert.Ok(t, err) assert.Eq(t, got.ID, user) }) t.Run("Different providers are independent", func(t *testing.T) { s := setup(t) ctx := t.Context() users := newUsers(t, 2) assert.Ok(t, s.AddProvider(ctx, users[0], "github", "same-id")) assert.Ok(t, s.AddProvider(ctx, users[1], "google", "same-id")) var gh iam.User err := s.GetUserByProvider(ctx, "github", "same-id", &gh) assert.Ok(t, err) assert.Eq(t, gh.ID, users[0]) var gg iam.User err = s.GetUserByProvider(ctx, "google", "same-id", &gg) assert.Ok(t, err) assert.Eq(t, gg.ID, users[1]) }) } func TestSqliteOAuthStore(t *testing.T) { db := setupTestDB(t) tx, err := db.Begin() assert.Ok(t, err) t.Cleanup(func() { tx.Rollback() }) w := dbi.WrapTx(tx) guard := lib.ContextAccessGuard{} ctx := lib.PutAccess(t.Context(), lib.AdminAccess()) userStore := store.NewSqliteUserStore(w, guard) newUsers := func(t *testing.T, n int) []core.ID { t.Helper() ids := generateIDs(n) for _, id := range ids { err := userStore.Save(ctx, &iam.User{ID: id, Email: id.String() + "@test.com"}) assert.Ok(t, err) } return ids } testOAuthStore(t, func(t *testing.T) iam.OAuthStore { return store.NewSqliteOAuthStore(w) }, newUsers, ) }