#! /usr/bin/env python # -*- coding: utf-8 -*- # S.D.G """ Test IRC connector """ # Imports import os import json import phabricator import lugito import pytest from lugito.connectors import irc # docEbrown - 20181120 # There is a bug in inspect.unwrap preventing the import of call directly import unittest.mock from unittest.mock import MagicMock, patch # Setup ############################################################### lugito.config.CONFIG = { 'phabricator': { 'host': 'http://127.0.0.1:9091/api/', 'token': 'api-nojs2ip33hmp4zn6u6cf72w7d6yh', 'hooks': { 'diffhook': 'vglzi6t4gsumnilv27r27no7rs3vgs75', 'commithook': 'znkyfflbcia5gviqx5ybad7s6uyfywxi', }, }, 'connectors': { 'irc': { 'host': 'irc.freenode.net', 'port': '6697', 'username': 'someusername', 'password': 'somepassword', 'channel': '#somechannel', }, 'launchpad': { 'application': 'lugito', 'staging': 'production', 'version': 'devel', 'supported_versions': ['Cosmic', 'Bionic', 'Xenial', 'Trusty'], }, }, } # Tests ############################################################### def test_init(): """Test initialise irc connector""" obj = irc() assert('irc.freenode.net' == obj.host) assert(6697 == obj.port) assert('someusername' == obj.username) assert('somepassword' == obj.password) assert('#somechannel' == obj.channel) assert('http://127.0.0.1:9091/' == obj.phab_host) @patch('phabricator.Phabricator') def test_connect(phab_mock): """Test initial connection""" obj = irc() assert(phab_mock.is_called()) @patch('phabricator.Phabricator') def test_send(phab_mock): """Test sending a message""" obj = irc() obj.send_notice = MagicMock() objectstr = "objectstr" who = "who" body = "body" link = "link" obj.send(objectstr, who, body, link) obj.send_notice.assert_called_with( '\x033[\x03\x0313objectstr\x03\x033]\x03 \x0315who\x03 body: \x032link\x03') @patch('phabricator.Phabricator') def test_send_kwargs(phab_mock): """Test sending a message - kwargs""" obj = irc() obj.send_notice = MagicMock() objectstr = "objectstr" who = "who" body = "body" link = "link" obj.send(objectstr=objectstr, who=who, body=body, link=link) obj.send_notice.assert_called_with( '\x033[\x03\x0313objectstr\x03\x033]\x03 \x0315who\x03 body: \x032link\x03') def test_connect(): """Test connect""" obj = irc(sleep_delay=0) obj._send_raw = MagicMock() obj._setup_connection = MagicMock() obj.conn = MagicMock() obj.conn.recv.side_effect = [ b'No Ident response', b'You are now identified', b'477', b'433', b'PING: something', b'366', ] obj.connect() # No Ident response results assert(unittest.mock.call('NICK someusername1\r\n') in\ obj._send_raw.call_args_list) assert(unittest.mock.call('USER someusername * * :someusername\r\n') in\ obj._send_raw.call_args_list) assert(unittest.mock.call('PRIVMSG nickserv :identify someusername'\ ' somepassword\r\n') in obj._send_raw.call_args_list) # Now identified / 477 assert(unittest.mock.call('JOIN #somechannel\r\n') in\ obj._send_raw.call_args_list) # 433 assert(unittest.mock.call('NICK someusername1\r\n') in\ obj._send_raw.call_args_list) assert(unittest.mock.call('USER someusername1 * * :someusername1\r\n') in\ obj._send_raw.call_args_list) # Ping assert(unittest.mock.call('PONG : something\r\n') in\ obj._send_raw.call_args_list) # docEbrown - 20181120 # Address including anchors in reference # https://phab.lubuntu.me/T88#3230 def test_get_task_info_with_anchor(): """Test getting task info with anchor""" obj = irc() obj.send_notice = MagicMock() obj.phab = MagicMock() obj.phab.maniphest.info = MagicMock( return_value={ 'priorityColor': 'pink', 'statusName': 'Open', 'title': 'Fix shortcuts related to Super key', 'uri': 'https://phab.lubuntu.me/T154' } ) link_with_anchor = 'https://phab.lubuntu.me/T154#3228' obj.get_task_info(link_with_anchor) assert(unittest.mock.call(task_id=154) in\ obj.phab.maniphest.info.call_args_list) assert(obj.send_notice.call_args == \ unittest.mock.call('\x033[\x03\x035Unbreak Now!, Open\x03\x033]\x03 ' 'Fix shortcuts related to Super key: '\ '\x032https://phab.lubuntu.me/T154#3228\x03')) def test_get_diff_info_with_anchor(): """Test getting diff info with anchor""" obj = irc() obj.send_notice = MagicMock() obj.phab = MagicMock() obj.phab.differential.query = MagicMock( return_value=[{ 'statusName': 'Closed', 'title': 'Some diff title', 'uri': 'https://phab.lubuntu.me/D24' },] ) link_with_anchor = 'https://phab.lubuntu.me/D24#123' obj.get_task_info(link_with_anchor) assert(unittest.mock.call(ids=[24]) in\ obj.phab.differential.query.call_args_list) assert(obj.send_notice.call_args == \ unittest.mock.call('\x033[\x03Closed\x03\x033]\x03 ' 'Some diff title: '\ '\x032https://phab.lubuntu.me/D24#123\x03')) def test_get_task_info_with_error_anchor(): """Test getting task info with anchor""" obj = irc() obj.send_notice = MagicMock() obj.phab = MagicMock() obj.phab.maniphest.info = MagicMock(side_effect=ValueError('')) link_with_anchor = 'https://phab.lubuntu.me/T154#3228' obj.get_task_info(link_with_anchor) assert(obj.send_notice.call_args == unittest.mock.call('\x034Error: https://phab.lubuntu.me/T154#3228'\ ' is an invalid task reference.\x03')) def test_get_task_info_with_error_no_anchor(): """Test getting task info with no anchor""" obj = irc() obj.send_notice = MagicMock() obj.phab = MagicMock() obj.phab.maniphest.info = MagicMock(side_effect=ValueError('')) link_with_anchor = 'https://phab.lubuntu.me/T154' obj.get_task_info(link_with_anchor) assert(obj.send_notice.call_args == unittest.mock.call('\x034Error: https://phab.lubuntu.me/T154'\ ' is an invalid task reference.\x03'))