def test_handle_user_no_permission(opsdroid):
    response = {
        "update_id": 639974077,
        "message": {
            "message_id": 31,
            "from": {
                "id": 100000,
                "is_bot": False,
                "username": "******"
            },
            "chat": {
                "id": -10014170000,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603827368,
            "text": "hi",
        },
    }

    connector_config["whitelisted-users"] = [1, "AllowedUser"]

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    permission = connector.handle_user_permission(response, "FabioRosado",
                                                  100000)

    assert permission is False
async def test_connect_failure(opsdroid, caplog):
    caplog.set_level(logging.ERROR)

    opsdroid.config["web"] = {"base-url": "https://test.com"}
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    connector.webhook_secret = "test_secret"

    opsdroid.web_server = amock.Mock()
    response = amock.Mock()

    response.status = 404

    with amock.patch(
            "aiohttp.ClientSession.post",
            new=amock.CoroutineMock()) as patched_request, amock.patch.object(
                connector, "build_url") as mocked_build_url:
        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(response)

        await connector.connect()

        assert opsdroid.web_server.web_app.router.add_post.called
        assert patched_request is not None
        assert mocked_build_url.called
        assert "Error when connecting to Telegram" in caplog.text
def test_get_user_from_forwarded_message(opsdroid):
    response = {
        "update_id": 639974077,
        "message": {
            "message_id": 31,
            "from": {
                "id": 100000,
                "is_bot": False,
                "first_name": "Telegram"
            },
            "chat": {
                "id": -10014170000,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603827368,
            "forward_from_chat": {
                "id": -10014740000,
                "title": "Opsdroid-test",
                "type": "channel",
            },
            "forward_from_message_id": 15,
            "forward_signature": "Fabio Rosado",
            "forward_date": 1603827365,
            "text": "hi",
        },
    }

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    user, user_id = connector.get_user(response, "Opsdroid!")

    assert user == "Fabio Rosado"
    assert user_id == 100000
def test_get_user_from_username(opsdroid):
    response = {
        "update_id": 639974077,
        "message": {
            "message_id": 31,
            "from": {
                "id": 100000,
                "is_bot": False,
                "username": "******"
            },
            "chat": {
                "id": -10014170000,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603827368,
            "text": "hi",
        },
    }

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    user, user_id = connector.get_user(response, "")

    assert user == "FabioRosado"
    assert user_id == 100000
Exemple #5
0
 def test_init(self):
     """Test that the connector is initialised properly."""
     connector = ConnectorTelegram(
         {"name": "telegram", "token": "test"}, opsdroid=OpsDroid()
     )
     self.assertEqual(None, connector.default_target)
     self.assertEqual("telegram", connector.name)
async def test_respond_file_failure(opsdroid, caplog):
    caplog.set_level(logging.DEBUG)

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    post_response = amock.Mock()
    post_response.status = 400

    file_bytes = b"plain text file example"

    file = opsdroid_events.File(file_bytes=file_bytes, target={"id": "123"})

    with amock.patch(
            "aiohttp.ClientSession.post",
            new=amock.CoroutineMock()) as patched_request, amock.patch.object(
                connector, "build_url") as mocked_build_url:

        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(post_response)

        await connector.send_file(file)

        assert mocked_build_url.called
        assert patched_request.called
        assert "Unable to send file" in caplog.text
async def test_respond_image_failure(opsdroid, caplog):
    caplog.set_level(logging.DEBUG)

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    post_response = amock.Mock()
    post_response.status = 400

    gif_bytes = (b"GIF89a\x01\x00\x01\x00\x00\xff\x00,"
                 b"\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x00;")

    image = opsdroid_events.Image(file_bytes=gif_bytes, target={"id": "123"})

    with amock.patch(
            "aiohttp.ClientSession.post",
            new=amock.CoroutineMock()) as patched_request, amock.patch.object(
                connector, "build_url") as mocked_build_url:

        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(post_response)

        await connector.send_image(image)

        assert mocked_build_url.called
        assert patched_request.called
        assert "Unable to send image" in caplog.text
async def test_respond_failure(opsdroid, caplog):
    caplog.set_level(logging.DEBUG)

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    response = amock.Mock()
    response.status = 500

    with amock.patch(
            "aiohttp.ClientSession.post",
            new=amock.CoroutineMock()) as patched_request, amock.patch.object(
                connector, "build_url") as mocked_build_url:
        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(response)

        assert opsdroid.__class__.instances

        test_message = opsdroid_events.Message(
            text="This is a test",
            user="******",
            target={"id": 12404},
            connector=connector,
        )

        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(response)

        await test_message.respond("Response")

        assert patched_request.called
        assert mocked_build_url.called
        assert "Responding" in caplog.text
        assert "Unable to respond" in caplog.text
async def test_contact_event(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 1,
        "message": {
            "chat": {
                "id": 321
            },
            "from": {
                "id": 123
            },
            "contact": {
                "phone_number": 123456,
                "first_name": "opsdroid"
            },
        },
    }

    contact_event = telegram_events.Contact(
        {
            "phone_number": 123456,
            "first_name": "opsdroid"
        }, 123456, "opsdroid")

    await connector.telegram_webhook_handler(mock_request)

    assert contact_event.first_name == "opsdroid"
    assert contact_event.phone_number == 123456
async def test_parse_user_permissions(opsdroid):
    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974077,
        "message": {
            "message_id": 31,
            "from": {
                "id": 100000,
                "is_bot": False,
                "username": "******"
            },
            "chat": {
                "id": -10014170000,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603827368,
            "text": "hi",
        },
    }

    connector_config["whitelisted-users"] = ["FabioRosado", 100000]

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    with amock.patch.object(connector.opsdroid, "parse") as mocked_parse:

        await connector.telegram_webhook_handler(mock_request)

        assert mocked_parse.called
 def test_init(self):
     """Test that the connector is initialised properly."""
     connector = ConnectorTelegram({
         'name': 'telegram',
         'token': 'test',
     })
     self.assertEqual(None, connector.default_room)
     self.assertEqual("telegram", connector.name)
 def setUp(self):
     configure_lang({})
     self.connector = ConnectorTelegram(
         {
             'name': 'telegram',
             'token': 'bot:765test',
             'whitelisted-users': ['user', 'test']
         },
         opsdroid=OpsDroid())
async def test_reply_to_message_event(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974084,
        "message": {
            "message_id": 1272,
            "from": {
                "id": 639348,
                "is_bot": False,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "language_code": "en",
            },
            "chat": {
                "id": 639348,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "type": "private",
            },
            "date": 1603834922,
            "reply_to_message": {
                "message_id": 1271,
                "from": {
                    "id": 639348,
                    "is_bot": False,
                    "first_name": "Fabio",
                    "last_name": "Rosado",
                    "username": "******",
                    "language_code": "en",
                },
                "chat": {
                    "id": 63948,
                    "first_name": "Fabio",
                    "last_name": "Rosado",
                    "username": "******",
                    "type": "private",
                },
                "date": 1603834912,
                "text": "Hi",
            },
            "text": "This is a reply",
        },
    }

    reply_message = opsdroid_events.Reply("This is a reply", 639348,
                                          "FabioRosado", 63948)

    await connector.telegram_webhook_handler(mock_request)

    assert "This is a reply" in reply_message.text
    assert "FabioRosado" in reply_message.user
    assert reply_message.target == 63948
Exemple #14
0
 def test_init(self):
     """Test that the connector is initialised properly."""
     connector = ConnectorTelegram(
         {"name": "telegram", "token": "test", "update-interval": 0.2},
         opsdroid=OpsDroid(),
     )
     self.assertEqual(None, connector.default_target)
     self.assertEqual("telegram", connector.name)
     self.assertEqual(0.2, connector.update_interval)
def test_init_no_base_url(opsdroid, caplog):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)
    caplog.set_level(logging.ERROR)

    assert connector.name == "telegram"
    assert connector.token == "test:token"
    assert connector.whitelisted_users is None
    assert connector.webhook_secret is not None
    assert connector.base_url is None
    assert "Breaking changes introduced" in caplog.text
Exemple #16
0
 def setUp(self):
     configure_lang({})
     self.connector = ConnectorTelegram(
         {
             'name': 'telegram',
             'token': 'bot:765test',
             'whitelisted-users': ['user', 'test', 'AnUser']
         },
         opsdroid=OpsDroid())
     with amock.patch('aiohttp.ClientSession') as mocked_session:
         self.connector.session = mocked_session
def test_get_user_from_channel_without_signature(opsdroid):
    response = {
        "update_id": 639974076,
        "channel_post": {
            "message_id": 16,
            "chat": {
                "id": -1001474700000,
                "title": "Opsdroid-test",
                "type": "channel"
            },
            "date": 1603827365,
            "text": "hi",
        },
    }

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    user, user_id = connector.get_user(response, "Opsdroid!")

    assert user == "Opsdroid!"
    assert user_id == 16
Exemple #18
0
 def setUp(self):
     configure_lang({})
     self.connector = ConnectorTelegram(
         {
             "name": "telegram",
             "token": "bot:765test",
             "whitelisted-users": ["user", "test", "AnUser"],
         },
         opsdroid=OpsDroid(),
     )
     with amock.patch("aiohttp.ClientSession") as mocked_session:
         self.connector.session = mocked_session
def test_init(opsdroid):
    config = {
        "token": "test:token",
        "whitelisted-users": ["bob", 1234],
        "bot-name": "bot McBotty",
    }

    connector = ConnectorTelegram(config, opsdroid=opsdroid)

    opsdroid.config["web"] = {"base-url": "https://test.com"}

    assert connector.name == "telegram"
    assert connector.token == "test:token"
    assert connector.whitelisted_users == ["bob", 1234]
    assert connector.bot_name == "bot McBotty"
    assert connector.webhook_secret is not None
async def test_unparseable_event(opsdroid, caplog):
    caplog.set_level(logging.DEBUG)

    opsdroid.config["web"] = {"base-url": "https://test.com"}

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    message = {
        "update_id": 1,
        "message": {
            "message_id": 1279,
            "from": {
                "id": 639889348,
                "is_bot": False,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "language_code": "en",
            },
            "chat": {
                "id": 639889348,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "type": "private",
            },
            "date": 1604013500,
            "sticker": {
                "width": 512,
                "height": 512,
                "emoji": "👌",
                "set_name": "HotCherry",
                "is_animated": True,
                "file_size": 42311,
            },
        },
    }
    event = await connector.handle_messages(message, "opsdroid", 0, 1)

    assert "Received unparsable event" in caplog.text
    assert event is None
async def test_location_event(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974101,
        "message": {
            "message_id": 42,
            "from": {
                "id": 1087968824,
                "is_bot": True,
                "first_name": "Group",
                "username": "******",
            },
            "chat": {
                "id": -1001417735217,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603992829,
            "location": {
                "latitude": 56.159849,
                "longitude": -5.230604
            },
        },
    }

    event_location = telegram_events.Location(
        {"location": {
            "latitude": 56.159849,
            "longitude": -5.230604
        }},
        56.159849,
        -5.230604,
    )

    await connector.telegram_webhook_handler(mock_request)

    assert event_location.latitude == 56.159849
    assert event_location.longitude == -5.230604
async def test_disconnect_failure(opsdroid, caplog):
    caplog.set_level(logging.DEBUG)

    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    response = amock.Mock()
    response.status = 400

    with amock.patch(
            "aiohttp.ClientSession.get",
            new=amock.CoroutineMock()) as patched_request, amock.patch.object(
                connector, "build_url") as mocked_build_url:

        patched_request.return_value = asyncio.Future()
        patched_request.return_value.set_result(response)

        await connector.disconnect()

        assert mocked_build_url.called
        assert patched_request.called
        assert "Sending deleteWebhook" in caplog.text
        assert "Unable to delete webhook" in caplog.text
async def test_edited_message_event(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974040,
        "edited_message": {
            "message_id": 1247,
            "from": {
                "id": 6399348,
                "is_bot": False,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "language_code": "en",
            },
            "chat": {
                "id": 6399348,
                "first_name": "Fabio",
                "last_name": "Rosado",
                "username": "******",
                "type": "private",
            },
            "date": 1603818326,
            "edit_date": 1603818330,
            "text": "hi",
        },
    }

    edited_message = opsdroid_events.EditedMessage("hi", 6399348, "Fabio",
                                                   6399348)

    await connector.telegram_webhook_handler(mock_request)

    assert "hi" in edited_message.text
    assert "Fabio" in edited_message.user
    assert edited_message.target == 6399348
    assert edited_message.user_id == 6399348
async def test_channel_post(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974037,
        "channel_post": {
            "message_id": 4,
            "chat": {
                "id": -1001474709998,
                "title": "Opsdroid-test",
                "type": "channel"
            },
            "date": 1603817533,
            "text": "dance",
        },
    }

    message = opsdroid_events.Message("dance", 4, opsdroid)
    await connector.telegram_webhook_handler(mock_request)

    assert message.text == "dance"
Exemple #25
0
 def test_missing_token(self):
     """Test that attempt to connect without info raises an error."""
     ConnectorTelegram({}, opsdroid=OpsDroid())
     self.assertLogs('_LOGGER', 'error')
 def setUp(self):
     self.connector = ConnectorTelegram({
             'name': 'telegram',
             'token': 'bot:765test',
             'whitelisted-users': ['user', 'test']
         })
def test_build_url(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    url = connector.build_url("getUpdates")

    assert url == "https://api.telegram.org/bottest:token/getUpdates"
async def test_poll_event(opsdroid):
    connector = ConnectorTelegram(connector_config, opsdroid=opsdroid)

    mock_request = amock.CoroutineMock()
    mock_request.json = amock.CoroutineMock()
    mock_request.json.return_value = {
        "update_id": 639974103,
        "message": {
            "message_id": 44,
            "from": {
                "id": 1087968824,
                "is_bot": True,
                "first_name": "Group",
                "username": "******",
            },
            "chat": {
                "id": -1001417735217,
                "title": "Opsdroid-test Chat",
                "type": "supergroup",
            },
            "date": 1603993170,
            "poll": {
                "id":
                "5825895662671101957",
                "question":
                "Test",
                "options": [
                    {
                        "text": "Test",
                        "voter_count": 0
                    },
                    {
                        "text": "Testing",
                        "voter_count": 0
                    },
                ],
                "total_voter_count":
                0,
                "is_closed":
                False,
                "is_anonymous":
                True,
                "type":
                "regular",
                "allows_multiple_answers":
                False,
            },
        },
    }

    poll_event = telegram_events.Poll(
        {
            "question": "question",
            "option": ["option1", "option2"],
            "total_voter_count": 1,
        },
        "question",
        ["option1", "option2"],
        1,
    )

    await connector.telegram_webhook_handler(mock_request)

    assert poll_event.question == "question"
    assert poll_event.options == ["option1", "option2"]
    assert poll_event.total_votes == 1