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  }