2022-01-11 12:27:57 +00:00
{- # LANGUAGE DataKinds # -}
{- # LANGUAGE DuplicateRecordFields # -}
{- # LANGUAGE OverloadedLists # -}
{- # LANGUAGE OverloadedStrings # -}
2021-07-04 18:42:24 +01:00
module ProtocolTests where
2022-01-17 12:24:55 +00:00
import qualified Data.Aeson as J
2022-01-11 12:27:57 +00:00
import Data.ByteString.Char8 ( ByteString )
2022-03-13 19:34:03 +00:00
import Data.Time.Clock.System ( SystemTime ( .. ) , systemToUTCTime )
2022-01-11 12:27:57 +00:00
import Simplex.Chat.Protocol
import Simplex.Chat.Types
import Simplex.Messaging.Agent.Protocol
import qualified Simplex.Messaging.Crypto as C
import Simplex.Messaging.Crypto.Ratchet
import Simplex.Messaging.Encoding.String
import Simplex.Messaging.Parsers ( parseAll )
2022-08-13 11:53:53 +01:00
import Simplex.Messaging.Protocol ( supportedSMPClientVRange )
2022-06-09 14:52:12 +01:00
import Simplex.Messaging.Version
2022-01-11 12:27:57 +00:00
import Test.Hspec
protocolTests :: Spec
protocolTests = decodeChatMessageTest
srv :: SMPServer
2022-07-06 08:46:04 +01:00
srv = SMPServer " smp.simplex.im " " 5223 " ( C . KeyHash " \ 215 m \ 248 \ 251 " )
2022-01-11 12:27:57 +00:00
queue :: SMPQueueUri
queue =
SMPQueueUri
2022-08-13 11:53:53 +01:00
supportedSMPClientVRange
SMPQueueAddress
{ smpServer = srv ,
senderId = " \ 223 \ 142 z \ 251 " ,
dhPublicKey = " MCowBQYDK2VuAyEAjiswwI3O/NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o= "
}
2022-01-11 12:27:57 +00:00
connReqData :: ConnReqUriData
connReqData =
ConnReqUriData
{ crScheme = simplexChat ,
2022-06-09 14:52:12 +01:00
crAgentVRange = mkVersionRange 1 1 ,
2022-01-11 12:27:57 +00:00
crSmpQueues = [ queue ]
}
testDhPubKey :: C . PublicKeyX448
testDhPubKey = " MEIwBQYDK2VvAzkAmKuSYeQ/m0SixPDS8Wq8VBaTS1cW+Lp0n0h4Diu+kUpR+qXx4SDJ32YGEFoGFGSbGPry5Ychr6U= "
testE2ERatchetParams :: E2ERatchetParamsUri 'C . X448
testE2ERatchetParams = E2ERatchetParamsUri e2eEncryptVRange testDhPubKey testDhPubKey
testConnReq :: ConnectionRequestUri 'CMInvitation
testConnReq = CRInvitationUri connReqData testE2ERatchetParams
2022-03-13 19:34:03 +00:00
( ==## ) :: ByteString -> ChatMessage -> Expectation
s ==## msg = do
strDecode s ` shouldBe ` Right msg
parseAll strP s ` shouldBe ` Right msg
( ##== ) :: ByteString -> ChatMessage -> Expectation
s ##== msg =
J . eitherDecodeStrict' ( strEncode msg )
` shouldBe ` ( J . eitherDecodeStrict' s :: Either String J . Value )
( ##==## ) :: ByteString -> ChatMessage -> Expectation
s ##==## msg = do
s ##== msg
s ==## msg
2022-01-11 12:27:57 +00:00
( ==# ) :: ByteString -> ChatMsgEvent -> Expectation
2022-03-25 22:23:51 +04:00
s ==# msg = s ==## ChatMessage Nothing msg
2022-01-11 12:27:57 +00:00
( #== ) :: ByteString -> ChatMsgEvent -> Expectation
2022-03-25 22:23:51 +04:00
s #== msg = s ##== ChatMessage Nothing msg
2022-01-11 12:27:57 +00:00
( #==# ) :: ByteString -> ChatMsgEvent -> Expectation
s #==# msg = do
s #== msg
s ==# msg
testProfile :: Profile
2022-04-04 19:51:49 +01:00
testProfile = Profile { displayName = " alice " , fullName = " Alice " , image = Just ( ImageData " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= " ) }
2022-01-11 12:27:57 +00:00
testGroupProfile :: GroupProfile
2022-03-10 15:45:40 +04:00
testGroupProfile = GroupProfile { displayName = " team " , fullName = " Team " , image = Nothing }
2022-01-11 12:27:57 +00:00
decodeChatMessageTest :: Spec
decodeChatMessageTest = describe " Chat message encoding/decoding " $ do
2022-04-06 13:21:06 +04:00
it " x.msg.new simple text " $
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }}} "
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCText " hello " ) Nothing ) )
it " x.msg.new simple link " $
2022-04-04 19:51:49 +01:00
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " https://simplex.chat \ " , \ " type \ " : \ " link \ " , \ " preview \ " :{ \ " description \ " : \ " SimpleX Chat \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA \ " , \ " title \ " : \ " SimpleX Chat \ " , \ " uri \ " : \ " https://simplex.chat \ " }}}} "
2022-04-06 13:21:06 +04:00
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCLink " https://simplex.chat " $ LinkPreview { uri = " https://simplex.chat " , title = " SimpleX Chat " , description = " SimpleX Chat " , image = ImageData " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA " } ) Nothing ) )
it " x.msg.new simple image " $
2022-04-10 13:30:58 +04:00
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " \ " , \ " type \ " : \ " image \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCImage " " $ ImageData " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= " ) Nothing ) )
it " x.msg.new simple image with text " $
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " here's an image \ " , \ " type \ " : \ " image \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCImage " here's an image " $ ImageData " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= " ) Nothing ) )
2022-04-06 13:21:06 +04:00
it " x.msg.new chat message " $
" { \ " msgId \ " : \ " AQIDBA== \ " , \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }}} "
2022-04-28 09:40:51 +04:00
##==## ChatMessage ( Just $ SharedMsgId " \ 1 \ 2 \ 3 \ 4 " ) ( XMsgNew ( MCSimple ( ExtMsgContent ( MCText " hello " ) Nothing ) ) )
2022-04-06 13:21:06 +04:00
it " x.msg.new quote " $
2022-03-16 13:20:47 +00:00
" { \ " msgId \ " : \ " AQIDBA== \ " , \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello to you too \ " , \ " type \ " : \ " text \ " }, \ " quote \ " :{ \ " content \ " :{ \ " text \ " : \ " hello there! \ " , \ " type \ " : \ " text \ " }, \ " msgRef \ " :{ \ " msgId \ " : \ " BQYHCA== \ " , \ " sent \ " :true, \ " sentAt \ " : \ " 1970-01-01T00:00:01.000000001Z \ " }}}} "
2022-03-25 22:23:51 +04:00
##==## ChatMessage
( Just $ SharedMsgId " \ 1 \ 2 \ 3 \ 4 " )
2022-04-06 13:21:06 +04:00
( XMsgNew
( MCQuote
( QuotedMsg
( MsgRef ( Just $ SharedMsgId " \ 5 \ 6 \ 7 \ 8 " ) ( systemToUTCTime $ MkSystemTime 1 1 ) True Nothing )
$ MCText " hello there! "
)
( ExtMsgContent
( MCText " hello to you too " )
Nothing
)
)
2022-03-25 22:23:51 +04:00
)
2022-04-06 13:21:06 +04:00
it " x.msg.new forward " $
2022-03-13 19:34:03 +00:00
" { \ " msgId \ " : \ " AQIDBA== \ " , \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }, \ " forward \ " :true}} "
2022-04-06 13:21:06 +04:00
##==## ChatMessage ( Just $ SharedMsgId " \ 1 \ 2 \ 3 \ 4 " ) ( XMsgNew $ MCForward ( ExtMsgContent ( MCText " hello " ) Nothing ) )
2022-04-28 09:40:51 +04:00
it " x.msg.new simple text with file " $
2022-04-06 13:21:06 +04:00
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }, \ " file \ " :{ \ " fileSize \ " :12345, \ " fileName \ " : \ " photo.jpg \ " }}} "
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCText " hello " ) ( Just FileInvitation { fileName = " photo.jpg " , fileSize = 12345 , fileConnReq = Nothing } ) ) )
2022-04-28 09:40:51 +04:00
it " x.msg.new simple file with file " $
" { \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " \ " , \ " type \ " : \ " file \ " }, \ " file \ " :{ \ " fileSize \ " :12345, \ " fileName \ " : \ " file.txt \ " }}} "
#==# XMsgNew ( MCSimple ( ExtMsgContent ( MCFile " " ) ( Just FileInvitation { fileName = " file.txt " , fileSize = 12345 , fileConnReq = Nothing } ) ) )
2022-04-10 13:30:58 +04:00
it " x.msg.new quote with file " $
2022-04-06 13:21:06 +04:00
" { \ " msgId \ " : \ " AQIDBA== \ " , \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello to you too \ " , \ " type \ " : \ " text \ " }, \ " quote \ " :{ \ " content \ " :{ \ " text \ " : \ " hello there! \ " , \ " type \ " : \ " text \ " }, \ " msgRef \ " :{ \ " msgId \ " : \ " BQYHCA== \ " , \ " sent \ " :true, \ " sentAt \ " : \ " 1970-01-01T00:00:01.000000001Z \ " }}, \ " file \ " :{ \ " fileSize \ " :12345, \ " fileName \ " : \ " photo.jpg \ " }}} "
##==## ChatMessage
( Just $ SharedMsgId " \ 1 \ 2 \ 3 \ 4 " )
( XMsgNew
( MCQuote
( QuotedMsg
( MsgRef ( Just $ SharedMsgId " \ 5 \ 6 \ 7 \ 8 " ) ( systemToUTCTime $ MkSystemTime 1 1 ) True Nothing )
$ MCText " hello there! "
)
( ExtMsgContent
( MCText " hello to you too " )
( Just FileInvitation { fileName = " photo.jpg " , fileSize = 12345 , fileConnReq = Nothing } )
)
)
)
2022-04-10 13:30:58 +04:00
it " x.msg.new forward with file " $
2022-04-06 13:21:06 +04:00
" { \ " msgId \ " : \ " AQIDBA== \ " , \ " event \ " : \ " x.msg.new \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }, \ " forward \ " :true, \ " file \ " :{ \ " fileSize \ " :12345, \ " fileName \ " : \ " photo.jpg \ " }}} "
##==## ChatMessage ( Just $ SharedMsgId " \ 1 \ 2 \ 3 \ 4 " ) ( XMsgNew $ MCForward ( ExtMsgContent ( MCText " hello " ) ( Just FileInvitation { fileName = " photo.jpg " , fileSize = 12345 , fileConnReq = Nothing } ) ) )
2022-04-05 10:01:08 +04:00
it " x.msg.update " $
" { \ " event \ " : \ " x.msg.update \ " , \ " params \ " :{ \ " msgId \ " : \ " AQIDBA== \ " , \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }}} "
#==# XMsgUpdate ( SharedMsgId " \ 1 \ 2 \ 3 \ 4 " ) ( MCText " hello " )
it " x.msg.del " $
" { \ " event \ " : \ " x.msg.del \ " , \ " params \ " :{ \ " msgId \ " : \ " AQIDBA== \ " }} "
#==# XMsgDel ( SharedMsgId " \ 1 \ 2 \ 3 \ 4 " )
it " x.msg.deleted " $
" { \ " event \ " : \ " x.msg.deleted \ " , \ " params \ " :{}} "
#==# XMsgDeleted
2022-01-11 12:27:57 +00:00
it " x.file " $
2022-08-13 11:53:53 +01:00
" { \ " event \ " : \ " x.file \ " , \ " params \ " :{ \ " file \ " :{ \ " fileConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " , \ " fileSize \ " :12345, \ " fileName \ " : \ " photo.jpg \ " }}} "
2022-04-05 10:01:08 +04:00
#==# XFile FileInvitation { fileName = " photo.jpg " , fileSize = 12345 , fileConnReq = Just testConnReq }
it " x.file without file invitation " $
" { \ " event \ " : \ " x.file \ " , \ " params \ " :{ \ " file \ " :{ \ " fileSize \ " :12345, \ " fileName \ " : \ " photo.jpg \ " }}} "
#==# XFile FileInvitation { fileName = " photo.jpg " , fileSize = 12345 , fileConnReq = Nothing }
2022-04-06 13:21:06 +04:00
it " x.file.acpt " $
" { \ " event \ " : \ " x.file.acpt \ " , \ " params \ " :{ \ " fileName \ " : \ " photo.jpg \ " }} "
#==# XFileAcpt " photo.jpg "
2022-04-05 10:01:08 +04:00
it " x.file.acpt.inv " $
2022-08-13 11:53:53 +01:00
" { \ " event \ " : \ " x.file.acpt.inv \ " , \ " params \ " :{ \ " msgId \ " : \ " AQIDBA== \ " , \ " fileName \ " : \ " photo.jpg \ " , \ " fileConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " }} "
2022-04-05 10:01:08 +04:00
#==# XFileAcptInv ( SharedMsgId " \ 1 \ 2 \ 3 \ 4 " ) testConnReq " photo.jpg "
2022-05-11 16:18:28 +04:00
it " x.file.cancel " $
" { \ " event \ " : \ " x.file.cancel \ " , \ " params \ " :{ \ " msgId \ " : \ " AQIDBA== \ " }} "
#==# XFileCancel ( SharedMsgId " \ 1 \ 2 \ 3 \ 4 " )
2022-04-06 13:21:06 +04:00
it " x.info " $
" { \ " event \ " : \ " x.info \ " , \ " params \ " :{ \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
#==# XInfo testProfile
it " x.info with empty full name " $
" { \ " event \ " : \ " x.info \ " , \ " params \ " :{ \ " profile \ " :{ \ " fullName \ " : \ " \ " , \ " displayName \ " : \ " alice \ " }}} "
#==# XInfo Profile { displayName = " alice " , fullName = " " , image = Nothing }
2022-02-13 13:19:24 +04:00
it " x.contact with xContactId " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.contact \ " , \ " params \ " :{ \ " contactReqId \ " : \ " AQIDBA== \ " , \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
2022-02-13 13:19:24 +04:00
#==# XContact testProfile ( Just $ XContactId " \ 1 \ 2 \ 3 \ 4 " )
it " x.contact without XContactId " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.contact \ " , \ " params \ " :{ \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
2022-01-11 12:27:57 +00:00
#==# XContact testProfile Nothing
it " x.contact with content null " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.contact \ " , \ " params \ " :{ \ " content \ " :null, \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
2022-01-11 12:27:57 +00:00
==# XContact testProfile Nothing
2022-02-13 13:19:24 +04:00
it " x.contact with content (ignored) " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.contact \ " , \ " params \ " :{ \ " content \ " :{ \ " text \ " : \ " hello \ " , \ " type \ " : \ " text \ " }, \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
2022-02-13 13:19:24 +04:00
==# XContact testProfile Nothing
2022-01-11 12:27:57 +00:00
it " x.grp.inv " $
2022-08-13 11:53:53 +01:00
" { \ " event \ " : \ " x.grp.inv \ " , \ " params \ " :{ \ " groupInvitation \ " :{ \ " connRequest \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " , \ " invitedMember \ " :{ \ " memberRole \ " : \ " member \ " , \ " memberId \ " : \ " BQYHCA== \ " }, \ " groupProfile \ " :{ \ " fullName \ " : \ " Team \ " , \ " displayName \ " : \ " team \ " }, \ " fromMember \ " :{ \ " memberRole \ " : \ " admin \ " , \ " memberId \ " : \ " AQIDBA== \ " }}}} "
2022-01-11 12:27:57 +00:00
#==# XGrpInv GroupInvitation { fromMember = MemberIdRole ( MemberId " \ 1 \ 2 \ 3 \ 4 " ) GRAdmin , invitedMember = MemberIdRole ( MemberId " \ 5 \ 6 \ 7 \ 8 " ) GRMember , connRequest = testConnReq , groupProfile = testGroupProfile }
2022-04-06 13:21:06 +04:00
it " x.grp.acpt " $
" { \ " event \ " : \ " x.grp.acpt \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " }} "
#==# XGrpAcpt ( MemberId " \ 1 \ 2 \ 3 \ 4 " )
2022-01-11 12:27:57 +00:00
it " x.grp.mem.new " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.grp.mem.new \ " , \ " params \ " :{ \ " memberInfo \ " :{ \ " memberRole \ " : \ " admin \ " , \ " memberId \ " : \ " AQIDBA== \ " , \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}}} "
2022-01-11 12:27:57 +00:00
#==# XGrpMemNew MemberInfo { memberId = MemberId " \ 1 \ 2 \ 3 \ 4 " , memberRole = GRAdmin , profile = testProfile }
it " x.grp.mem.intro " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.grp.mem.intro \ " , \ " params \ " :{ \ " memberInfo \ " :{ \ " memberRole \ " : \ " admin \ " , \ " memberId \ " : \ " AQIDBA== \ " , \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}}} "
2022-01-11 12:27:57 +00:00
#==# XGrpMemIntro MemberInfo { memberId = MemberId " \ 1 \ 2 \ 3 \ 4 " , memberRole = GRAdmin , profile = testProfile }
it " x.grp.mem.inv " $
2022-08-13 11:53:53 +01:00
" { \ " event \ " : \ " x.grp.mem.inv \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " , \ " memberIntro \ " :{ \ " directConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " , \ " groupConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " }}} "
2022-01-11 12:27:57 +00:00
#==# XGrpMemInv ( MemberId " \ 1 \ 2 \ 3 \ 4 " ) IntroInvitation { groupConnReq = testConnReq , directConnReq = testConnReq }
it " x.grp.mem.fwd " $
2022-08-13 11:53:53 +01:00
" { \ " event \ " : \ " x.grp.mem.fwd \ " , \ " params \ " :{ \ " memberIntro \ " :{ \ " directConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " , \ " groupConnReq \ " : \ " https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D \ " }, \ " memberInfo \ " :{ \ " memberRole \ " : \ " admin \ " , \ " memberId \ " : \ " AQIDBA== \ " , \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}}} "
2022-01-11 12:27:57 +00:00
#==# XGrpMemFwd MemberInfo { memberId = MemberId " \ 1 \ 2 \ 3 \ 4 " , memberRole = GRAdmin , profile = testProfile } IntroInvitation { groupConnReq = testConnReq , directConnReq = testConnReq }
it " x.grp.mem.info " $
2022-03-10 15:45:40 +04:00
" { \ " event \ " : \ " x.grp.mem.info \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " , \ " profile \ " :{ \ " fullName \ " : \ " Alice \ " , \ " displayName \ " : \ " alice \ " , \ " image \ " : \ " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII= \ " }}} "
2022-01-17 12:24:55 +00:00
#==# XGrpMemInfo ( MemberId " \ 1 \ 2 \ 3 \ 4 " ) testProfile
2022-04-06 13:21:06 +04:00
it " x.grp.mem.con " $
" { \ " event \ " : \ " x.grp.mem.con \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " }} "
#==# XGrpMemCon ( MemberId " \ 1 \ 2 \ 3 \ 4 " )
it " x.grp.mem.con.all " $
" { \ " event \ " : \ " x.grp.mem.con.all \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " }} "
#==# XGrpMemConAll ( MemberId " \ 1 \ 2 \ 3 \ 4 " )
it " x.grp.mem.del " $
" { \ " event \ " : \ " x.grp.mem.del \ " , \ " params \ " :{ \ " memberId \ " : \ " AQIDBA== \ " }} "
#==# XGrpMemDel ( MemberId " \ 1 \ 2 \ 3 \ 4 " )
it " x.grp.leave " $
" { \ " event \ " : \ " x.grp.leave \ " , \ " params \ " :{}} "
==# XGrpLeave
it " x.grp.del " $
" { \ " event \ " : \ " x.grp.del \ " , \ " params \ " :{}} "
==# XGrpDel
it " x.info.probe " $
" { \ " event \ " : \ " x.info.probe \ " , \ " params \ " :{ \ " probe \ " : \ " AQIDBA== \ " }} "
#==# XInfoProbe ( Probe " \ 1 \ 2 \ 3 \ 4 " )
it " x.info.probe.check " $
" { \ " event \ " : \ " x.info.probe.check \ " , \ " params \ " :{ \ " probeHash \ " : \ " AQIDBA== \ " }} "
#==# XInfoProbeCheck ( ProbeHash " \ 1 \ 2 \ 3 \ 4 " )
it " x.info.probe.ok " $
" { \ " event \ " : \ " x.info.probe.ok \ " , \ " params \ " :{ \ " probe \ " : \ " AQIDBA== \ " }} "
#==# XInfoProbeOk ( Probe " \ 1 \ 2 \ 3 \ 4 " )
it " x.ok " $
" { \ " event \ " : \ " x.ok \ " , \ " params \ " :{}} "
==# XOk