package store_test import ( "context" "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" ) type profileTestHarness struct { Context context.Context Store *store.ProfileStore NewUsers func(t *testing.T, n int) []core.ID } func testProfileStore(t *testing.T, setup func(t *testing.T) profileTestHarness) { t.Run("Save and Get", func(t *testing.T) { h := setup(t) ctx := h.Context user := h.NewUsers(t, 1)[0] in := &store.Profile{UserID: user, Name: "Alice", Bio: "Engineer", Location: "NYC", Website: "alice.dev", PictureURL: "pic.jpg"} assert.Ok(t, h.Store.Save(ctx, in)) got, err := h.Store.Get(ctx, user) assert.Ok(t, err) assert.Eq(t, *got, *in) }) t.Run("Save upserts", func(t *testing.T) { h := setup(t) ctx := h.Context user := h.NewUsers(t, 1)[0] assert.Ok(t, h.Store.Save(ctx, &store.Profile{UserID: user, Name: "Old"})) assert.Ok(t, h.Store.Save(ctx, &store.Profile{UserID: user, Name: "New", Bio: "Updated"})) got, err := h.Store.Get(ctx, user) assert.Ok(t, err) assert.Eq(t, got.Name, "New") assert.Eq(t, got.Bio, "Updated") }) t.Run("Get not found", func(t *testing.T) { h := setup(t) _, err := h.Store.Get(h.Context, core.NewID("t")) assert.Eq(t, err, core.ErrNotFound) }) t.Run("Save: no access", func(t *testing.T) { h := setup(t) user := h.NewUsers(t, 1)[0] err := h.Store.Save(t.Context(), &store.Profile{UserID: user}) assert.Eq(t, err, iam.ErrForbidden) }) t.Run("Get: no access", func(t *testing.T) { h := setup(t) user := h.NewUsers(t, 1)[0] _, err := h.Store.Get(t.Context(), user) assert.Eq(t, err, iam.ErrForbidden) }) } func TestProfileStore(t *testing.T) { testProfileStore(t, func(t *testing.T) profileTestHarness { t.Helper() 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) return profileTestHarness{ Context: ctx, Store: store.NewProfileStore(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 }, } }) }