mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 14:06:36 +08:00
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package user_test
|
|
|
|
import (
|
|
"Wavelet/core"
|
|
"Wavelet/core/contracts"
|
|
"Wavelet/plugins/domain/user"
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/gorm"
|
|
|
|
database "Wavelet/plugins/infra/database"
|
|
)
|
|
|
|
// TestGetUsersByIDsUsesSingleQuery 回归:批量取用户必须只发一条 SQL,
|
|
// 否则调用方(如访问日志按用户补全)会按 ID 逐条打库。
|
|
func TestGetUsersByIDsUsesSingleQuery(t *testing.T) {
|
|
ctx := core.NewContext(context.Background())
|
|
ctx.Config().SetSource(core.NewMapSource(nil))
|
|
require.NoError(t, ctx.Config().Resolve())
|
|
testDB := setupTestDB(t)
|
|
require.NoError(t, database.New(database.WithDB(testDB)).Apply(ctx))
|
|
require.NoError(t, user.New().Apply(ctx))
|
|
|
|
userSvc, err := core.Inject[contracts.UserService](ctx)
|
|
require.NoError(t, err)
|
|
|
|
bg := context.Background()
|
|
ids := make([]uint64, 0, 3)
|
|
for _, name := range []string{"batch_a", "batch_b", "batch_c"} {
|
|
u, err := userSvc.CreateUser(bg, contracts.CreateUserRequest{
|
|
Username: name,
|
|
Password: "Password789!",
|
|
Email: name + "@example.com",
|
|
})
|
|
require.NoError(t, err)
|
|
ids = append(ids, u.ID)
|
|
}
|
|
|
|
queries := 0
|
|
require.NoError(t, testDB.Callback().Query().Register("count_queries", func(_ *gorm.DB) {
|
|
queries++
|
|
}))
|
|
|
|
got, err := userSvc.GetUsersByIDs(bg, ids)
|
|
require.NoError(t, err)
|
|
assert.Len(t, got, 3)
|
|
assert.Equal(t, 1, queries, "batch lookup must issue exactly one query")
|
|
|
|
queries = 0
|
|
for _, id := range ids {
|
|
_, err := userSvc.GetUserByID(bg, id)
|
|
require.NoError(t, err)
|
|
}
|
|
assert.Equal(t, 3, queries, "per-id lookups cost one query each")
|
|
|
|
queries = 0
|
|
empty, err := userSvc.GetUsersByIDs(bg, nil)
|
|
require.NoError(t, err)
|
|
assert.Empty(t, empty)
|
|
assert.Equal(t, 0, queries, "empty id list must not touch storage")
|
|
}
|