github.com/status-im/status-go@v1.1.0/protocol/communities_messenger_admin_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  
     9  	"github.com/status-im/status-go/eth-node/crypto"
    10  	"github.com/status-im/status-go/protocol/common"
    11  	"github.com/status-im/status-go/protocol/communities"
    12  	"github.com/status-im/status-go/protocol/communities/token"
    13  	"github.com/status-im/status-go/protocol/protobuf"
    14  	"github.com/status-im/status-go/services/wallet/bigint"
    15  )
    16  
    17  func TestAdminCommunityEventsSuite(t *testing.T) {
    18  	suite.Run(t, new(AdminCommunityEventsSuite))
    19  }
    20  
    21  type EventSenderCommunityEventsSuiteBase struct {
    22  	CommunitiesMessengerTestSuiteBase
    23  	owner       *Messenger
    24  	eventSender *Messenger
    25  	alice       *Messenger
    26  
    27  	additionalEventSenders []*Messenger
    28  }
    29  
    30  type AdminCommunityEventsSuite struct {
    31  	EventSenderCommunityEventsSuiteBase
    32  }
    33  
    34  func (s *EventSenderCommunityEventsSuiteBase) GetControlNode() *Messenger {
    35  	return s.owner
    36  }
    37  
    38  func (s *EventSenderCommunityEventsSuiteBase) GetEventSender() *Messenger {
    39  	return s.eventSender
    40  }
    41  
    42  func (s *EventSenderCommunityEventsSuiteBase) GetMember() *Messenger {
    43  	return s.alice
    44  }
    45  
    46  func (s *EventSenderCommunityEventsSuiteBase) GetSuite() *suite.Suite {
    47  	return &s.Suite
    48  }
    49  
    50  func (s *EventSenderCommunityEventsSuiteBase) GetCollectiblesServiceMock() *CollectiblesServiceMock {
    51  	return s.collectiblesServiceMock
    52  }
    53  
    54  func (s *EventSenderCommunityEventsSuiteBase) GetAccountsTestData() map[string][]string {
    55  	return s.accountsTestData
    56  }
    57  
    58  func (s *EventSenderCommunityEventsSuiteBase) GetAccountsPasswords() map[string]string {
    59  	return s.accountsPasswords
    60  }
    61  
    62  func (s *EventSenderCommunityEventsSuiteBase) SetupTest() {
    63  	s.CommunitiesMessengerTestSuiteBase.SetupTest()
    64  	s.mockedBalances = createMockedWalletBalance(&s.Suite)
    65  
    66  	s.owner = s.newMessenger("", []string{})
    67  	s.eventSender = s.newMessenger(accountPassword, []string{eventsSenderAccountAddress})
    68  	s.alice = s.newMessenger(accountPassword, []string{aliceAccountAddress})
    69  	_, err := s.owner.Start()
    70  	s.Require().NoError(err)
    71  	_, err = s.eventSender.Start()
    72  	s.Require().NoError(err)
    73  	_, err = s.alice.Start()
    74  	s.Require().NoError(err)
    75  }
    76  
    77  func (s *EventSenderCommunityEventsSuiteBase) newMessenger(password string, walletAddresses []string) *Messenger {
    78  	privateKey, err := crypto.GenerateKey()
    79  	s.Require().NoError(err)
    80  
    81  	communityManagerOptions := []communities.ManagerOption{
    82  		communities.WithAllowForcingCommunityMembersReevaluation(true),
    83  	}
    84  
    85  	return s.newMessengerWithConfig(testMessengerConfig{
    86  		logger:       s.logger,
    87  		privateKey:   privateKey,
    88  		extraOptions: []Option{WithCommunityManagerOptions(communityManagerOptions)},
    89  	}, password, walletAddresses)
    90  }
    91  
    92  func (s *EventSenderCommunityEventsSuiteBase) TearDownTest() {
    93  	TearDownMessenger(&s.Suite, s.owner)
    94  	TearDownMessenger(&s.Suite, s.eventSender)
    95  	TearDownMessenger(&s.Suite, s.alice)
    96  
    97  	for _, m := range s.additionalEventSenders {
    98  		TearDownMessenger(&s.Suite, m)
    99  	}
   100  	s.additionalEventSenders = nil
   101  
   102  	s.CommunitiesMessengerTestSuiteBase.TearDownTest()
   103  }
   104  
   105  func (s *EventSenderCommunityEventsSuiteBase) SetupAdditionalMessengers(messengers []*Messenger) {
   106  	for _, m := range messengers {
   107  		s.additionalEventSenders = append(s.additionalEventSenders, m)
   108  		_, err := m.Start()
   109  		s.Require().NoError(err)
   110  	}
   111  }
   112  
   113  func (s *AdminCommunityEventsSuite) TestAdminEditCommunityDescription() {
   114  	// TODO admin test: update to include edit tags, logo, banner, request to join required setting, pin setting, etc...
   115  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   116  	editCommunityDescription(s, community)
   117  }
   118  
   119  func (s *AdminCommunityEventsSuite) TestAdminCreateEditDeleteChannels() {
   120  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   121  	testCreateEditDeleteChannels(s, community)
   122  }
   123  
   124  func (s *AdminCommunityEventsSuite) TestAdminCreateEditDeleteBecomeMemberPermission() {
   125  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   126  	testCreateEditDeleteBecomeMemberPermission(s, community, protobuf.CommunityTokenPermission_BECOME_MEMBER)
   127  }
   128  
   129  func (s *AdminCommunityEventsSuite) TestAdminCannotCreateBecomeAdminPermission() {
   130  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   131  	testEventSenderCannotCreatePrivilegedCommunityPermission(s, community, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   132  }
   133  
   134  func (s *AdminCommunityEventsSuite) TestAdminCannotCreateBecomeTokenMasterPermission() {
   135  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   136  	testEventSenderCannotCreatePrivilegedCommunityPermission(s, community, protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER)
   137  }
   138  
   139  func (s *AdminCommunityEventsSuite) TestAdminCannotEditBecomeAdminPermission() {
   140  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   141  	testEventSenderCannotEditPrivilegedCommunityPermission(
   142  		s, community, protobuf.CommunityTokenPermission_BECOME_ADMIN, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   143  }
   144  
   145  func (s *AdminCommunityEventsSuite) TestAdminCannotEditBecomeTokenMasterPermission() {
   146  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   147  	testEventSenderCannotEditPrivilegedCommunityPermission(
   148  		s, community, protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   149  }
   150  
   151  func (s *AdminCommunityEventsSuite) TestAdminCannotDeleteBecomeAdminPermission() {
   152  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   153  	testEventSenderCannotDeletePrivilegedCommunityPermission(
   154  		s, community, protobuf.CommunityTokenPermission_BECOME_ADMIN, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   155  }
   156  
   157  func (s *AdminCommunityEventsSuite) TestAdminCannotDeleteBecomeTokenMasterPermission() {
   158  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   159  	testEventSenderCannotDeletePrivilegedCommunityPermission(
   160  		s, community, protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   161  }
   162  
   163  func (s *AdminCommunityEventsSuite) TestAdminAcceptMemberRequestToJoinResponseSharedWithOtherEventSenders() {
   164  	additionalAdmin := s.newMessenger("qwerty", []string{eventsSenderAccountAddress})
   165  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{additionalAdmin})
   166  
   167  	// set up additional user that will send request to join
   168  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   169  	s.SetupAdditionalMessengers([]*Messenger{user})
   170  
   171  	testAcceptMemberRequestToJoinResponseSharedWithOtherEventSenders(s, community, user, additionalAdmin)
   172  }
   173  
   174  func (s *AdminCommunityEventsSuite) TestAdminAcceptMemberRequestToJoin() {
   175  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{})
   176  
   177  	// set up additional user that will send request to join
   178  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   179  	s.SetupAdditionalMessengers([]*Messenger{user})
   180  
   181  	testAcceptMemberRequestToJoin(s, community, user)
   182  }
   183  
   184  func (s *AdminCommunityEventsSuite) TestAdminRejectMemberRequestToJoinResponseSharedWithOtherEventSenders() {
   185  	additionalAdmin := s.newMessenger("qwerty", []string{eventsSenderAccountAddress})
   186  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{additionalAdmin})
   187  	// set up additional user that will send request to join
   188  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   189  	s.SetupAdditionalMessengers([]*Messenger{user})
   190  
   191  	testRejectMemberRequestToJoinResponseSharedWithOtherEventSenders(s, community, user, additionalAdmin)
   192  }
   193  
   194  func (s *AdminCommunityEventsSuite) TestAdminRejectMemberRequestToJoin() {
   195  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{})
   196  
   197  	// set up additional user that will send request to join
   198  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   199  	s.SetupAdditionalMessengers([]*Messenger{user})
   200  
   201  	testRejectMemberRequestToJoin(s, community, user)
   202  }
   203  
   204  func (s *AdminCommunityEventsSuite) TestAdminControlNodeHandlesMultipleEventSenderRequestToJoinDecisions() {
   205  	s.T().Skip("flaky test")
   206  
   207  	additionalAdmin := s.newMessenger("qwerty", []string{eventsSenderAccountAddress})
   208  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{additionalAdmin})
   209  
   210  	// set up additional user that will send request to join
   211  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   212  	testControlNodeHandlesMultipleEventSenderRequestToJoinDecisions(s, community, user, additionalAdmin)
   213  }
   214  
   215  func (s *AdminCommunityEventsSuite) TestAdminCreateEditDeleteCategories() {
   216  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   217  	testCreateEditDeleteCategories(s, community)
   218  }
   219  
   220  func (s *AdminCommunityEventsSuite) TestAdminReorderChannelsAndCategories() {
   221  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   222  	testReorderChannelsAndCategories(s, community)
   223  }
   224  
   225  func (s *AdminCommunityEventsSuite) TestAdminKickAdmin() {
   226  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   227  	testEventSenderKickTheSameRole(s, community)
   228  }
   229  
   230  func (s *AdminCommunityEventsSuite) TestOwnerKickControlNode() {
   231  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   232  	testEventSenderKickControlNode(s, community)
   233  }
   234  
   235  func (s *AdminCommunityEventsSuite) TestAdminKickMember() {
   236  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   237  	kickMember(s, community.ID(), common.PubkeyToHex(&s.alice.identity.PublicKey))
   238  }
   239  
   240  func (s *AdminCommunityEventsSuite) TestAdminBanAdmin() {
   241  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   242  	testOwnerBanTheSameRole(s, community)
   243  }
   244  
   245  func (s *AdminCommunityEventsSuite) TestAdminBanControlNode() {
   246  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   247  	testOwnerBanControlNode(s, community)
   248  }
   249  
   250  func (s *AdminCommunityEventsSuite) TestAdminBanUnbanMember() {
   251  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   252  	testBanUnbanMember(s, community)
   253  }
   254  
   255  func (s *AdminCommunityEventsSuite) TestAdminDeleteAnyMessageInTheCommunity() {
   256  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   257  	testDeleteAnyMessageInTheCommunity(s, community)
   258  }
   259  
   260  func (s *AdminCommunityEventsSuite) TestAdminPinMessage() {
   261  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   262  	testEventSenderPinMessage(s, community)
   263  }
   264  
   265  func (s *AdminCommunityEventsSuite) TestAdminAddCommunityToken() {
   266  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   267  
   268  	tokenERC721 := &token.CommunityToken{
   269  		CommunityID:        community.IDString(),
   270  		TokenType:          protobuf.CommunityTokenType_ERC721,
   271  		Address:            "0x123",
   272  		Name:               "StatusToken",
   273  		Symbol:             "STT",
   274  		Description:        "desc",
   275  		Supply:             &bigint.BigInt{Int: big.NewInt(123)},
   276  		InfiniteSupply:     false,
   277  		Transferable:       true,
   278  		RemoteSelfDestruct: true,
   279  		ChainID:            1,
   280  		DeployState:        token.Deployed,
   281  		Base64Image:        "ABCD",
   282  	}
   283  
   284  	_, err := s.eventSender.SaveCommunityToken(tokenERC721, nil)
   285  	s.Require().NoError(err)
   286  
   287  	err = s.eventSender.AddCommunityToken(tokenERC721.CommunityID, tokenERC721.ChainID, tokenERC721.Address)
   288  	s.Require().Error(err)
   289  }
   290  
   291  func (s *AdminCommunityEventsSuite) TestAdminAddTokenMasterAndOwnerToken() {
   292  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   293  	testEventSenderAddTokenMasterAndOwnerToken(s, community)
   294  }
   295  
   296  func (s *AdminCommunityEventsSuite) TestAdminReceiveOwnerTokenFromControlNode() {
   297  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   298  	testAddAndSyncOwnerTokenFromControlNode(s, community, token.OwnerLevel)
   299  }
   300  
   301  func (s *AdminCommunityEventsSuite) TestAdminReceiveTokenMasterTokenFromControlNode() {
   302  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   303  	testAddAndSyncTokenFromControlNode(s, community, token.MasterLevel)
   304  }
   305  
   306  func (s *AdminCommunityEventsSuite) TestAdminReceiveCommunityTokenFromControlNode() {
   307  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   308  	testAddAndSyncTokenFromControlNode(s, community, token.CommunityLevel)
   309  }
   310  
   311  func (s *AdminCommunityEventsSuite) TestMemberReceiveOwnerEventsWhenControlNodeOffline() {
   312  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   313  	testMemberReceiveEventsWhenControlNodeOffline(s, community)
   314  }
   315  
   316  func (s *AdminCommunityEventsSuite) TestJoinedAdminReceiveRequestsToJoinWithoutRevealedAccounts() {
   317  	// event sender will receive privileged role during permission creation
   318  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_NONE, []*Messenger{})
   319  
   320  	// set up additional user (bob) that will send request to join
   321  	bob := s.newMessenger(accountPassword, []string{bobAccountAddress})
   322  
   323  	// set up additional user that will join to the community as TokenMaster
   324  	newPrivilegedUser := s.newMessenger(accountPassword, []string{eventsSenderAccountAddress})
   325  
   326  	s.SetupAdditionalMessengers([]*Messenger{bob, newPrivilegedUser})
   327  
   328  	testJoinedPrivilegedMemberReceiveRequestsToJoin(s, community, bob, newPrivilegedUser, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   329  }
   330  
   331  func (s *AdminCommunityEventsSuite) TestReceiveRequestsToJoinWithRevealedAccountsAfterGettingAdminRole() {
   332  	// set up additional user (bob) that will send request to join
   333  	bob := s.newMessenger(accountPassword, []string{bobAccountAddress})
   334  	s.SetupAdditionalMessengers([]*Messenger{bob})
   335  	testMemberReceiveRequestsToJoinAfterGettingNewRole(s, bob, protobuf.CommunityTokenPermission_BECOME_ADMIN)
   336  }
   337  
   338  func (s *AdminCommunityEventsSuite) TestAdminAcceptsRequestToJoinAfterMemberLeave() {
   339  	community := setUpOnRequestCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN, []*Messenger{})
   340  
   341  	// set up additional user that will send request to join
   342  	user := s.newMessenger("somePassword", []string{"0x0123400000000000000000000000000000000000"})
   343  	s.SetupAdditionalMessengers([]*Messenger{user})
   344  	testPrivilegedMemberAcceptsRequestToJoinAfterMemberLeave(s, community, user)
   345  }
   346  
   347  func (s *AdminCommunityEventsSuite) TestAdminBanMemberWithDeletingAllMessages() {
   348  	community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
   349  	testBanMemberWithDeletingAllMessages(s, community)
   350  }