feat: migrate IM identity and snowflake primary keys
This commit is contained in:
@@ -117,6 +117,89 @@ func TestHTTPInfrastructureTablesCreated(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserIdentitySchema(t *testing.T) {
|
||||
var count int
|
||||
if err := db.Get(&count, `SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='im_users' AND column_name='phone'`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if count != 1 {
|
||||
t.Fatal("im_users.phone is missing")
|
||||
}
|
||||
if err := db.Get(&count, `SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='im_user_profiles' AND column_name='email'`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if count != 1 {
|
||||
t.Fatal("im_user_profiles.email is missing")
|
||||
}
|
||||
if err := db.Get(&count, `SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='im_users' AND column_name='tags'`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if count != 0 {
|
||||
t.Fatal("legacy im_users.tags still exists")
|
||||
}
|
||||
if err := db.Get(&count, `SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema=DATABASE() AND table_name='im_usertags'`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if count != 0 {
|
||||
t.Fatal("legacy im_usertags still exists")
|
||||
}
|
||||
if err := db.Get(&count, `SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema=DATABASE() AND table_name='im_topictags'`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if count != 1 {
|
||||
t.Fatal("topic tag table must be retained")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllIMTablesUseIDPrimaryKey(t *testing.T) {
|
||||
var tables []string
|
||||
if err := db.Select(&tables, `SELECT t.table_name
|
||||
FROM information_schema.tables AS t
|
||||
WHERE t.table_schema=DATABASE() AND t.table_type='BASE TABLE' AND t.table_name LIKE 'im\_%'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns AS c
|
||||
WHERE c.table_schema=t.table_schema AND c.table_name=t.table_name AND c.column_name='id'
|
||||
)
|
||||
ORDER BY t.table_name`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(tables) != 0 {
|
||||
t.Fatalf("IM tables without id column: %v", tables)
|
||||
}
|
||||
|
||||
tables = nil
|
||||
if err := db.Select(&tables, `SELECT s.table_name
|
||||
FROM information_schema.statistics AS s
|
||||
WHERE s.table_schema=DATABASE() AND s.index_name='PRIMARY'
|
||||
GROUP BY s.table_name
|
||||
HAVING GROUP_CONCAT(s.column_name ORDER BY s.seq_in_index) <> 'id'
|
||||
ORDER BY s.table_name`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(tables) != 0 {
|
||||
t.Fatalf("IM tables whose primary key is not id: %v", tables)
|
||||
}
|
||||
|
||||
targets := make([]string, 0, 11)
|
||||
if err := db.Select(&targets, `SELECT table_name
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND column_name='id' AND extra LIKE '%auto_increment%'
|
||||
AND table_name IN ('im_user_security','im_kvmeta','im_user_profiles','im_user_privacy_settings',
|
||||
'im_device_push_tokens','im_friendships','im_user_blocks','im_youth_mode_settings',
|
||||
'im_group_settings','im_group_announcement_reads','im_group_mutes')
|
||||
ORDER BY table_name`); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(targets) != 0 {
|
||||
t.Fatalf("snowflake primary keys unexpectedly use AUTO_INCREMENT: %v", targets)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTenantAuthIsolation(t *testing.T) {
|
||||
tenantAdp, ok := adp.(adapter.TenantAuthAdapter)
|
||||
if !ok {
|
||||
@@ -192,8 +275,8 @@ func TestTenantAuthIsolation(t *testing.T) {
|
||||
userBID := userAID + 1
|
||||
for index, userID := range []int64{userAID, userBID} {
|
||||
tenantDB := quoteIdent(dbNames[index])
|
||||
if _, err := db.Exec("INSERT INTO "+tenantDB+".im_users(id,createdat,updatedat,state,access,public,trusted,tags) "+
|
||||
"VALUES(?,?,?,?,?,?,?,?)", userID, now, now, types.StateOK, `{}`, nil, nil, nil); err != nil {
|
||||
if _, err := db.Exec("INSERT INTO "+tenantDB+".im_users(id,createdat,updatedat,state,access,phone,public,trusted) "+
|
||||
"VALUES(?,?,?,?,?,?,?,?)", userID, now, now, types.StateOK, `{}`, "13800000000", nil, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := db.Exec("INSERT INTO "+tenantDB+".im_auth(uname,userid,scheme,authlvl,secret) VALUES(?,?,?,?,?)",
|
||||
@@ -740,8 +823,8 @@ func TestFind(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if len(got) != 3 {
|
||||
t.Error(mismatchErrorString("result length", len(got), 3))
|
||||
if len(got) != 1 {
|
||||
t.Error(mismatchErrorString("topic-only result length", len(got), 1))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -811,54 +894,13 @@ func TestUserUpdate(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUserUpdateTags(t *testing.T) {
|
||||
addTags := testData.Tags[0]
|
||||
removeTags := testData.Tags[1]
|
||||
resetTags := testData.Tags[2]
|
||||
uid := types.ParseUserId("usr" + testData.Users[0].Id)
|
||||
|
||||
got, err := adp.UserUpdateTags(uid, addTags, nil, nil)
|
||||
got, err := adp.UserUpdateTags(uid, []string{"legacy"}, nil, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want := []string{"alice", "tag1"}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Error(mismatchErrorString("Tags", got, want))
|
||||
|
||||
}
|
||||
got, err = adp.UserUpdateTags(uid, nil, removeTags, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want = nil
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Error(mismatchErrorString("Tags", got, want))
|
||||
|
||||
}
|
||||
got, err = adp.UserUpdateTags(uid, nil, nil, resetTags)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want = []string{"alice", "tag111", "tag333"}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Error(mismatchErrorString("Tags", got, want))
|
||||
|
||||
}
|
||||
got, err = adp.UserUpdateTags(uid, addTags, removeTags, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want = []string{"tag111", "tag333"}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Error(mismatchErrorString("Tags", got, want))
|
||||
|
||||
}
|
||||
got, err = adp.UserUpdateTags(uid, addTags, removeTags, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want = []string{"tag111", "tag333"}
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Error(mismatchErrorString("Tags", got, want))
|
||||
if got != nil {
|
||||
t.Fatalf("user tags must stay disabled, got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1505,6 +1547,11 @@ func init() {
|
||||
if adp.IsOpen() {
|
||||
log.Print("Connection is already opened")
|
||||
}
|
||||
testData = test_data.InitTestData()
|
||||
if testData == nil {
|
||||
log.Fatal("Failed to initialize test data")
|
||||
}
|
||||
store.SetTestUidGenerator(*testData.UGen)
|
||||
|
||||
err := adp.Open(config.Adapters[adp.GetName()])
|
||||
if err != nil {
|
||||
@@ -1512,9 +1559,4 @@ func init() {
|
||||
}
|
||||
|
||||
db = adp.GetTestDB().(*sqlx.DB)
|
||||
testData = test_data.InitTestData()
|
||||
if testData == nil {
|
||||
log.Fatal("Failed to initialize test data")
|
||||
}
|
||||
store.SetTestUidGenerator(*testData.UGen)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user