github.com/status-im/status-go@v1.1.0/protocol/messenger_identity_display_name_test.go (about) 1 package protocol 2 3 import ( 4 "context" 5 "errors" 6 "testing" 7 8 utils "github.com/status-im/status-go/common" 9 "github.com/status-im/status-go/multiaccounts/accounts" 10 "github.com/status-im/status-go/protocol/encryption/multidevice" 11 "github.com/status-im/status-go/protocol/tt" 12 13 "github.com/stretchr/testify/suite" 14 ) 15 16 const testDisplayName = "My New Display Name" 17 18 func TestMessengerProfileDisplayNameHandlerSuite(t *testing.T) { 19 suite.Run(t, new(MessengerProfileDisplayNameHandlerSuite)) 20 } 21 22 type MessengerProfileDisplayNameHandlerSuite struct { 23 MessengerBaseTestSuite 24 } 25 26 func (s *MessengerProfileDisplayNameHandlerSuite) TestDisplayNameChange() { 27 // check display name for the created instance 28 displayName, err := s.m.settings.DisplayName() 29 s.Require().NoError(err) 30 s.Require().Equal(DefaultProfileDisplayName, displayName) 31 32 // add profile keypair 33 profileKp := accounts.GetProfileKeypairForTest(true, false, false) 34 profileKp.KeyUID = s.m.account.KeyUID 35 profileKp.Name = DefaultProfileDisplayName 36 profileKp.Accounts[0].KeyUID = s.m.account.KeyUID 37 38 err = s.m.settings.SaveOrUpdateKeypair(profileKp) 39 s.Require().NoError(err) 40 41 // check account is present in the db 42 dbProfileKp, err := s.m.settings.GetKeypairByKeyUID(profileKp.KeyUID) 43 s.Require().NoError(err) 44 s.Require().True(accounts.SameKeypairs(profileKp, dbProfileKp)) 45 46 // save account will create the account 47 err = s.m.multiAccounts.SaveAccount(*s.m.account) 48 s.Require().NoError(err) 49 // set new display name 50 err = s.m.SetDisplayName(testDisplayName) 51 s.Require().NoError(err) 52 53 // check display name after change - mutliaccount 54 multiAcc, err := s.m.multiAccounts.GetAccount(s.m.account.KeyUID) 55 s.Require().NoError(err) 56 s.Require().Equal(testDisplayName, multiAcc.Name) 57 58 // check display name after change - settings 59 displayName, err = s.m.settings.DisplayName() 60 s.Require().NoError(err) 61 s.Require().Equal(testDisplayName, displayName) 62 63 // check display name after change - keypair 64 dbProfileKp, err = s.m.settings.GetKeypairByKeyUID(profileKp.KeyUID) 65 s.Require().NoError(err) 66 s.Require().Equal(testDisplayName, dbProfileKp.Name) 67 } 68 69 func (s *MessengerProfileDisplayNameHandlerSuite) TestDisplayNameSync() { 70 // check display name for the created instance 71 displayName, err := s.m.settings.DisplayName() 72 s.Require().NoError(err) 73 s.Require().Equal(DefaultProfileDisplayName, displayName) 74 75 // add profile keypair 76 profileKp := accounts.GetProfileKeypairForTest(true, true, false) 77 profileKp.KeyUID = s.m.account.KeyUID 78 profileKp.Name = DefaultProfileDisplayName 79 profileKp.Accounts[0].KeyUID = s.m.account.KeyUID 80 profileKp.Accounts[1].KeyUID = s.m.account.KeyUID 81 82 err = s.m.settings.SaveOrUpdateKeypair(profileKp) 83 s.Require().NoError(err, "profile keypair alicesDevice.settings.SaveOrUpdateKeypair") 84 85 // check account is present in the db 86 dbProfileKp, err := s.m.settings.GetKeypairByKeyUID(profileKp.KeyUID) 87 s.Require().NoError(err) 88 s.Require().True(accounts.SameKeypairs(profileKp, dbProfileKp)) 89 90 // Create new device and add main account to 91 alicesOtherDevice, err := newMessengerWithKey(s.shh, s.m.identity, s.logger, nil) 92 s.Require().NoError(err) 93 94 // Store only chat and default wallet account on other device 95 profileKpOtherDevice := accounts.GetProfileKeypairForTest(true, true, false) 96 profileKpOtherDevice.KeyUID = s.m.account.KeyUID 97 profileKpOtherDevice.Name = DefaultProfileDisplayName 98 profileKpOtherDevice.Accounts[0].KeyUID = s.m.account.KeyUID 99 profileKpOtherDevice.Accounts[1].KeyUID = s.m.account.KeyUID 100 101 err = alicesOtherDevice.settings.SaveOrUpdateKeypair(profileKpOtherDevice) 102 s.Require().NoError(err, "profile keypair alicesOtherDevice.settings.SaveOrUpdateKeypair") 103 104 // Check account is present in the db 105 dbProfileKp2, err := alicesOtherDevice.settings.GetKeypairByKeyUID(profileKpOtherDevice.KeyUID) 106 s.Require().NoError(err) 107 s.Require().True(accounts.SameKeypairs(profileKpOtherDevice, dbProfileKp2)) 108 109 // Pair devices 110 im1 := &multidevice.InstallationMetadata{ 111 Name: "alice's-other-device", 112 DeviceType: "alice's-other-device-type", 113 } 114 err = alicesOtherDevice.SetInstallationMetadata(alicesOtherDevice.installationID, im1) 115 s.Require().NoError(err) 116 response, err := alicesOtherDevice.SendPairInstallation(context.Background(), nil) 117 s.Require().NoError(err) 118 s.Require().NotNil(response) 119 s.Require().Len(response.Chats(), 1) 120 s.Require().False(response.Chats()[0].Active) 121 122 // Wait for the message to reach its destination 123 response, err = WaitOnMessengerResponse( 124 s.m, 125 func(r *MessengerResponse) bool { return len(r.Installations()) > 0 }, 126 "installation not received", 127 ) 128 129 s.Require().NoError(err) 130 actualInstallation := response.Installations()[0] 131 s.Require().Equal(alicesOtherDevice.installationID, actualInstallation.ID) 132 s.Require().NotNil(actualInstallation.InstallationMetadata) 133 s.Require().Equal("alice's-other-device", actualInstallation.InstallationMetadata.Name) 134 s.Require().Equal("alice's-other-device-type", actualInstallation.InstallationMetadata.DeviceType) 135 136 err = s.m.EnableInstallation(alicesOtherDevice.installationID) 137 s.Require().NoError(err) 138 139 // Set new display name on alice's device 140 err = s.m.SetDisplayName(testDisplayName) 141 s.Require().NoError(err) 142 143 err = tt.RetryWithBackOff(func() error { 144 response, err := alicesOtherDevice.RetrieveAll() 145 if err != nil { 146 return err 147 } 148 149 foundKp := false 150 for _, kp := range response.Keypairs { 151 if kp.KeyUID == profileKp.KeyUID { 152 foundKp = true 153 } 154 } 155 156 foundSetting := false 157 for _, s := range response.Settings { 158 v, _ := s.Value.(string) 159 if v == testDisplayName { 160 foundSetting = true 161 } 162 } 163 164 if foundKp && foundSetting { 165 return nil 166 } 167 return errors.New("no sync data received") 168 }) 169 s.Require().NoError(err) 170 171 // check display name after change - mutliaccount 172 multiAcc, err := alicesOtherDevice.multiAccounts.GetAccount(s.m.account.KeyUID) 173 s.Require().NoError(err) 174 s.Require().Equal(testDisplayName, multiAcc.Name) 175 176 // check display name after change - settings 177 displayName, err = alicesOtherDevice.settings.DisplayName() 178 s.Require().NoError(err) 179 s.Require().Equal(testDisplayName, displayName) 180 181 // check display name after change - keypair 182 dbProfileKp, err = alicesOtherDevice.settings.GetKeypairByKeyUID(profileKp.KeyUID) 183 s.Require().NoError(err) 184 s.Require().Equal(testDisplayName, dbProfileKp.Name) 185 } 186 187 func (s *MessengerProfileDisplayNameHandlerSuite) TestDisplayNameRestrictions() { 188 // check display name for the created instance 189 displayName, err := s.m.settings.DisplayName() 190 s.Require().NoError(err) 191 s.Require().Equal(DefaultProfileDisplayName, displayName) 192 193 // add profile keypair 194 profileKp := accounts.GetProfileKeypairForTest(true, false, false) 195 profileKp.KeyUID = s.m.account.KeyUID 196 profileKp.Name = DefaultProfileDisplayName 197 profileKp.Accounts[0].KeyUID = s.m.account.KeyUID 198 199 err = s.m.settings.SaveOrUpdateKeypair(profileKp) 200 s.Require().NoError(err) 201 202 setInvalidName := func(invalidName string, expectedErr error) { 203 err = s.m.SetDisplayName(invalidName) 204 s.Require().ErrorIs(err, expectedErr) 205 } 206 207 setInvalidName("dot.not", utils.ErrInvalidDisplayNameRegExp) 208 setInvalidName("t", utils.ErrInvalidDisplayNameRegExp) 209 setInvalidName("tt", utils.ErrInvalidDisplayNameRegExp) 210 setInvalidName("ttt", utils.ErrInvalidDisplayNameRegExp) 211 setInvalidName("tttt", utils.ErrInvalidDisplayNameRegExp) 212 setInvalidName("name is bigger than 24 symb", utils.ErrInvalidDisplayNameRegExp) 213 214 err = s.m.SetDisplayName("name with space") 215 s.Require().NoError(err) 216 displayName, err = s.m.settings.DisplayName() 217 s.Require().NoError(err) 218 s.Require().Equal("name with space", displayName) 219 } 220 221 func (s *MessengerProfileDisplayNameHandlerSuite) TestUpdateImageWhenEnsNameIsSet() { 222 err := s.m.settings.SaveSetting("preferred-name", "kounkou.stateofus.eth") 223 s.Require().NoError(err) 224 225 // check display name for the created instance 226 displayName, err := s.m.settings.GetPreferredUsername() 227 s.Require().NoError(err) 228 s.Require().Equal("kounkou.stateofus.eth", displayName) 229 230 // add profile keypair 231 profileKp := accounts.GetProfileKeypairForTest(true, false, false) 232 profileKp.KeyUID = s.m.account.KeyUID 233 profileKp.Name = DefaultProfileDisplayName 234 profileKp.Accounts[0].KeyUID = s.m.account.KeyUID 235 236 err = s.m.settings.SaveOrUpdateKeypair(profileKp) 237 s.Require().NoError(err) 238 239 // check account is present in the db 240 dbProfileKp, err := s.m.settings.GetKeypairByKeyUID(profileKp.KeyUID) 241 s.Require().NoError(err) 242 s.Require().True(accounts.SameKeypairs(profileKp, dbProfileKp)) 243 244 // save account will create the account 245 err = s.m.multiAccounts.SaveAccount(*s.m.account) 246 s.Require().NoError(err) 247 248 // set new description 249 err = s.m.SetDisplayName("godfrain.stateofus.eth") 250 s.Require().NoError(err) 251 }