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 }