fix: improve IM user account search
This commit is contained in:
@@ -326,6 +326,79 @@ func TestTenantAuthIsolation(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestTenantUserSearchMatchesUsernamePhoneAndPublicAccount(t *testing.T) {
|
||||
businessAdp, ok := adp.(adapter.TenantBusinessAdapter)
|
||||
if !ok {
|
||||
t.Fatal("MySQL adapter does not implement TenantBusinessAdapter")
|
||||
}
|
||||
var tenantID types.TenantID
|
||||
if err := db.Get(&tenantID, "SELECT id FROM im_tenant WHERE code='default'"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
now := types.TimeNow()
|
||||
viewerID := now.UnixNano() & 0x3fffffffffffffff
|
||||
targetID := viewerID + 1
|
||||
viewer := store.EncodeUid(viewerID)
|
||||
target := store.EncodeUid(targetID)
|
||||
t.Cleanup(func() {
|
||||
db.Exec("DELETE FROM im_friendships WHERE user_id IN (?,?) OR peer_id IN (?,?)", viewerID, targetID, viewerID, targetID)
|
||||
db.Exec("DELETE FROM im_user_privacy_settings WHERE user_id IN (?,?)", viewerID, targetID)
|
||||
db.Exec("DELETE FROM im_user_profiles WHERE user_id IN (?,?)", viewerID, targetID)
|
||||
db.Exec("DELETE FROM im_credentials WHERE userid IN (?,?)", viewerID, targetID)
|
||||
db.Exec("DELETE FROM im_auth WHERE userid IN (?,?)", viewerID, targetID)
|
||||
db.Exec("DELETE FROM im_users WHERE id IN (?,?)", viewerID, targetID)
|
||||
})
|
||||
|
||||
for _, user := range []struct {
|
||||
id int64
|
||||
username string
|
||||
phone any
|
||||
public string
|
||||
}{
|
||||
{viewerID, "viewerx", nil, `{"fn":"Viewer"}`},
|
||||
{targetID, "potter", "+8615500000002", `{"fn":"Potter"}`},
|
||||
} {
|
||||
if _, err := db.Exec(
|
||||
`INSERT INTO im_users(id,username,createdat,updatedat,state,access,phone,public,trusted)
|
||||
VALUES(?,?,?,?,?,?,?,?,?)`,
|
||||
user.id, user.username, now, now, types.StateOK, `{"Auth":"JRWPAS","Anon":"N"}`, user.phone, user.public, `{}`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := db.Exec(
|
||||
`INSERT INTO im_user_privacy_settings(id,user_id,add_me_methods,created_at,updated_at)
|
||||
VALUES(?,?,?,?,?)`,
|
||||
user.id+1000, user.id, `{"account":true,"phone":true,"qr":true,"group":true}`, now, now); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
if _, err := db.Exec(
|
||||
`INSERT INTO im_user_profiles(id,user_id,nickname,public_account,avatar_file_id,signature,gender,region,created_at,updated_at)
|
||||
VALUES(?,?,?,?,?,?,?,?,?,?)`,
|
||||
targetID+1000, targetID, "后端-potter", "15500000002", "avatar-1", "hi", "other", "CN", now, now); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
query string
|
||||
searchType string
|
||||
}{
|
||||
{"username", "potter", "account"},
|
||||
{"public_account", "15500000002", "account"},
|
||||
{"phone_raw", "15500000002", "account"},
|
||||
{"phone_e164", "+8615500000002", "phone"},
|
||||
} {
|
||||
users, _, err := businessAdp.TenantUserSearch(tenantID, viewer, tc.query, tc.searchType, "", 20)
|
||||
if err != nil {
|
||||
t.Fatalf("%s search failed: %v", tc.name, err)
|
||||
}
|
||||
if len(users) != 1 || users[0].Uid() != target {
|
||||
t.Fatalf("%s search returned %+v, want %s", tc.name, users, target.UserId())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ================== Create tests ================================
|
||||
func TestUserCreate(t *testing.T) {
|
||||
for _, user := range testData.Users {
|
||||
|
||||
Reference in New Issue
Block a user