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" ) func testPasswordStore(t *testing.T, ctx context.Context, setup func(t *testing.T) iam.PasswordStore, newUsers func(t *testing.T, n int) []core.ID) { t.Run("SetHash and GetHash", func(t *testing.T) { s := setup(t) user := newUsers(t, 1)[0] assert.Ok(t, s.SetHash(ctx, user, iam.NewPasswordHash("hashed-password"))) got, err := s.GetHash(ctx, user) assert.Ok(t, err) assert.Eq(t, got, iam.NewPasswordHash("hashed-password")) }) t.Run("SetHash upserts", func(t *testing.T) { s := setup(t) user := newUsers(t, 1)[0] assert.Ok(t, s.SetHash(ctx, user, iam.NewPasswordHash("old-hash"))) assert.Ok(t, s.SetHash(ctx, user, iam.NewPasswordHash("new-hash"))) got, err := s.GetHash(ctx, user) assert.Ok(t, err) assert.Eq(t, got, iam.NewPasswordHash("new-hash")) }) t.Run("GetHash not found", func(t *testing.T) { s := setup(t) _, err := s.GetHash(ctx, core.NewID("t")) assert.Eq(t, err, core.ErrNotFound) }) } func TestSqlitePasswordStore(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 } testPasswordStore(t, ctx, func(t *testing.T) iam.PasswordStore { return store.NewSqlitePasswordHashStore(w, guard) }, newUsers, ) }