async def test_process_message(self): """Test processing a slack message.""" connector = ConnectorSlack({"api-token": "abc123"}) connector.lookup_username = amock.CoroutineMock() connector.lookup_username.return_value = {"name": "testuser"} connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() message = { # https://api.slack.com/events/message "type": "message", "channel": "C2147483705", "user": "******", "text": "Hello, world!", "ts": "1355517523.000005", "edited": { "user": "******", "ts": "1355517536.000001" } } await connector.process_message(message) self.assertTrue(connector.opsdroid.parse.called) connector.opsdroid.parse.reset_mock() message["subtype"] = "bot_message" await connector.process_message(message) self.assertFalse(connector.opsdroid.parse.called) del message["subtype"] connector.opsdroid.parse.reset_mock() connector.lookup_username.side_effect = ValueError await connector.process_message(message) self.assertFalse(connector.opsdroid.parse.called)
async def test_message_action_interactivity(self): """Test the message_action interactivity type in Slack interactions handler.""" connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid()) connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() req_ob = { "token": "Nj2rfC2hU8mAfgaJLemZgO7H", "callback_id": "chirp_message", "type": "message_action", "trigger_id": "13345224609.8534564800.6f8ab1f53e13d0cd15f96106292d5536", "response_url": "https://hooks.slack.com/app-actions/T0MJR11A4/21974584944/yk1S9ndf35Q1flupVG5JbpM6", "team": {"id": "T0MJRM1A7", "domain": "pandamonium"}, "channel": {"id": "D0LFFBKLZ", "name": "cats"}, "user": {"id": "U0D15K92L", "name": "dr_maomao"}, "message": { "type": "message", "user": "******", "ts": "1516229207.000133", "text": "World's smallest big cat! <https://youtube.com/watch?v=W86cTIoMv2U>", }, } mock_request = amock.CoroutineMock() mock_request.post = amock.CoroutineMock() mock_request.post.return_value = {"payload": json.dumps(req_ob)} response = await connector.slack_interactions_handler(mock_request) self.assertTrue(connector.opsdroid.parse.called) self.assertEqual(type(response), aiohttp.web.Response) self.assertEqual(response.status, 200)
async def test_process_message(self): """Test processing a slack message.""" connector = ConnectorSlack({"api-token": "abc123"}, opsdroid=OpsDroid()) connector.lookup_username = amock.CoroutineMock() connector.lookup_username.return_value = {"name": "testuser"} connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() message = { # https://api.slack.com/events/message "type": "message", "channel": "C2147483705", "user": "******", "text": "Hello, world!", "ts": "1355517523.000005", "edited": { "user": "******", "ts": "1355517536.000001" } } await connector.process_message(message) self.assertTrue(connector.opsdroid.parse.called) connector.opsdroid.parse.reset_mock() message["subtype"] = "bot_message" await connector.process_message(message) self.assertFalse(connector.opsdroid.parse.called) del message["subtype"] connector.opsdroid.parse.reset_mock() connector.lookup_username.side_effect = ValueError await connector.process_message(message) self.assertFalse(connector.opsdroid.parse.called)
async def test_view_closed_interactivity(self): """Test the view_closed interactivity type in Slack interactions handler.""" connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid()) connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() req_ob = { "type": "view_closed", "team": { "id": "TXXXXXX", "domain": "coverbands" }, "user": { "id": "UXXXXXX", "name": "dreamweaver" }, "view": { "id": "VNHU13V36", "type": "modal", "private_metadata": "shhh-its-secret", "callback_id": "modal-with-inputs", "state": { "values": { "multi-line": { "ml-value": { "type": "plain_text_input", "value": "This is my example inputted value", } } } }, "hash": "156663117.cd33ad1f", }, "api_app_id": "AXXXXXX", "is_cleared": False, } mock_request = amock.CoroutineMock() mock_request.post = amock.CoroutineMock() mock_request.post.return_value = {"payload": json.dumps(req_ob)} response = await connector.slack_interactions_handler(mock_request) self.assertTrue(connector.opsdroid.parse.called) self.assertEqual(type(response), aiohttp.web.Response) self.assertEqual(response.status, 200)
async def test_view_submission_interactivity(self): """Test the view_submission interactivity type in Slack interactions handler.""" connector = ConnectorSlack({"token": "abc123"}, opsdroid=self.od) connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() req_ob = { "type": "view_submission", "team": { "id": "T0MJRM1A7", "domain": "pandamonium" }, "user": { "id": "U0D15K92L", "name": "dr_maomao" }, "view": { "id": "VNHU13V36", "type": "modal", "private_metadata": "shhh-its-secret", "callback_id": "modal-with-inputs", "state": { "values": { "multi-line": { "ml-value": { "type": "plain_text_input", "value": "This is my example inputted value", } } } }, "hash": "156663117.cd33ad1f", }, } mock_request = amock.CoroutineMock() mock_request.post = amock.CoroutineMock() mock_request.post.return_value = {"payload": json.dumps(req_ob)} response = await connector.slack_interactions_handler(mock_request) self.assertTrue(connector.opsdroid.parse.called) self.assertEqual(type(response), aiohttp.web.Response) self.assertEqual(response.status, 200)
async def test_block_actions_interactivity(self): """Test the block_actions interactivity type in Slack interactions handler.""" connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid()) connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() req_ob = { "type": "block_actions", "team": {"id": "T9TK3CUKW", "domain": "example"}, "user": { "id": "UA8RXUSPL", "username": "******", "team_id": "T9TK3CUKW", }, "channel": {"id": "CBR2V3XEX", "name": "review-updates"}, "actions": [ { "action_id": "WaXA", "block_id": "=qXel", "text": {"type": "plain_text", "text": "View", "emoji": True}, "value": "click_me_123", "type": "button", "action_ts": "1548426417.840180", } ], } mock_request = amock.CoroutineMock() mock_request.post = amock.CoroutineMock() mock_request.post.return_value = {"payload": json.dumps(req_ob)} response = await connector.slack_interactions_handler(mock_request) self.assertTrue(connector.opsdroid.parse.called) self.assertEqual(type(response), aiohttp.web.Response) self.assertEqual(response.status, 200)
async def test_block_actions_interactivity(self): """Test the block_actions interactivity type in Slack interactions handler.""" connector = ConnectorSlack({"token": "abc123"}, opsdroid=OpsDroid()) connector.opsdroid = amock.CoroutineMock() connector.opsdroid.parse = amock.CoroutineMock() req_ob = { "type": "block_actions", "team": { "id": "T9TK3CUKW", "domain": "example" }, "user": { "id": "UA8RXUSPL", "username": "******", "team_id": "T9TK3CUKW", }, "channel": { "id": "CBR2V3XEX", "name": "review-updates" }, "actions": [ { "action_id": "WaXA", "block_id": "=qXel", "text": { "type": "plain_text", "text": "View", "emoji": True }, "value": "click_me_123", "type": "button", "action_ts": "1548426417.840180", }, { "type": "overflow", "block_id": "B5XNP", "action_id": "BnhtF", "selected_option": { "text": { "type": "plain_text", "text": "Option 1", "emoji": True, }, "value": "value-0", }, "action_ts": "1576336883.317406", }, { "type": "datepicker", "block_id": "CAwR", "action_id": "VS+", "selected_date": "2019-12-31", "initial_date": "1990-04-28", "action_ts": "1576337318.133466", }, { "type": "multi_static_select", "block_id": "rOL", "action_id": "Cd9", "selected_options": [ { "text": { "type": "plain_text", "text": "Choice 1", "emoji": True, }, "value": "value-0", }, { "text": { "type": "plain_text", "text": "Choice 2", "emoji": True, }, "value": "value-1", }, ], "placeholder": { "type": "plain_text", "text": "Select items", "emoji": True, }, "action_ts": "1576337351.609054", }, { "type": "static_select", "block_id": "OGN1", "action_id": "4jd", "selected_option": { "text": { "type": "plain_text", "text": "Choice 2", "emoji": True, }, "value": "value-1", }, "placeholder": { "type": "plain_text", "text": "Select an item", "emoji": True, }, "action_ts": "1576337378.859991", }, ], } mock_request = amock.CoroutineMock() mock_request.post = amock.CoroutineMock() mock_request.post.return_value = {"payload": json.dumps(req_ob)} response = await connector.slack_interactions_handler(mock_request) self.assertTrue(connector.opsdroid.parse.called) self.assertEqual(connector.opsdroid.parse.call_count, len(req_ob["actions"])) self.assertEqual(type(response), aiohttp.web.Response) self.assertEqual(response.status, 200)