import datetime import pytest from fbchat import ParseError, _util from fbchat._session import ( parse_server_js_define, base36encode, prefix_url, generate_message_id, session_factory, client_id_factory, find_form_request, get_error_data, ) def test_parse_server_js_define_old(): html = """ some data;require("TimeSliceImpl").guard(function(){(require("ServerJSDefine")).handleDefines([["DTSGInitialData",[],{"token":"123"},100]]) other irrelevant data """ define = parse_server_js_define(html) assert define == { "DTSGInitialData": {"token": "123"}, "DTSGInitData": {"async_get_token": "12345", "token": "123"}, } def test_parse_server_js_define_new(): html = """ some data;require("TimeSliceImpl").guard(function(){new (require("ServerJS"))().handle({"define":[["DTSGInitialData",[],{"token":""},100]],"require":[...]});}, "ServerJS define", {"root":true})(); more data other irrelevant data """ define = parse_server_js_define(html) assert define == { "DTSGInitialData": {"token": ""}, "DTSGInitData": {"async_get_token": "", "token": ""}, } def test_parse_server_js_define_error(): with pytest.raises(ParseError, match="Could not find any"): parse_server_js_define("") html = 'function(){(require("ServerJSDefine")).handleDefines([{"a": function(){}}])' with pytest.raises(ParseError, match="Invalid"): parse_server_js_define(html + html) html = 'function(){require("ServerJSDefine").handleDefines({"a": "b"})' with pytest.raises(ParseError, match="Invalid"): parse_server_js_define(html + html) @pytest.mark.parametrize( "number,expected", [(1, "1"), (10, "a"), (123, "3f"), (1000, "rs"), (123456789, "21i3v9")], ) def test_base36encode(number, expected): assert base36encode(number) == expected def test_prefix_url(): static_url = "https://upload.messenger.com/" assert prefix_url(static_url) == static_url assert prefix_url("/") == "https://www.messenger.com/" assert prefix_url("/abc") == "https://www.messenger.com/abc" def test_generate_message_id(): # Returns random output, so hard to test more thoroughly assert generate_message_id(_util.now(), "def") def test_session_factory(): session = session_factory() assert session.headers def test_client_id_factory(): # Returns random output, so hard to test more thoroughly assert client_id_factory() def test_find_form_request(): html = """