Files
OpenFlare/backend/plugins/domain/user/users_by_ids_test.go
T

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")
}