Refactor events file structure
This commit is contained in:
175
tests/events/test_client_payload.py
Normal file
175
tests/events/test_client_payload.py
Normal file
@@ -0,0 +1,175 @@
|
||||
import datetime
|
||||
import pytest
|
||||
from fbchat import (
|
||||
ParseError,
|
||||
User,
|
||||
Group,
|
||||
Message,
|
||||
MessageData,
|
||||
UnknownEvent,
|
||||
ReactionEvent,
|
||||
UserStatusEvent,
|
||||
LiveLocationEvent,
|
||||
UnsendEvent,
|
||||
MessageReplyEvent,
|
||||
)
|
||||
from fbchat._events._client_payload import parse_client_delta, parse_client_payloads
|
||||
|
||||
|
||||
def test_reaction_event_added(session):
|
||||
data = {
|
||||
"threadKey": {"otherUserFbId": 1234},
|
||||
"messageId": "mid.$XYZ",
|
||||
"action": 0,
|
||||
"userId": 4321,
|
||||
"reaction": "😍",
|
||||
"senderId": 4321,
|
||||
"offlineThreadingId": "6623596674408921967",
|
||||
}
|
||||
thread = User(session=session, id="1234")
|
||||
assert ReactionEvent(
|
||||
author=User(session=session, id="4321"),
|
||||
thread=thread,
|
||||
message=Message(thread=thread, id="mid.$XYZ"),
|
||||
reaction="😍",
|
||||
) == parse_client_delta(session, {"deltaMessageReaction": data})
|
||||
|
||||
|
||||
def test_reaction_event_removed(session):
|
||||
data = {
|
||||
"threadKey": {"threadFbId": 1234},
|
||||
"messageId": "mid.$XYZ",
|
||||
"action": 1,
|
||||
"userId": 4321,
|
||||
"senderId": 4321,
|
||||
"offlineThreadingId": "6623586106713014836",
|
||||
}
|
||||
thread = Group(session=session, id="1234")
|
||||
assert ReactionEvent(
|
||||
author=User(session=session, id="4321"),
|
||||
thread=thread,
|
||||
message=Message(thread=thread, id="mid.$XYZ"),
|
||||
reaction=None,
|
||||
) == parse_client_delta(session, {"deltaMessageReaction": data})
|
||||
|
||||
|
||||
def test_user_status_blocked(session):
|
||||
data = {
|
||||
"threadKey": {"otherUserFbId": 1234},
|
||||
"canViewerReply": False,
|
||||
"reason": 2,
|
||||
"actorFbid": 4321,
|
||||
}
|
||||
assert UserStatusEvent(
|
||||
author=User(session=session, id="4321"),
|
||||
thread=User(session=session, id="1234"),
|
||||
blocked=True,
|
||||
) == parse_client_delta(session, {"deltaChangeViewerStatus": data})
|
||||
|
||||
|
||||
def test_user_status_unblocked(session):
|
||||
data = {
|
||||
"threadKey": {"otherUserFbId": 1234},
|
||||
"canViewerReply": True,
|
||||
"reason": 2,
|
||||
"actorFbid": 1234,
|
||||
}
|
||||
assert UserStatusEvent(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
blocked=False,
|
||||
) == parse_client_delta(session, {"deltaChangeViewerStatus": data})
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="need to gather test data")
|
||||
def test_live_location(session):
|
||||
pass
|
||||
|
||||
|
||||
def test_message_reply(session):
|
||||
message = {
|
||||
"messageMetadata": {
|
||||
"threadKey": {"otherUserFbId": 1234},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "112233445566",
|
||||
"actorFbId": 1234,
|
||||
"timestamp": 1500000000000,
|
||||
"tags": ["source:messenger:web", "cg-enabled", "sent", "inbox"],
|
||||
"threadReadStateEffect": 3,
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"unsendType": "can_unsend",
|
||||
"folderId": {"systemFolderId": 0},
|
||||
},
|
||||
"body": "xyz",
|
||||
"attachments": [],
|
||||
"irisSeqId": 1111111,
|
||||
"messageReply": {"replyToMessageId": {"id": "mid.$ABC"}, "status": 0,},
|
||||
"requestContext": {"apiArgs": "..."},
|
||||
"irisTags": ["DeltaNewMessage"],
|
||||
}
|
||||
reply = {
|
||||
"messageMetadata": {
|
||||
"threadKey": {"otherUserFbId": 1234},
|
||||
"messageId": "mid.$ABC",
|
||||
"offlineThreadingId": "665544332211",
|
||||
"actorFbId": 4321,
|
||||
"timestamp": 1600000000000,
|
||||
"tags": ["inbox", "sent", "source:messenger:web"],
|
||||
},
|
||||
"body": "abc",
|
||||
"attachments": [],
|
||||
"requestContext": {"apiArgs": "..."},
|
||||
"irisTags": [],
|
||||
}
|
||||
data = {
|
||||
"message": message,
|
||||
"repliedToMessage": reply,
|
||||
"status": 0,
|
||||
}
|
||||
thread = User(session=session, id="1234")
|
||||
assert MessageReplyEvent(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=thread,
|
||||
message=MessageData(
|
||||
thread=thread,
|
||||
id="mid.$XYZ",
|
||||
author="1234",
|
||||
created_at=datetime.datetime(
|
||||
2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
text="xyz",
|
||||
reply_to_id="mid.$ABC",
|
||||
),
|
||||
replied_to=MessageData(
|
||||
thread=thread,
|
||||
id="mid.$ABC",
|
||||
author="4321",
|
||||
created_at=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
text="abc",
|
||||
),
|
||||
) == parse_client_delta(session, {"deltaMessageReply": data})
|
||||
|
||||
|
||||
def test_parse_client_delta_unknown(session):
|
||||
assert UnknownEvent(
|
||||
source="client payload", data={"abc": 10}
|
||||
) == parse_client_delta(session, {"abc": 10})
|
||||
|
||||
|
||||
def test_parse_client_payloads_empty(session):
|
||||
# This is never something that happens, it's just so that we can test the parsing
|
||||
# payload = '{"deltas":[]}'
|
||||
payload = [123, 34, 100, 101, 108, 116, 97, 115, 34, 58, 91, 93, 125]
|
||||
data = {"payload": payload, "class": "ClientPayload"}
|
||||
assert [] == list(parse_client_payloads(session, data))
|
||||
|
||||
|
||||
def test_parse_client_payloads_invalid(session):
|
||||
# payload = '{"invalid":"data"}'
|
||||
payload = [123, 34, 105, 110, 118, 97, 108, 105, 100, 34, 58, 34, 97, 34, 125]
|
||||
data = {"payload": payload, "class": "ClientPayload"}
|
||||
with pytest.raises(ParseError, match="Error parsing ClientPayload"):
|
||||
list(parse_client_payloads(session, data))
|
78
tests/events/test_common.py
Normal file
78
tests/events/test_common.py
Normal file
@@ -0,0 +1,78 @@
|
||||
import pytest
|
||||
import datetime
|
||||
from fbchat import Group, User, ParseError, ThreadEvent
|
||||
|
||||
|
||||
def test_thread_event_get_thread_group1(session):
|
||||
data = {
|
||||
"threadKey": {"threadFbId": 1234},
|
||||
"messageId": "mid.$gAAT4Sw1WSGh14A3MOFvrsiDvr3Yc",
|
||||
"offlineThreadingId": "6623583531508397596",
|
||||
"actorFbId": 4321,
|
||||
"timestamp": 1500000000000,
|
||||
"tags": [
|
||||
"inbox",
|
||||
"sent",
|
||||
"tq",
|
||||
"blindly_apply_message_folder",
|
||||
"source:messenger:web",
|
||||
],
|
||||
}
|
||||
assert Group(session=session, id="1234") == ThreadEvent._get_thread(session, data)
|
||||
|
||||
|
||||
def test_thread_event_get_thread_group2(session):
|
||||
data = {
|
||||
"actorFbId": "4321",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "112233445566",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:messenger:web"],
|
||||
"threadKey": {"threadFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
}
|
||||
assert Group(session=session, id="1234") == ThreadEvent._get_thread(session, data)
|
||||
|
||||
|
||||
def test_thread_event_get_thread_user(session):
|
||||
data = {
|
||||
"actorFbId": "4321",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "112233445566",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:messenger:web"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
}
|
||||
assert User(session=session, id="1234") == ThreadEvent._get_thread(session, data)
|
||||
|
||||
|
||||
def test_thread_event_get_thread_unknown(session):
|
||||
data = {"threadKey": {"abc": "1234"}}
|
||||
with pytest.raises(ParseError, match="Could not find thread data"):
|
||||
ThreadEvent._get_thread(session, data)
|
||||
|
||||
|
||||
def test_thread_event_parse_metadata(session):
|
||||
data = {
|
||||
"actorFbId": "4321",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "112233445566",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:messenger:web"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
}
|
||||
assert (
|
||||
User(session=session, id="4321"),
|
||||
User(session=session, id="1234"),
|
||||
datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == ThreadEvent._parse_metadata(session, {"messageMetadata": data})
|
328
tests/events/test_delta_class.py
Normal file
328
tests/events/test_delta_class.py
Normal file
@@ -0,0 +1,328 @@
|
||||
import datetime
|
||||
import pytest
|
||||
from fbchat import (
|
||||
ParseError,
|
||||
User,
|
||||
Group,
|
||||
Message,
|
||||
MessageData,
|
||||
ThreadLocation,
|
||||
UnknownEvent,
|
||||
PeopleAdded,
|
||||
PersonRemoved,
|
||||
TitleSet,
|
||||
UnfetchedThreadEvent,
|
||||
MessagesDelivered,
|
||||
ThreadsRead,
|
||||
MessageEvent,
|
||||
ThreadFolder,
|
||||
)
|
||||
from fbchat._events._delta_class import parse_delta
|
||||
|
||||
|
||||
def test_people_added(session):
|
||||
data = {
|
||||
"addedParticipants": [
|
||||
{
|
||||
"fanoutPolicy": "IRIS_MESSAGE_QUEUE",
|
||||
"firstName": "Abc",
|
||||
"fullName": "Abc Def",
|
||||
"initialFolder": "FOLDER_INBOX",
|
||||
"initialFolderId": {"systemFolderId": "INBOX"},
|
||||
"isMessengerUser": False,
|
||||
"userFbId": "1234",
|
||||
}
|
||||
],
|
||||
"irisSeqId": "11223344",
|
||||
"irisTags": ["DeltaParticipantsAddedToGroupThread", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "3456",
|
||||
"adminText": "You added Abc Def to the group.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "1122334455",
|
||||
"skipBumpThread": False,
|
||||
"tags": [],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456", "4567"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"class": "ParticipantsAddedToGroupThread",
|
||||
}
|
||||
assert PeopleAdded(
|
||||
author=User(session=session, id="3456"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
added=[User(session=session, id="1234")],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_person_removed(session):
|
||||
data = {
|
||||
"irisSeqId": "11223344",
|
||||
"irisTags": ["DeltaParticipantLeftGroupThread", "is_from_iris_fanout"],
|
||||
"leftParticipantFbId": "1234",
|
||||
"messageMetadata": {
|
||||
"actorFbId": "3456",
|
||||
"adminText": "You removed Abc Def from the group.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "1122334455",
|
||||
"skipBumpThread": True,
|
||||
"tags": [],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456", "4567"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"class": "ParticipantLeftGroupThread",
|
||||
}
|
||||
assert PersonRemoved(
|
||||
author=User(session=session, id="3456"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
removed=User(session=session, id="1234"),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_title_set(session):
|
||||
data = {
|
||||
"irisSeqId": "11223344",
|
||||
"irisTags": ["DeltaThreadName", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "3456",
|
||||
"adminText": "You named the group abc.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "1122334455",
|
||||
"skipBumpThread": False,
|
||||
"tags": [],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"name": "abc",
|
||||
"participants": ["1234", "2345", "3456", "4567"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"class": "ThreadName",
|
||||
}
|
||||
assert TitleSet(
|
||||
author=User(session=session, id="3456"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
title="abc",
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_forced_fetch(session):
|
||||
data = {
|
||||
"forceInsert": False,
|
||||
"messageId": "mid.$XYZ",
|
||||
"threadKey": {"threadFbId": "1234"},
|
||||
"class": "ForcedFetch",
|
||||
}
|
||||
thread = Group(session=session, id="1234")
|
||||
assert UnfetchedThreadEvent(
|
||||
thread=thread, message=Message(thread=thread, id="mid.$XYZ")
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_forced_fetch_pending(session):
|
||||
data = {
|
||||
"forceInsert": False,
|
||||
"irisSeqId": "1111",
|
||||
"isLazy": False,
|
||||
"threadKey": {"threadFbId": "1234"},
|
||||
"class": "ForcedFetch",
|
||||
}
|
||||
assert UnfetchedThreadEvent(
|
||||
thread=Group(session=session, id="1234"), message=None
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_delivery_receipt_group(session):
|
||||
data = {
|
||||
"actorFbId": "1234",
|
||||
"deliveredWatermarkTimestampMs": "1500000000000",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaDeliveryReceipt"],
|
||||
"messageIds": ["mid.$XYZ", "mid.$ABC"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"class": "DeliveryReceipt",
|
||||
}
|
||||
thread = Group(session=session, id="4321")
|
||||
assert MessagesDelivered(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=thread,
|
||||
messages=[
|
||||
Message(thread=thread, id="mid.$XYZ"),
|
||||
Message(thread=thread, id="mid.$ABC"),
|
||||
],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_delivery_receipt_user(session):
|
||||
data = {
|
||||
"deliveredWatermarkTimestampMs": "1500000000000",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaDeliveryReceipt", "is_from_iris_fanout"],
|
||||
"messageIds": ["mid.$XYZ", "mid.$ABC"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"class": "DeliveryReceipt",
|
||||
}
|
||||
thread = User(session=session, id="1234")
|
||||
assert MessagesDelivered(
|
||||
author=thread,
|
||||
thread=thread,
|
||||
messages=[
|
||||
Message(thread=thread, id="mid.$XYZ"),
|
||||
Message(thread=thread, id="mid.$ABC"),
|
||||
],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_read_receipt(session):
|
||||
data = {
|
||||
"actionTimestampMs": "1600000000000",
|
||||
"actorFbId": "1234",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaReadReceipt", "is_from_iris_fanout"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"tqSeqId": "1111",
|
||||
"watermarkTimestampMs": "1500000000000",
|
||||
"class": "ReadReceipt",
|
||||
}
|
||||
assert ThreadsRead(
|
||||
author=User(session=session, id="1234"),
|
||||
threads=[Group(session=session, id="4321")],
|
||||
at=datetime.datetime(2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_mark_read(session):
|
||||
data = {
|
||||
"actionTimestamp": "1600000000000",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaMarkRead", "is_from_iris_fanout"],
|
||||
"threadKeys": [{"threadFbId": "1234"}, {"otherUserFbId": "2345"}],
|
||||
"tqSeqId": "1111",
|
||||
"watermarkTimestamp": "1500000000000",
|
||||
"class": "MarkRead",
|
||||
}
|
||||
assert ThreadsRead(
|
||||
author=User(session=session, id=session.user_id),
|
||||
threads=[Group(session=session, id="1234"), User(session=session, id="2345")],
|
||||
at=datetime.datetime(2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_new_message_user(session):
|
||||
data = {
|
||||
"attachments": [],
|
||||
"body": "test",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaNewMessage"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:messenger:web"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1600000000000",
|
||||
},
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"class": "NewMessage",
|
||||
}
|
||||
assert MessageEvent(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
message=MessageData(
|
||||
thread=User(session=session, id="1234"),
|
||||
id="mid.$XYZ",
|
||||
author="1234",
|
||||
text="test",
|
||||
created_at=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
),
|
||||
at=datetime.datetime(2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_new_message_group(session):
|
||||
data = {
|
||||
"attachments": [],
|
||||
"body": "test",
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaNewMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "4321",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:messenger:web"],
|
||||
"threadKey": {"threadFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1600000000000",
|
||||
},
|
||||
"participants": ["4321", "5432", "6543"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"class": "NewMessage",
|
||||
}
|
||||
assert MessageEvent(
|
||||
author=User(session=session, id="4321"),
|
||||
thread=Group(session=session, id="1234"),
|
||||
message=MessageData(
|
||||
thread=Group(session=session, id="1234"),
|
||||
id="mid.$XYZ",
|
||||
author="4321",
|
||||
text="test",
|
||||
created_at=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
),
|
||||
at=datetime.datetime(2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_thread_folder(session):
|
||||
data = {
|
||||
"class": "ThreadFolder",
|
||||
"folder": "FOLDER_PENDING",
|
||||
"irisSeqId": "1111",
|
||||
"irisTags": ["DeltaThreadFolder", "is_from_iris_fanout"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
}
|
||||
assert ThreadFolder(
|
||||
thread=User(session=session, id="1234"), folder=ThreadLocation.PENDING
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_noop(session):
|
||||
assert parse_delta(session, {"class": "NoOp"}) is None
|
||||
|
||||
|
||||
def test_parse_delta_unknown(session):
|
||||
data = {"class": "Abc"}
|
||||
assert UnknownEvent(source="Delta class", data=data) == parse_delta(session, data)
|
956
tests/events/test_delta_type.py
Normal file
956
tests/events/test_delta_type.py
Normal file
@@ -0,0 +1,956 @@
|
||||
import datetime
|
||||
import pytest
|
||||
from fbchat import (
|
||||
_util,
|
||||
ParseError,
|
||||
User,
|
||||
Group,
|
||||
Message,
|
||||
MessageData,
|
||||
Poll,
|
||||
PollOption,
|
||||
PlanData,
|
||||
GuestStatus,
|
||||
UnknownEvent,
|
||||
ColorSet,
|
||||
EmojiSet,
|
||||
NicknameSet,
|
||||
AdminsAdded,
|
||||
AdminsRemoved,
|
||||
ApprovalModeSet,
|
||||
CallStarted,
|
||||
CallEnded,
|
||||
CallJoined,
|
||||
PollCreated,
|
||||
PollVoted,
|
||||
PlanCreated,
|
||||
PlanEnded,
|
||||
PlanEdited,
|
||||
PlanDeleted,
|
||||
PlanResponded,
|
||||
)
|
||||
from fbchat._events._delta_type import parse_delta
|
||||
|
||||
|
||||
def test_color_set(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You changed the chat theme to Orange.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_theme",
|
||||
"untypedData": {
|
||||
"should_show_icon": "1",
|
||||
"theme_color": "FFFF7E29",
|
||||
"accessibility_label": "Orange",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert ColorSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
color="#ff7e29",
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_emoji_set(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You set the emoji to 🌟.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:generic_admin_text"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"type": "change_thread_icon",
|
||||
"untypedData": {
|
||||
"thread_icon_url": "https://www.facebook.com/images/emoji.php/v9/te0/1/16/1f31f.png",
|
||||
"thread_icon": "🌟",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert EmojiSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
emoji="🌟",
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_nickname_set(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You set the nickname for Abc Def to abc.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_nickname",
|
||||
"untypedData": {"nickname": "abc", "participant_id": "2345"},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert NicknameSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
subject=User(session=session, id="2345"),
|
||||
nickname="abc",
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_nickname_clear(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You cleared your nickname.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:generic_admin_text"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"type": "change_thread_nickname",
|
||||
"untypedData": {"nickname": "", "participant_id": "1234"},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert NicknameSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
subject=User(session=session, id="1234"),
|
||||
nickname=None,
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_admins_added(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You added Abc Def as a group admin.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": True,
|
||||
"tags": ["source:titan:web"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_admins",
|
||||
"untypedData": {
|
||||
"THREAD_CATEGORY": "GROUP",
|
||||
"TARGET_ID": "2345",
|
||||
"ADMIN_TYPE": "0",
|
||||
"ADMIN_EVENT": "add_admin",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert AdminsAdded(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
added=[User(session=session, id="2345")],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_admins_removed(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You removed yourself as a group admin.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": True,
|
||||
"tags": ["source:titan:web"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_admins",
|
||||
"untypedData": {
|
||||
"THREAD_CATEGORY": "GROUP",
|
||||
"TARGET_ID": "1234",
|
||||
"ADMIN_TYPE": "0",
|
||||
"ADMIN_EVENT": "remove_admin",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert AdminsRemoved(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
removed=[User(session=session, id="1234")],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_approvalmode_set(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You turned on member approval and will review requests to join the group.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": True,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_approval_mode",
|
||||
"untypedData": {"APPROVAL_MODE": "1", "THREAD_CATEGORY": "GROUP"},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert ApprovalModeSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
require_admin_approval=True,
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_approvalmode_unset(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You turned off member approval. Anyone with the link can join the group.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": True,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "change_thread_approval_mode",
|
||||
"untypedData": {"APPROVAL_MODE": "0", "THREAD_CATEGORY": "GROUP"},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert ApprovalModeSet(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
require_admin_approval=False,
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_call_started(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You started a call.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "messenger_call_log",
|
||||
"untypedData": {
|
||||
"call_capture_attachments": "",
|
||||
"caller_id": "1234",
|
||||
"conference_name": "MESSENGER:134845267536444",
|
||||
"rating": "",
|
||||
"messenger_call_instance_id": "0",
|
||||
"video": "",
|
||||
"event": "group_call_started",
|
||||
"server_info": "XYZ123ABC",
|
||||
"call_duration": "0",
|
||||
"callee_id": "0",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
data2 = {
|
||||
"callState": "AUDIO_GROUP_CALL",
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": [],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
},
|
||||
"serverInfoData": "XYZ123ABC",
|
||||
"class": "RtcCallData",
|
||||
}
|
||||
assert CallStarted(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_group_call_ended(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "The call ended.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "messenger_call_log",
|
||||
"untypedData": {
|
||||
"call_capture_attachments": "",
|
||||
"caller_id": "1234",
|
||||
"conference_name": "MESSENGER:1234567890",
|
||||
"rating": "0",
|
||||
"messenger_call_instance_id": "1234567890",
|
||||
"video": "",
|
||||
"event": "group_call_ended",
|
||||
"server_info": "XYZ123ABC",
|
||||
"call_duration": "31",
|
||||
"callee_id": "0",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
data2 = {
|
||||
"callState": "NO_ONGOING_CALL",
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": [],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
},
|
||||
"class": "RtcCallData",
|
||||
}
|
||||
assert CallEnded(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
duration=datetime.timedelta(seconds=31),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_user_call_ended(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "Abc called you.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"skipSnippetUpdate": False,
|
||||
"tags": ["source:generic_admin_text", "no_push"],
|
||||
"threadKey": {"otherUserFbId": "1234"},
|
||||
"threadReadStateEffect": "KEEP_AS_IS",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"type": "messenger_call_log",
|
||||
"untypedData": {
|
||||
"call_capture_attachments": "",
|
||||
"caller_id": "1234",
|
||||
"conference_name": "MESSENGER:1234567890",
|
||||
"rating": "0",
|
||||
"messenger_call_instance_id": "1234567890",
|
||||
"video": "",
|
||||
"event": "one_on_one_call_ended",
|
||||
"server_info": "",
|
||||
"call_duration": "3",
|
||||
"callee_id": "100002950119740",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert CallEnded(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
duration=datetime.timedelta(seconds=3),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_call_joined(session):
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "Abc joined the call.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "participant_joined_group_call",
|
||||
"untypedData": {
|
||||
"server_info_data": "XYZ123ABC",
|
||||
"group_call_type": "0",
|
||||
"joining_user": "2345",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert CallJoined(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_poll_created(session):
|
||||
poll_data = {
|
||||
"id": "112233",
|
||||
"text": "A poll",
|
||||
"total_count": 2,
|
||||
"viewer_has_voted": "true",
|
||||
"options": [
|
||||
{
|
||||
"id": "1001",
|
||||
"text": "Option A",
|
||||
"total_count": 1,
|
||||
"viewer_has_voted": "true",
|
||||
"voters": ["1234"],
|
||||
},
|
||||
{
|
||||
"id": "1002",
|
||||
"text": "Option B",
|
||||
"total_count": 0,
|
||||
"viewer_has_voted": "false",
|
||||
"voters": [],
|
||||
},
|
||||
],
|
||||
}
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You created a poll: A poll.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "group_poll",
|
||||
"untypedData": {
|
||||
"added_option_ids": "[]",
|
||||
"removed_option_ids": "[]",
|
||||
"question_json": _util.json_minimal(poll_data),
|
||||
"event_type": "question_creation",
|
||||
"question_id": "112233",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PollCreated(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
poll=Poll(
|
||||
session=session,
|
||||
id="112233",
|
||||
question="A poll",
|
||||
options=[
|
||||
PollOption(
|
||||
id="1001",
|
||||
text="Option A",
|
||||
vote=True,
|
||||
voters=["1234"],
|
||||
votes_count=1,
|
||||
),
|
||||
PollOption(
|
||||
id="1002", text="Option B", vote=False, voters=[], votes_count=0
|
||||
),
|
||||
],
|
||||
options_count=2,
|
||||
),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_poll_answered(session):
|
||||
poll_data = {
|
||||
"id": "112233",
|
||||
"text": "A poll",
|
||||
"total_count": 3,
|
||||
"viewer_has_voted": "true",
|
||||
"options": [
|
||||
{
|
||||
"id": "1002",
|
||||
"text": "Option B",
|
||||
"total_count": 2,
|
||||
"viewer_has_voted": "true",
|
||||
"voters": ["1234", "2345"],
|
||||
},
|
||||
{
|
||||
"id": "1003",
|
||||
"text": "Option C",
|
||||
"total_count": 1,
|
||||
"viewer_has_voted": "true",
|
||||
"voters": ["1234"],
|
||||
},
|
||||
{
|
||||
"id": "1001",
|
||||
"text": "Option A",
|
||||
"total_count": 0,
|
||||
"viewer_has_voted": "false",
|
||||
"voters": [],
|
||||
},
|
||||
],
|
||||
}
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": 'You changed your vote to "Option B" and 1 other option in the poll: A poll.',
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "group_poll",
|
||||
"untypedData": {
|
||||
"added_option_ids": "[1002,1003]",
|
||||
"removed_option_ids": "[1001]",
|
||||
"question_json": _util.json_minimal(poll_data),
|
||||
"event_type": "update_vote",
|
||||
"question_id": "112233",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PollVoted(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
poll=Poll(
|
||||
session=session,
|
||||
id="112233",
|
||||
question="A poll",
|
||||
options=[
|
||||
PollOption(
|
||||
id="1002",
|
||||
text="Option B",
|
||||
vote=True,
|
||||
voters=["1234", "2345"],
|
||||
votes_count=2,
|
||||
),
|
||||
PollOption(
|
||||
id="1003",
|
||||
text="Option C",
|
||||
vote=True,
|
||||
voters=["1234"],
|
||||
votes_count=1,
|
||||
),
|
||||
PollOption(
|
||||
id="1001", text="Option A", vote=False, voters=[], votes_count=0
|
||||
),
|
||||
],
|
||||
options_count=3,
|
||||
),
|
||||
added_ids=["1002", "1003"],
|
||||
removed_ids=["1001"],
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_plan_created(session):
|
||||
guest_list = [
|
||||
{"guest_list_state": "INVITED", "node": {"id": "3456"}},
|
||||
{"guest_list_state": "INVITED", "node": {"id": "2345"}},
|
||||
{"guest_list_state": "GOING", "node": {"id": "1234"}},
|
||||
]
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You created a plan.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "lightweight_event_create",
|
||||
"untypedData": {
|
||||
"event_timezone": "",
|
||||
"event_creator_id": "1234",
|
||||
"event_id": "112233",
|
||||
"event_type": "EVENT",
|
||||
"event_track_rsvp": "1",
|
||||
"event_title": "A plan",
|
||||
"event_time": "1600000000",
|
||||
"event_seconds_to_notify_before": "3600",
|
||||
"guest_state_list": _util.json_minimal(guest_list),
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PlanCreated(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
plan=PlanData(
|
||||
session=session,
|
||||
id="112233",
|
||||
time=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
title="A plan",
|
||||
author_id="1234",
|
||||
guests={
|
||||
"1234": GuestStatus.GOING,
|
||||
"2345": GuestStatus.INVITED,
|
||||
"3456": GuestStatus.INVITED,
|
||||
},
|
||||
),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Need to gather test data")
|
||||
def test_plan_ended(session):
|
||||
data = {}
|
||||
assert PlanEnded(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
plan=PlanData(
|
||||
session=session,
|
||||
id="112233",
|
||||
time=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
title="A plan",
|
||||
author_id="1234",
|
||||
guests={
|
||||
"1234": GuestStatus.GOING,
|
||||
"2345": GuestStatus.INVITED,
|
||||
"3456": GuestStatus.INVITED,
|
||||
},
|
||||
),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_plan_edited(session):
|
||||
guest_list = [
|
||||
{"guest_list_state": "INVITED", "node": {"id": "3456"}},
|
||||
{"guest_list_state": "INVITED", "node": {"id": "2345"}},
|
||||
{"guest_list_state": "GOING", "node": {"id": "1234"}},
|
||||
]
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You named the plan A plan.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "lightweight_event_update",
|
||||
"untypedData": {
|
||||
"event_creator_id": "1234",
|
||||
"latitude": "0",
|
||||
"event_title": "A plan",
|
||||
"event_seconds_to_notify_before": "3600",
|
||||
"guest_state_list": _util.json_minimal(guest_list),
|
||||
"event_end_time": "0",
|
||||
"event_timezone": "",
|
||||
"event_id": "112233",
|
||||
"event_type": "EVENT",
|
||||
"event_location_id": "2233445566",
|
||||
"event_location_name": "",
|
||||
"event_time": "1600000000",
|
||||
"event_note": "",
|
||||
"longitude": "0",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PlanEdited(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
plan=PlanData(
|
||||
session=session,
|
||||
id="112233",
|
||||
time=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
title="A plan",
|
||||
location_id="2233445566",
|
||||
author_id="1234",
|
||||
guests={
|
||||
"1234": GuestStatus.GOING,
|
||||
"2345": GuestStatus.INVITED,
|
||||
"3456": GuestStatus.INVITED,
|
||||
},
|
||||
),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_plan_deleted(session):
|
||||
guest_list = [
|
||||
{"guest_list_state": "GOING", "node": {"id": "1234"}},
|
||||
{"guest_list_state": "INVITED", "node": {"id": "3456"}},
|
||||
{"guest_list_state": "INVITED", "node": {"id": "2345"}},
|
||||
]
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You deleted the plan A plan for Mon, 20 Jan at 15:30.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "lightweight_event_delete",
|
||||
"untypedData": {
|
||||
"event_end_time": "0",
|
||||
"event_timezone": "",
|
||||
"event_id": "112233",
|
||||
"event_type": "EVENT",
|
||||
"event_location_id": "2233445566",
|
||||
"latitude": "0",
|
||||
"event_title": "A plan",
|
||||
"event_time": "1600000000",
|
||||
"event_seconds_to_notify_before": "3600",
|
||||
"guest_state_list": _util.json_minimal(guest_list),
|
||||
"event_note": "",
|
||||
"longitude": "0",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PlanDeleted(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
plan=PlanData(
|
||||
session=session,
|
||||
id="112233",
|
||||
time=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
title="A plan",
|
||||
location_id="2233445566",
|
||||
author_id=None,
|
||||
guests={
|
||||
"1234": GuestStatus.GOING,
|
||||
"2345": GuestStatus.INVITED,
|
||||
"3456": GuestStatus.INVITED,
|
||||
},
|
||||
),
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_plan_participation(session):
|
||||
guest_list = [
|
||||
{"guest_list_state": "DECLINED", "node": {"id": "1234"}},
|
||||
{"guest_list_state": "GOING", "node": {"id": "2345"}},
|
||||
{"guest_list_state": "INVITED", "node": {"id": "3456"}},
|
||||
]
|
||||
data = {
|
||||
"irisSeqId": "1111111",
|
||||
"irisTags": ["DeltaAdminTextMessage", "is_from_iris_fanout"],
|
||||
"messageMetadata": {
|
||||
"actorFbId": "1234",
|
||||
"adminText": "You responded Can't Go to def.",
|
||||
"folderId": {"systemFolderId": "INBOX"},
|
||||
"messageId": "mid.$XYZ",
|
||||
"offlineThreadingId": "11223344556677889900",
|
||||
"skipBumpThread": False,
|
||||
"tags": ["source:titan:web", "no_push"],
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"threadReadStateEffect": "MARK_UNREAD",
|
||||
"timestamp": "1500000000000",
|
||||
"unsendType": "deny_log_message",
|
||||
},
|
||||
"participants": ["1234", "2345", "3456"],
|
||||
"requestContext": {"apiArgs": {}},
|
||||
"tqSeqId": "1111",
|
||||
"type": "lightweight_event_rsvp",
|
||||
"untypedData": {
|
||||
"event_creator_id": "2345",
|
||||
"guest_status": "DECLINED",
|
||||
"latitude": "0",
|
||||
"event_track_rsvp": "1",
|
||||
"event_title": "A plan",
|
||||
"event_seconds_to_notify_before": "3600",
|
||||
"guest_state_list": _util.json_minimal(guest_list),
|
||||
"event_end_time": "0",
|
||||
"event_timezone": "",
|
||||
"event_id": "112233",
|
||||
"event_type": "EVENT",
|
||||
"guest_id": "1234",
|
||||
"event_location_id": "2233445566",
|
||||
"event_time": "1600000000",
|
||||
"event_note": "",
|
||||
"longitude": "0",
|
||||
},
|
||||
"class": "AdminTextMessage",
|
||||
}
|
||||
assert PlanResponded(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
plan=PlanData(
|
||||
session=session,
|
||||
id="112233",
|
||||
time=datetime.datetime(
|
||||
2020, 9, 13, 12, 26, 40, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
title="A plan",
|
||||
location_id="2233445566",
|
||||
author_id="2345",
|
||||
guests={
|
||||
"1234": GuestStatus.DECLINED,
|
||||
"2345": GuestStatus.GOING,
|
||||
"3456": GuestStatus.INVITED,
|
||||
},
|
||||
),
|
||||
take_part=False,
|
||||
at=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
|
||||
) == parse_delta(session, data)
|
||||
|
||||
|
||||
def test_parse_delta_unknown(session):
|
||||
data = {"class": "AdminTextMessage", "type": "abc"}
|
||||
assert UnknownEvent(source="Delta type", data=data) == parse_delta(session, data)
|
137
tests/events/test_main.py
Normal file
137
tests/events/test_main.py
Normal file
@@ -0,0 +1,137 @@
|
||||
import datetime
|
||||
from fbchat import (
|
||||
_util,
|
||||
User,
|
||||
Group,
|
||||
Message,
|
||||
ParseError,
|
||||
UnknownEvent,
|
||||
Typing,
|
||||
FriendRequest,
|
||||
Presence,
|
||||
ReactionEvent,
|
||||
UnfetchedThreadEvent,
|
||||
ActiveStatus,
|
||||
)
|
||||
from fbchat._events import parse_delta, parse_events
|
||||
|
||||
|
||||
def test_t_ms_full(session):
|
||||
"""A full example of parsing of data in /t_ms."""
|
||||
payload = {
|
||||
"deltas": [
|
||||
{
|
||||
"deltaMessageReaction": {
|
||||
"threadKey": {"threadFbId": 4321},
|
||||
"messageId": "mid.$XYZ",
|
||||
"action": 0,
|
||||
"userId": 1234,
|
||||
"reaction": "😢",
|
||||
"senderId": 1234,
|
||||
"offlineThreadingId": "1122334455",
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
data = {
|
||||
"deltas": [
|
||||
{
|
||||
"payload": [ord(x) for x in _util.json_minimal(payload)],
|
||||
"class": "ClientPayload",
|
||||
},
|
||||
{"class": "NoOp",},
|
||||
{
|
||||
"forceInsert": False,
|
||||
"messageId": "mid.$ABC",
|
||||
"threadKey": {"threadFbId": "4321"},
|
||||
"class": "ForcedFetch",
|
||||
},
|
||||
],
|
||||
"firstDeltaSeqId": 111111,
|
||||
"lastIssuedSeqId": 111113,
|
||||
"queueEntityId": 1234,
|
||||
}
|
||||
thread = Group(session=session, id="4321")
|
||||
assert [
|
||||
ReactionEvent(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=thread,
|
||||
message=Message(thread=thread, id="mid.$XYZ"),
|
||||
reaction="😢",
|
||||
),
|
||||
UnfetchedThreadEvent(
|
||||
thread=thread, message=Message(thread=thread, id="mid.$ABC"),
|
||||
),
|
||||
] == list(parse_events(session, "/t_ms", data))
|
||||
|
||||
|
||||
def test_thread_typing(session):
|
||||
data = {"sender_fbid": 1234, "state": 0, "type": "typ", "thread": "4321"}
|
||||
(event,) = parse_events(session, "/thread_typing", data)
|
||||
assert event == Typing(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=Group(session=session, id="4321"),
|
||||
status=False,
|
||||
)
|
||||
|
||||
|
||||
def test_orca_typing_notifications(session):
|
||||
data = {"type": "typ", "sender_fbid": 1234, "state": 1}
|
||||
(event,) = parse_events(session, "/orca_typing_notifications", data)
|
||||
assert event == Typing(
|
||||
author=User(session=session, id="1234"),
|
||||
thread=User(session=session, id="1234"),
|
||||
status=True,
|
||||
)
|
||||
|
||||
|
||||
def test_friend_request(session):
|
||||
data = {"type": "jewel_requests_add", "from": "1234"}
|
||||
(event,) = parse_events(session, "/legacy_web", data)
|
||||
assert event == FriendRequest(author=User(session=session, id="1234"))
|
||||
|
||||
|
||||
def test_orca_presence_inc(session):
|
||||
data = {
|
||||
"list_type": "inc",
|
||||
"list": [
|
||||
{"u": 1234, "p": 0, "l": 1500000000, "vc": 74},
|
||||
{"u": 2345, "p": 2, "c": 9969664, "vc": 10},
|
||||
],
|
||||
}
|
||||
(event,) = parse_events(session, "/orca_presence", data)
|
||||
la = datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc)
|
||||
assert event == Presence(
|
||||
statuses={
|
||||
"1234": ActiveStatus(active=False, last_active=la),
|
||||
"2345": ActiveStatus(active=True),
|
||||
},
|
||||
full=False,
|
||||
)
|
||||
|
||||
|
||||
def test_orca_presence_full(session):
|
||||
data = {
|
||||
"list_type": "full",
|
||||
"list": [
|
||||
{"u": 1234, "p": 2, "c": 5767242},
|
||||
{"u": 2345, "p": 2, "l": 1500000000},
|
||||
{"u": 3456, "p": 2, "c": 9961482},
|
||||
{"u": 4567, "p": 0, "l": 1500000000},
|
||||
{"u": 5678, "p": 0},
|
||||
{"u": 6789, "p": 2, "c": 14168154},
|
||||
],
|
||||
}
|
||||
(event,) = parse_events(session, "/orca_presence", data)
|
||||
la = datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc)
|
||||
assert event == Presence(
|
||||
statuses={
|
||||
"1234": ActiveStatus(active=True),
|
||||
"2345": ActiveStatus(active=True, last_active=la),
|
||||
"3456": ActiveStatus(active=True),
|
||||
"4567": ActiveStatus(active=False, last_active=la),
|
||||
"5678": ActiveStatus(active=False),
|
||||
"6789": ActiveStatus(active=True),
|
||||
},
|
||||
full=True,
|
||||
)
|
Reference in New Issue
Block a user