func TestUserStoreGetProfiles(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = u1.TeamId u2.Email = model.NewId() Must(store.User().Save(&u2)) if r1 := <-store.User().GetProfiles(u1.TeamId); r1.Err != nil { t.Fatal(r1.Err) } else { users := r1.Data.(map[string]*model.User) if len(users) != 2 { t.Fatal("invalid returned users") } if users[u1.Id].Id != u1.Id { t.Fatal("invalid returned user") } } if r2 := <-store.User().GetProfiles("123"); r2.Err != nil { t.Fatal(r2.Err) } else { if len(r2.Data.(map[string]*model.User)) != 0 { t.Fatal("should have returned empty map") } } }
func TestChannelStoreGet(t *testing.T) { Setup() o1 := model.Channel{} o1.TeamId = model.NewId() o1.DisplayName = "Name" o1.Name = "a" + model.NewId() + "b" o1.Type = model.CHANNEL_OPEN Must(store.Channel().Save(&o1)) if r1 := <-store.Channel().Get(o1.Id); r1.Err != nil { t.Fatal(r1.Err) } else { if r1.Data.(*model.Channel).ToJson() != o1.ToJson() { t.Fatal("invalid returned channel") } } if err := (<-store.Channel().Get("")).Err; err == nil { t.Fatal("Missing id should have failed") } u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.Nickname = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = model.NewId() u2.Email = model.NewId() u2.Nickname = model.NewId() Must(store.User().Save(&u2)) o2 := model.Channel{} o2.TeamId = model.NewId() o2.DisplayName = "Direct Name" o2.Name = "a" + model.NewId() + "b" o2.Type = model.CHANNEL_DIRECT m1 := model.ChannelMember{} m1.ChannelId = o2.Id m1.UserId = u1.Id m1.NotifyProps = model.GetDefaultChannelNotifyProps() m2 := model.ChannelMember{} m2.ChannelId = o2.Id m2.UserId = u2.Id m2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveDirectChannel(&o2, &m1, &m2)) if r2 := <-store.Channel().Get(o2.Id); r2.Err != nil { t.Fatal(r2.Err) } else { if r2.Data.(*model.Channel).ToJson() != o2.ToJson() { t.Fatal("invalid returned channel") } } }
func TestUserStoreSave(t *testing.T) { Setup() teamId := model.NewId() u1 := model.User{} u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save user", err) } Must(store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})) if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("shouldn't be able to update user from save") } u1.Id = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique email") } u1.Email = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique username") } u1.Email = strings.Repeat("0123456789", 20) u1.Username = "" if err := (<-store.User().Save(&u1)).Err; err == nil { t.Fatal("should be unique username") } for i := 0; i < 50; i++ { u1.Id = "" u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save item", err) } Must(store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})) } u1.Id = "" u1.Email = model.NewId() u1.Username = model.NewId() if err := (<-store.User().Save(&u1)).Err; err != nil { t.Fatal("couldn't save item", err) } if err := (<-store.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id})).Err; err == nil { t.Fatal("should be the limit") } }
func TestChannelDeleteMemberStore(t *testing.T) { Setup() c1 := model.Channel{} c1.TeamId = model.NewId() c1.DisplayName = "NameName" c1.Name = "a" + model.NewId() + "b" c1.Type = model.CHANNEL_OPEN c1 = *Must(store.Channel().Save(&c1)).(*model.Channel) c1t1 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t1 := c1t1.ExtraUpdateAt u1 := model.User{} u1.Email = model.NewId() u1.Nickname = model.NewId() Must(store.User().Save(&u1)) Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id})) u2 := model.User{} u2.Email = model.NewId() u2.Nickname = model.NewId() Must(store.User().Save(&u2)) Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id})) o1 := model.ChannelMember{} o1.ChannelId = c1.Id o1.UserId = u1.Id o1.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o1)) o2 := model.ChannelMember{} o2.ChannelId = c1.Id o2.UserId = u2.Id o2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o2)) c1t2 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t2 := c1t2.ExtraUpdateAt if t2 <= t1 { t.Fatal("Member update time incorrect") } count := (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64) if count != 2 { t.Fatal("should have saved 2 members") } Must(store.Channel().PermanentDeleteMembersByUser(o2.UserId)) count = (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64) if count != 1 { t.Fatal("should have removed 1 member") } }
func TestChannelStoreSaveDirectChannel(t *testing.T) { Setup() teamId := model.NewId() o1 := model.Channel{} o1.TeamId = teamId o1.DisplayName = "Name" o1.Name = "a" + model.NewId() + "b" o1.Type = model.CHANNEL_DIRECT u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.Nickname = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = model.NewId() u2.Email = model.NewId() u2.Nickname = model.NewId() Must(store.User().Save(&u2)) m1 := model.ChannelMember{} m1.ChannelId = o1.Id m1.UserId = u1.Id m1.NotifyProps = model.GetDefaultChannelNotifyProps() m2 := model.ChannelMember{} m2.ChannelId = o1.Id m2.UserId = u2.Id m2.NotifyProps = model.GetDefaultChannelNotifyProps() if err := (<-store.Channel().SaveDirectChannel(&o1, &m1, &m2)).Err; err != nil { t.Fatal("couldn't save direct channel", err) } members := (<-store.Channel().GetMembers(o1.Id)).Data.([]model.ChannelMember) if len(members) != 2 { t.Fatal("should have saved 2 members") } if err := (<-store.Channel().SaveDirectChannel(&o1, &m1, &m2)).Err; err == nil { t.Fatal("shouldn't be able to update from save") } o1.Id = "" o1.Name = "a" + model.NewId() + "b" o1.Type = model.CHANNEL_OPEN if err := (<-store.Channel().SaveDirectChannel(&o1, &m1, &m2)).Err; err == nil { t.Fatal("Should not be able to save non-direct channel") } }
func TestChannelMemberStore(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.FullName = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = model.NewId() u2.Email = model.NewId() u2.FullName = model.NewId() Must(store.User().Save(&u2)) o1 := model.ChannelMember{} o1.ChannelId = model.NewId() o1.UserId = u1.Id o1.NotifyLevel = model.CHANNEL_NOTIFY_ALL Must(store.Channel().SaveMember(&o1)) o2 := model.ChannelMember{} o2.ChannelId = o1.ChannelId o2.UserId = u2.Id o2.NotifyLevel = model.CHANNEL_NOTIFY_ALL Must(store.Channel().SaveMember(&o2)) members := (<-store.Channel().GetMembers(o1.ChannelId)).Data.([]model.ChannelMember) if len(members) != 2 { t.Fatal("should have saved 2 members") } Must(store.Channel().RemoveMember(o2.ChannelId, o2.UserId)) members = (<-store.Channel().GetMembers(o1.ChannelId)).Data.([]model.ChannelMember) if len(members) != 1 { t.Fatal("should have removed 1 member") } member := (<-store.Channel().GetMember(o1.ChannelId, o1.UserId)).Data.(model.ChannelMember) if member.ChannelId != o1.ChannelId { t.Fatal("should have go member") } extraMembers := (<-store.Channel().GetExtraMembers(o1.ChannelId, 20)).Data.([]model.ExtraMember) if len(extraMembers) != 1 { t.Fatal("should have 1 extra members") } if err := (<-store.Channel().SaveMember(&o1)).Err; err == nil { t.Fatal("Should have been a duplicate") } }
func TestUserStoreUpdateUserAndSessionActivity(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) s1 := model.Session{} s1.UserId = u1.Id s1.TeamId = u1.TeamId Must(store.Session().Save(&s1)) if err := (<-store.User().UpdateUserAndSessionActivity(u1.Id, s1.Id, 1234567890)).Err; err != nil { t.Fatal(err) } if r1 := <-store.User().Get(u1.Id); r1.Err != nil { t.Fatal(r1.Err) } else { if r1.Data.(*model.User).LastActivityAt != 1234567890 { t.Fatal("LastActivityAt not updated correctly for user") } } if r2 := <-store.Session().Get(s1.Id); r2.Err != nil { t.Fatal(r2.Err) } else { if r2.Data.(*model.Session).LastActivityAt != 1234567890 { t.Fatal("LastActivityAt not updated correctly for session") } } }
func TestUserStoreUpdateAuthData(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) service := "someservice" authData := "1" if err := (<-store.User().UpdateAuthData(u1.Id, service, authData, "")).Err; err != nil { t.Fatal(err) } if r1 := <-store.User().GetByEmail(u1.TeamId, u1.Email); r1.Err != nil { t.Fatal(r1.Err) } else { user := r1.Data.(*model.User) if user.AuthService != service { t.Fatal("AuthService was not updated correctly") } if user.AuthData != authData { t.Fatal("AuthData was not updated correctly") } if user.Password != "" { t.Fatal("Password was not cleared properly") } } }
func TestTeamStoreGetForEmail(t *testing.T) { Setup() o1 := model.Team{} o1.DisplayName = "DisplayName" o1.Name = "a" + model.NewId() + "b" o1.Email = model.NewId() + "@nowhere.com" o1.Type = model.TEAM_OPEN Must(store.Team().Save(&o1)) u1 := model.User{} u1.TeamId = o1.Id u1.Email = model.NewId() Must(store.User().Save(&u1)) if r1 := <-store.Team().GetTeamsForEmail(u1.Email); r1.Err != nil { t.Fatal(r1.Err) } else { teams := r1.Data.([]*model.Team) if teams[0].Id != o1.Id { t.Fatal("failed to lookup by email") } } if r1 := <-store.Team().GetTeamsForEmail("missing"); r1.Err != nil { t.Fatal(r1.Err) } }
func TestUserStoreDelete(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if err := (<-store.User().PermanentDelete(u1.Id)).Err; err != nil { t.Fatal(err) } }
func TestUserStoreGetSystemAdminProfiles(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = u1.TeamId u2.Email = model.NewId() Must(store.User().Save(&u2)) if r1 := <-store.User().GetSystemAdminProfiles(); r1.Err != nil { t.Fatal(r1.Err) } else { users := r1.Data.(map[string]*model.User) if len(users) <= 0 { t.Fatal("invalid returned system admin users") } } }
func TestUserStoreGetByEmail(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if err := (<-store.User().GetByEmail(u1.TeamId, u1.Email)).Err; err != nil { t.Fatal(err) } if err := (<-store.User().GetByEmail("", "")).Err; err == nil { t.Fatal("Should have failed because of missing email") } }
func TestActiveUserCount(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if result := <-store.User().GetTotalActiveUsersCount(); result.Err != nil { t.Fatal(result.Err) } else { count := result.Data.(int64) if count <= 0 { t.Fatal() } } }
func TestUserStoreUpdateMfaSecret(t *testing.T) { Setup() u1 := model.User{} u1.Email = model.NewId() Must(store.User().Save(&u1)) time.Sleep(100 * time.Millisecond) if err := (<-store.User().UpdateMfaSecret(u1.Id, "12345")).Err; err != nil { t.Fatal(err) } // should pass, no update will occur though if err := (<-store.User().UpdateMfaSecret("junk", "12345")).Err; err != nil { t.Fatal(err) } }
func TestUserStoreGetByAuthData(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.AuthData = "123" u1.AuthService = "service" Must(store.User().Save(&u1)) if err := (<-store.User().GetByAuth(u1.TeamId, u1.AuthData, u1.AuthService)).Err; err != nil { t.Fatal(err) } if err := (<-store.User().GetByAuth("", "", "")).Err; err == nil { t.Fatal("Should have failed because of missing auth data") } }
func TestCreateUserAllowedDomains(t *testing.T) { Setup() team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "*****@*****.**", Type: model.TEAM_INVITE, AllowedDomains: "spinpunch.com, @nowh.com,@hello.com"} rteam, _ := Client.CreateTeam(&team) user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "*****@*****.**", Nickname: "Corey Hulen", Password: "******"} _, err := Client.CreateUser(&user, "") if err == nil { t.Fatal("should have failed") } user.Email = "*****@*****.**" _, err = Client.CreateUser(&user, "") if err != nil { t.Fatal(err) } }
func TestUserStoreGet(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if r1 := <-store.User().Get(u1.Id); r1.Err != nil { t.Fatal(r1.Err) } else { if r1.Data.(*model.User).ToJson() != u1.ToJson() { t.Fatal("invalid returned user") } } if err := (<-store.User().Get("")).Err; err == nil { t.Fatal("Missing id should have failed") } }
func TestUserStoreUpdateFailedPasswordAttempts(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if err := (<-store.User().UpdateFailedPasswordAttempts(u1.Id, 3)).Err; err != nil { t.Fatal(err) } if r1 := <-store.User().Get(u1.Id); r1.Err != nil { t.Fatal(r1.Err) } else { if r1.Data.(*model.User).FailedAttempts != 3 { t.Fatal("LastActivityAt not updated correctly") } } }
func TestUserStoreUpdateLastPingAt(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) if err := (<-store.User().UpdateLastPingAt(u1.Id, 1234567890)).Err; err != nil { t.Fatal(err) } if r1 := <-store.User().Get(u1.Id); r1.Err != nil { t.Fatal(r1.Err) } else { if r1.Data.(*model.User).LastPingAt != 1234567890 { t.Fatal("LastPingAt not updated correctly") } } }
func TestUserStoreUpdate(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() <-store.User().Save(&u1) if err := (<-store.User().Update(&u1, false)).Err; err != nil { t.Fatal(err) } u1.Id = "missing" if err := (<-store.User().Update(&u1, false)).Err; err == nil { t.Fatal("Update should have failed because of missing key") } u1.Id = model.NewId() if err := (<-store.User().Update(&u1, false)).Err; err == nil { t.Fatal("Update should have faile because id change") } }
func TestUserStoreUpdatePassword(t *testing.T) { Setup() u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() Must(store.User().Save(&u1)) hashedPassword := model.HashPassword("newpwd") if err := (<-store.User().UpdatePassword(u1.Id, hashedPassword)).Err; err != nil { t.Fatal(err) } if r1 := <-store.User().GetByEmail(u1.TeamId, u1.Email); r1.Err != nil { t.Fatal(r1.Err) } else { user := r1.Data.(*model.User) if user.Password != hashedPassword { t.Fatal("Password was not updated correctly") } } }
func CreateUserWithHash(user *model.User, hash string, data string) (*model.User, *model.AppError) { props := model.MapFromJson(strings.NewReader(data)) if !model.ComparePassword(hash, fmt.Sprintf("%v:%v", data, utils.Cfg.EmailSettings.InviteSalt)) { return nil, model.NewLocAppError("CreateUserWithHash", "api.user.create_user.signup_link_invalid.app_error", nil, "") } if t, err := strconv.ParseInt(props["time"], 10, 64); err != nil || model.GetMillis()-t > 1000*60*60*48 { // 48 hours return nil, model.NewLocAppError("CreateUserWithHash", "api.user.create_user.signup_link_expired.app_error", nil, "") } teamId := props["id"] var team *model.Team if result := <-Srv.Store.Team().Get(teamId); result.Err != nil { return nil, result.Err } else { team = result.Data.(*model.Team) } user.Email = props["email"] user.EmailVerified = true var ruser *model.User var err *model.AppError if ruser, err = CreateUser(user); err != nil { return nil, err } if err := JoinUserToTeam(team, ruser); err != nil { return nil, err } AddDirectChannels(team.Id, ruser) return ruser, nil }
func (us SqlUserStore) Update(user *model.User, trustedUpdateData bool) StoreChannel { storeChannel := make(StoreChannel) go func() { result := StoreResult{} user.PreUpdate() if result.Err = user.IsValid(); result.Err != nil { storeChannel <- result close(storeChannel) return } if oldUserResult, err := us.GetMaster().Get(model.User{}, user.Id); err != nil { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.finding.app_error", nil, "user_id="+user.Id+", "+err.Error()) } else if oldUserResult == nil { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.find.app_error", nil, "user_id="+user.Id) } else { oldUser := oldUserResult.(*model.User) user.CreateAt = oldUser.CreateAt user.AuthData = oldUser.AuthData user.AuthService = oldUser.AuthService user.Password = oldUser.Password user.LastPasswordUpdate = oldUser.LastPasswordUpdate user.LastPictureUpdate = oldUser.LastPictureUpdate user.LastActivityAt = oldUser.LastActivityAt user.LastPingAt = oldUser.LastPingAt user.EmailVerified = oldUser.EmailVerified user.FailedAttempts = oldUser.FailedAttempts user.MfaSecret = oldUser.MfaSecret user.MfaActive = oldUser.MfaActive if !trustedUpdateData { user.Roles = oldUser.Roles user.DeleteAt = oldUser.DeleteAt } if user.IsOAuthUser() { user.Email = oldUser.Email } else if user.IsLDAPUser() && !trustedUpdateData { if user.Username != oldUser.Username || user.FirstName != oldUser.FirstName || user.LastName != oldUser.LastName || user.Email != oldUser.Email { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.can_not_change_ldap.app_error", nil, "user_id="+user.Id) storeChannel <- result close(storeChannel) return } } else if user.Email != oldUser.Email { user.EmailVerified = false } if user.Username != oldUser.Username { user.UpdateMentionKeysFromUsername(oldUser.Username) } if count, err := us.GetMaster().Update(user); err != nil { if IsUniqueConstraintError(err.Error(), []string{"Email", "users_email_key", "idx_users_email_unique"}) { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.email_taken.app_error", nil, "user_id="+user.Id+", "+err.Error()) } else if IsUniqueConstraintError(err.Error(), []string{"Username", "users_username_key", "idx_users_username_unique"}) { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.username_taken.app_error", nil, "user_id="+user.Id+", "+err.Error()) } else { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.updating.app_error", nil, "user_id="+user.Id+", "+err.Error()) } } else if count != 1 { result.Err = model.NewLocAppError("SqlUserStore.Update", "store.sql_user.update.app_error", nil, fmt.Sprintf("user_id=%v, count=%v", user.Id, count)) } else { result.Data = [2]*model.User{user, oldUser} } } storeChannel <- result close(storeChannel) }() return storeChannel }
func TestChannelMemberStore(t *testing.T) { Setup() c1 := model.Channel{} c1.TeamId = model.NewId() c1.DisplayName = "NameName" c1.Name = "a" + model.NewId() + "b" c1.Type = model.CHANNEL_OPEN c1 = *Must(store.Channel().Save(&c1)).(*model.Channel) c1t1 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t1 := c1t1.ExtraUpdateAt u1 := model.User{} u1.TeamId = model.NewId() u1.Email = model.NewId() u1.Nickname = model.NewId() Must(store.User().Save(&u1)) u2 := model.User{} u2.TeamId = model.NewId() u2.Email = model.NewId() u2.Nickname = model.NewId() Must(store.User().Save(&u2)) o1 := model.ChannelMember{} o1.ChannelId = c1.Id o1.UserId = u1.Id o1.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o1)) o2 := model.ChannelMember{} o2.ChannelId = c1.Id o2.UserId = u2.Id o2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o2)) c1t2 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t2 := c1t2.ExtraUpdateAt if t2 <= t1 { t.Fatal("Member update time incorrect") } members := (<-store.Channel().GetMembers(o1.ChannelId)).Data.([]model.ChannelMember) if len(members) != 2 { t.Fatal("should have saved 2 members") } Must(store.Channel().RemoveMember(o2.ChannelId, o2.UserId)) members = (<-store.Channel().GetMembers(o1.ChannelId)).Data.([]model.ChannelMember) if len(members) != 1 { t.Fatal("should have removed 1 member") } c1t3 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t3 := c1t3.ExtraUpdateAt if t3 <= t2 || t3 <= t1 { t.Fatal("Member update time incorrect on delete") } member := (<-store.Channel().GetMember(o1.ChannelId, o1.UserId)).Data.(model.ChannelMember) if member.ChannelId != o1.ChannelId { t.Fatal("should have go member") } extraMembers := (<-store.Channel().GetExtraMembers(o1.ChannelId, 20)).Data.([]model.ExtraMember) if len(extraMembers) != 1 { t.Fatal("should have 1 extra members") } if err := (<-store.Channel().SaveMember(&o1)).Err; err == nil { t.Fatal("Should have been a duplicate") } c1t4 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t4 := c1t4.ExtraUpdateAt if t4 != t3 { t.Fatal("Should not update time upon failure") } }
func TestChannelMemberStore(t *testing.T) { Setup() c1 := model.Channel{} c1.TeamId = model.NewId() c1.DisplayName = "NameName" c1.Name = "a" + model.NewId() + "b" c1.Type = model.CHANNEL_OPEN c1 = *Must(store.Channel().Save(&c1)).(*model.Channel) c1t1 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t1 := c1t1.ExtraUpdateAt u1 := model.User{} u1.Email = model.NewId() u1.Nickname = model.NewId() Must(store.User().Save(&u1)) Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id})) u2 := model.User{} u2.Email = model.NewId() u2.Nickname = model.NewId() Must(store.User().Save(&u2)) Must(store.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id})) o1 := model.ChannelMember{} o1.ChannelId = c1.Id o1.UserId = u1.Id o1.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o1)) o2 := model.ChannelMember{} o2.ChannelId = c1.Id o2.UserId = u2.Id o2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&o2)) c1t2 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t2 := c1t2.ExtraUpdateAt if t2 <= t1 { t.Fatal("Member update time incorrect") } count := (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64) if count != 2 { t.Fatal("should have saved 2 members") } Must(store.Channel().RemoveMember(o2.ChannelId, o2.UserId)) count = (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64) if count != 1 { t.Fatal("should have removed 1 member") } c1t3 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t3 := c1t3.ExtraUpdateAt if t3 <= t2 || t3 <= t1 { t.Fatal("Member update time incorrect on delete") } member := (<-store.Channel().GetMember(o1.ChannelId, o1.UserId)).Data.(model.ChannelMember) if member.ChannelId != o1.ChannelId { t.Fatal("should have go member") } extraMembers := (<-store.Channel().GetExtraMembers(o1.ChannelId, 20)).Data.([]model.ExtraMember) if len(extraMembers) != 1 { t.Fatal("should have 1 extra members") } if err := (<-store.Channel().SaveMember(&o1)).Err; err == nil { t.Fatal("Should have been a duplicate") } c1t4 := (<-store.Channel().Get(c1.Id)).Data.(*model.Channel) t4 := c1t4.ExtraUpdateAt if t4 != t3 { t.Fatal("Should not update time upon failure") } // rejoin the channel and make sure that an inactive user isn't returned by GetExtraMambers Must(store.Channel().SaveMember(&o2)) u2.DeleteAt = 1000 Must(store.User().Update(&u2, true)) if result := <-store.Channel().GetExtraMembers(o1.ChannelId, 20); result.Err != nil { t.Fatal(result.Err) } else if extraMembers := result.Data.([]model.ExtraMember); len(extraMembers) != 1 { t.Fatal("should have 1 extra members") } }
func TestUserUnreadCount(t *testing.T) { Setup() teamId := model.NewId() c1 := model.Channel{} c1.TeamId = teamId c1.DisplayName = "Unread Messages" c1.Name = "unread-messages" c1.Type = model.CHANNEL_OPEN c2 := model.Channel{} c2.TeamId = teamId c2.DisplayName = "Unread Direct" c2.Name = "unread-direct" c2.Type = model.CHANNEL_DIRECT u1 := model.User{} u1.Email = model.NewId() u1.Username = "******" u1.TeamId = teamId Must(store.User().Save(&u1)) u2 := model.User{} u2.Email = model.NewId() u2.Username = "******" u2.TeamId = teamId Must(store.User().Save(&u2)) if err := (<-store.Channel().Save(&c1)).Err; err != nil { t.Fatal("couldn't save item", err) } m1 := model.ChannelMember{} m1.ChannelId = c1.Id m1.UserId = u1.Id m1.NotifyProps = model.GetDefaultChannelNotifyProps() m2 := model.ChannelMember{} m2.ChannelId = c1.Id m2.UserId = u2.Id m2.NotifyProps = model.GetDefaultChannelNotifyProps() Must(store.Channel().SaveMember(&m1)) Must(store.Channel().SaveMember(&m2)) m1.ChannelId = c2.Id m2.ChannelId = c2.Id if err := (<-store.Channel().SaveDirectChannel(&c2, &m1, &m2)).Err; err != nil { t.Fatal("couldn't save direct channel", err) } p1 := model.Post{} p1.ChannelId = c1.Id p1.UserId = u1.Id p1.Message = "this is a message for @" + u2.Username // Post one message with mention to open channel Must(store.Post().Save(&p1)) Must(store.Channel().IncrementMentionCount(c1.Id, u2.Id)) // Post 2 messages without mention to direct channel p2 := model.Post{} p2.ChannelId = c2.Id p2.UserId = u1.Id p2.Message = "first message" Must(store.Post().Save(&p2)) p3 := model.Post{} p3.ChannelId = c2.Id p3.UserId = u1.Id p3.Message = "second message" Must(store.Post().Save(&p3)) badge := (<-store.User().GetUnreadCount(u2.Id)).Data.(int64) if badge != 3 { t.Fatal("should have 3 unread messages") } }
func (us SqlUserStore) Update(user *model.User, allowActiveUpdate bool) StoreChannel { storeChannel := make(StoreChannel) go func() { result := StoreResult{} user.PreUpdate() if result.Err = user.IsValid(); result.Err != nil { storeChannel <- result close(storeChannel) return } if oldUserResult, err := us.GetMaster().Get(model.User{}, user.Id); err != nil { result.Err = model.NewAppError("SqlUserStore.Update", "We encountered an error finding the account", "user_id="+user.Id+", "+err.Error()) } else if oldUserResult == nil { result.Err = model.NewAppError("SqlUserStore.Update", "We couldn't find the existing account to update", "user_id="+user.Id) } else { oldUser := oldUserResult.(*model.User) user.CreateAt = oldUser.CreateAt user.AuthData = oldUser.AuthData user.AuthService = oldUser.AuthService user.Password = oldUser.Password user.LastPasswordUpdate = oldUser.LastPasswordUpdate user.LastPictureUpdate = oldUser.LastPictureUpdate user.TeamId = oldUser.TeamId user.LastActivityAt = oldUser.LastActivityAt user.LastPingAt = oldUser.LastPingAt user.EmailVerified = oldUser.EmailVerified user.FailedAttempts = oldUser.FailedAttempts if !allowActiveUpdate { user.Roles = oldUser.Roles user.DeleteAt = oldUser.DeleteAt } if user.IsSSOUser() { user.Email = oldUser.Email } else if user.Email != oldUser.Email { user.EmailVerified = false } if user.Username != oldUser.Username { nonUsernameKeys := []string{} splitKeys := strings.Split(user.NotifyProps["mention_keys"], ",") for _, key := range splitKeys { if key != oldUser.Username && key != "@"+oldUser.Username { nonUsernameKeys = append(nonUsernameKeys, key) } } user.NotifyProps["mention_keys"] = strings.Join(nonUsernameKeys, ",") + user.Username + ",@" + user.Username } if count, err := us.GetMaster().Update(user); err != nil { if IsUniqueConstraintError(err.Error(), "Email", "users_email_teamid_key") { result.Err = model.NewAppError("SqlUserStore.Update", "This email is already taken. Please choose another.", "user_id="+user.Id+", "+err.Error()) } else if IsUniqueConstraintError(err.Error(), "Username", "users_username_teamid_key") { result.Err = model.NewAppError("SqlUserStore.Update", "This username is already taken. Please choose another.", "user_id="+user.Id+", "+err.Error()) } else { result.Err = model.NewAppError("SqlUserStore.Update", "We encountered an error updating the account", "user_id="+user.Id+", "+err.Error()) } } else if count != 1 { result.Err = model.NewAppError("SqlUserStore.Update", "We couldn't update the account", fmt.Sprintf("user_id=%v, count=%v", user.Id, count)) } else { result.Data = [2]*model.User{user, oldUser} } } storeChannel <- result close(storeChannel) }() return storeChannel }