From 4319a581cae05e936879586f7fdf55d55b81f15c Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Tue, 6 Dec 2022 20:19:01 +0400 Subject: [PATCH] core: more test cases checking deletion of unused contacts and incognito profiles (#1513) --- tests/ChatTests.hs | 256 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 219 insertions(+), 37 deletions(-) diff --git a/tests/ChatTests.hs b/tests/ChatTests.hs index a8b2f66e90..5706e88167 100644 --- a/tests/ChatTests.hs +++ b/tests/ChatTests.hs @@ -52,6 +52,7 @@ chatTests :: Spec chatTests = do describe "direct messages" $ do describe "add contact and send/receive message" testAddContact + it "deleting contact deletes profile" testDeleteContactDeletesProfile it "direct message quoted replies" testDirectMessageQuotedReply it "direct message update" testDirectMessageUpdate it "direct message delete" testDirectMessageDelete @@ -121,6 +122,13 @@ chatTests = do it "can't see global preferences update" testCantSeeGlobalPrefsUpdateIncognito it "deleting contact first, group second deletes incognito profile" testDeleteContactThenGroupDeletesIncognitoProfile it "deleting group first, contact second deletes incognito profile" testDeleteGroupThenContactDeletesIncognitoProfile + describe "group links" $ do + it "create group link, join via group link" testGroupLink + it "delete group, re-join via same link" testGroupLinkDeleteGroupRejoin + it "sending message to contact created via group link marks it used" testGroupLinkContactUsed + it "create group link, join via group link - incognito membership" testGroupLinkIncognitoMembership + it "unused host contact is deleted after all groups with it are deleted" testGroupLinkUnusedHostContactDeleted + it "leaving groups with unused host contacts deletes incognito profiles" testGroupLinkIncognitoUnusedHostContactsDeleted describe "contact aliases" $ do it "set contact alias" testSetAlias it "set connection alias" testSetConnectionAlias @@ -157,11 +165,6 @@ chatTests = do it "mute/unmute group" testMuteGroup describe "chat item expiration" $ do it "set chat item TTL" testSetChatItemTTL - describe "group links" $ do - it "create group link, join via group link" testGroupLink - it "delete group, re-join via same link" testGroupLinkDeleteGroupRejoin - it "sending message to contact created via group link marks it used" testGroupLinkContactUsed - it "create group link, join via group link - incognito membership" testGroupLinkIncognitoMembership describe "queue rotation" $ do it "switch contact to a different queue" testSwitchContact it "switch group member to a different queue" testSwitchGroupMember @@ -265,7 +268,9 @@ testAddContact = versionTestMatrix2 runTestAddContact alice ##> "@bob_1 hey" alice <## "no contact bob_1" alice @@@ [("@bob", "how are you?")] + alice `hasContactProfiles` ["alice", "bob"] bob @@@ [("@alice_1", "hi"), ("@alice", "how are you?")] + bob `hasContactProfiles` ["alice", "alice", "bob"] -- test clearing chat alice #$> ("/clear bob", id, "bob: all messages are removed locally ONLY") alice #$> ("/_get chat @2 count=100", chat, []) @@ -297,6 +302,25 @@ testAddContact = versionTestMatrix2 runTestAddContact alice #$> ("/_read chat @2", id, "ok") bob #$> ("/_read chat @2", id, "ok") +testDeleteContactDeletesProfile :: IO () +testDeleteContactDeletesProfile = + testChat2 aliceProfile bobProfile $ + \alice bob -> do + connectUsers alice bob + alice <##> bob + -- alice deletes contact, profile is deleted + alice ##> "/d bob" + alice <## "bob: contact is deleted" + alice ##> "/cs" + (alice "/d alice" + bob <## "alice: contact is deleted" + bob ##> "/cs" + (bob "/cs" cath <## "alice (Alice)" cath <## "bob (Bob)" - -- delete group 1 - alice ##> "/d #team" - concurrentlyN_ - [ alice <## "#team: you deleted the group", - do - bob <## "#team: alice deleted the group" - bob <## "use /d #team to delete the local copy of the group", - do - cath <## "#team: alice deleted the group" - cath <## "use /d #team to delete the local copy of the group" - ] - bob ##> "/d #team" - bob <## "#team: you deleted the group" - cath ##> "/d #team" - cath <## "#team: you deleted the group" - -- contacts and profiles are kept + -- delete group 1, contacts and profiles are kept + deleteGroup alice bob cath "team" bob ##> "/cs" bob <## "alice (Alice)" bob <## "cath (Catherine)" @@ -1457,28 +1467,30 @@ testGroupDeleteUnusedContacts = cath <## "alice (Alice)" cath <## "bob (Bob)" cath `hasContactProfiles` ["alice", "bob", "cath"] - -- delete group 2 - alice ##> "/d #club" - concurrentlyN_ - [ alice <## "#club: you deleted the group", - do - bob <## "#club: alice deleted the group" - bob <## "use /d #club to delete the local copy of the group", - do - cath <## "#club: alice deleted the group" - cath <## "use /d #club to delete the local copy of the group" - ] - bob ##> "/d #club" - bob <## "#club: you deleted the group" - cath ##> "/d #club" - cath <## "#club: you deleted the group" - -- unused contacts and profiles are deleted + -- delete group 2, unused contacts and profiles are deleted + deleteGroup alice bob cath "club" bob ##> "/cs" bob <## "alice (Alice)" bob `hasContactProfiles` ["alice", "bob"] cath ##> "/cs" cath <## "alice (Alice)" cath `hasContactProfiles` ["alice", "cath"] + where + deleteGroup alice bob cath group = do + alice ##> ("/d #" <> group) + concurrentlyN_ + [ alice <## ("#" <> group <> ": you deleted the group"), + do + bob <## ("#" <> group <> ": alice deleted the group") + bob <## ("use /d #" <> group <> " to delete the local copy of the group"), + do + cath <## ("#" <> group <> ": alice deleted the group") + cath <## ("use /d #" <> group <> " to delete the local copy of the group") + ] + bob ##> ("/d #" <> group) + bob <## ("#" <> group <> ": you deleted the group") + cath ##> ("/d #" <> group) + cath <## ("#" <> group <> ": you deleted the group") testGroupAsync :: IO () testGroupAsync = withTmpFiles $ do @@ -2731,6 +2743,28 @@ testConnectIncognitoInvitationLink = testChat3 aliceProfile bobProfile cathProfi alice <## "Full deletion: off (you allow: no, contact allows: no)" bob <## (aliceIncognito <> " updated preferences for you:") bob <## "Full deletion: off (you allow: no, contact allows: no)" + -- list contacts + alice ##> "/cs" + alice + <### [ ConsoleString $ "i " <> bobIncognito, + "cath (Catherine)" + ] + alice `hasContactProfiles` ["alice", T.pack aliceIncognito, T.pack bobIncognito, "cath"] + bob ##> "/cs" + bob <## ("i " <> aliceIncognito) + bob `hasContactProfiles` ["bob", T.pack aliceIncognito, T.pack bobIncognito] + -- alice deletes contact, incognito profile is deleted + alice ##> ("/d " <> bobIncognito) + alice <## (bobIncognito <> ": contact is deleted") + alice ##> "/cs" + alice <## "cath (Catherine)" + alice `hasContactProfiles` ["alice", "cath"] + -- bob deletes contact, incognito profile is deleted + bob ##> ("/d " <> aliceIncognito) + bob <## (aliceIncognito <> ": contact is deleted") + bob ##> "/cs" + (bob who are you?" bob ?#> "@alice I'm Batman" alice <# (bobIncognito <> "> I'm Batman") + -- list contacts + bob ##> "/cs" + bob <## "i alice (Alice)" + bob `hasContactProfiles` ["alice", "bob", T.pack bobIncognito] + -- delete contact, incognito profile is deleted + bob ##> "/d alice" + bob <## "alice: contact is deleted" + bob ##> "/cs" + (bob "> my profile is totally inconspicuous") bob #> ("@" <> aliceIncognito <> " I know!") alice ?<# "bob> I know!" + -- list contacts + alice ##> "/cs" + alice <## "i bob (Bob)" + alice `hasContactProfiles` ["alice", "bob", T.pack aliceIncognito] + -- delete contact, incognito profile is deleted + alice ##> "/d bob" + alice <## "bob: contact is deleted" + alice ##> "/cs" + (alice danIncognito <> "> how is it going?") ] +testGroupLinkUnusedHostContactDeleted :: IO () +testGroupLinkUnusedHostContactDeleted = + testChat2 aliceProfile bobProfile $ + \alice bob -> do + -- create group 1 + alice ##> "/g team" + alice <## "group #team is created" + alice <## "use /a team to add members" + alice ##> "/create link #team" + gLinkTeam <- getGroupLink alice "team" True + bob ##> ("/c " <> gLinkTeam) + bob <## "connection request sent!" + alice <## "bob (Bob): accepting request to join group #team..." + concurrentlyN_ + [ do + alice <## "bob (Bob): contact is connected" + alice <## "bob invited to group #team via your group link" + alice <## "#team: bob joined the group", + do + bob <## "alice (Alice): contact is connected" + bob <## "#team: you joined the group" + ] + -- create group 2 + alice ##> "/g club" + alice <## "group #club is created" + alice <## "use /a club to add members" + alice ##> "/create link #club" + gLinkClub <- getGroupLink alice "club" True + bob ##> ("/c " <> gLinkClub) + bob <## "connection request sent!" + alice <## "bob_1 (Bob): accepting request to join group #club..." + concurrentlyN_ + [ alice + <### [ "bob_1 (Bob): contact is connected", + "contact bob_1 is merged into bob", + "use @bob to send messages", + EndsWith "invited to group #club via your group link", + EndsWith "joined the group" + ], + bob + <### [ "alice_1 (Alice): contact is connected", + "contact alice_1 is merged into alice", + "use @alice to send messages", + "#club: you joined the group" + ] + ] + -- list contacts + bob ##> "/cs" + bob <## "alice (Alice)" + -- delete group 1, host contact and profile are kept + bobLeaveDeleteGroup alice bob "team" + bob ##> "/cs" + bob <## "alice (Alice)" + bob `hasContactProfiles` ["alice", "bob"] + -- delete group 2, unused host contact and profile are deleted + bobLeaveDeleteGroup alice bob "club" + bob ##> "/cs" + (bob ("/l " <> group) + concurrentlyN_ + [ do + bob <## ("#" <> group <> ": you left the group") + bob <## ("use /d #" <> group <> " to delete the group"), + alice <## ("#" <> group <> ": bob left the group") + ] + bob ##> ("/d #" <> group) + bob <## ("#" <> group <> ": you deleted the group") + +testGroupLinkIncognitoUnusedHostContactsDeleted :: IO () +testGroupLinkIncognitoUnusedHostContactsDeleted = + testChat2 aliceProfile bobProfile $ + \alice bob -> do + bob #$> ("/incognito on", id, "ok") + bobIncognitoTeam <- createGroupBobIncognito alice bob "team" "alice" + bobIncognitoClub <- createGroupBobIncognito alice bob "club" "alice_1" + bobIncognitoTeam `shouldNotBe` bobIncognitoClub + -- list contacts + bob ##> "/cs" + bob <## "i alice (Alice)" + bob <## "i alice_1 (Alice)" + bob `hasContactProfiles` ["alice", "alice", "bob", T.pack bobIncognitoTeam, T.pack bobIncognitoClub] + -- delete group 1, unused host contact and profile are deleted + bobLeaveDeleteGroup alice bob "team" bobIncognitoTeam + bob ##> "/cs" + bob <## "i alice_1 (Alice)" + bob `hasContactProfiles` ["alice", "bob", T.pack bobIncognitoClub] + -- delete group 2, unused host contact and profile are deleted + bobLeaveDeleteGroup alice bob "club" bobIncognitoClub + bob ##> "/cs" + (bob ("/g " <> group) + alice <## ("group #" <> group <> " is created") + alice <## ("use /a " <> group <> " to add members") + alice ##> ("/create link #" <> group) + gLinkTeam <- getGroupLink alice group True + bob ##> ("/c " <> gLinkTeam) + bobIncognito <- getTermLine bob + bob <## "connection request sent incognito!" + alice <## (bobIncognito <> ": accepting request to join group #" <> group <> "...") + _ <- getTermLine bob + concurrentlyN_ + [ do + alice <## (bobIncognito <> ": contact is connected") + alice <## (bobIncognito <> " invited to group #" <> group <> " via your group link") + alice <## ("#" <> group <> ": " <> bobIncognito <> " joined the group"), + do + bob <## (bobsAliceContact <> " (Alice): contact is connected, your incognito profile for this contact is " <> bobIncognito) + bob <## ("use /info " <> bobsAliceContact <> " to print out this incognito profile again") + bob <## ("#" <> group <> ": you joined the group incognito as " <> bobIncognito) + ] + pure bobIncognito + bobLeaveDeleteGroup alice bob group bobIncognito = do + bob ##> ("/l " <> group) + concurrentlyN_ + [ do + bob <## ("#" <> group <> ": you left the group") + bob <## ("use /d #" <> group <> " to delete the group"), + alice <## ("#" <> group <> ": " <> bobIncognito <> " left the group") + ] + bob ##> ("/d #" <> group) + bob <## ("#" <> group <> ": you deleted the group") + testSwitchContact :: IO () testSwitchContact = testChat2 aliceProfile bobProfile $