Exemple #1
0
    def test_logoff_agent(self):
        agent_id = 10
        agent_number = '10'
        queue_name = 'q1'
        queue = Mock()
        queue.name = queue_name
        agent_status = Mock()
        agent_status.agent_id = agent_id
        agent_status.agent_number = agent_number
        agent_status.login_at = datetime.datetime.utcnow()
        agent_status.queues = [queue]
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'), Mock(uuid='43')
        ]

        self.logoff_action.logoff_agent(agent_status)

        self.ami_client.queue_remove.assert_called_once_with(
            queue_name, agent_status.interface)
        self.queue_log_manager.on_agent_logged_off.assert_called_once_with(
            agent_number, agent_status.extension, agent_status.context, ANY)
        self.agent_status_dao.remove_agent_from_all_queues.assert_called_once_with(
            agent_id)
        self.agent_status_dao.log_off_agent.assert_called_once_with(agent_id)
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10,
                                   AgentStatusUpdateEvent.STATUS_LOGGED_OUT),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True
            },
        )
Exemple #2
0
    def test_login_agent_on_line(self):
        agent_id = 10
        line_id = 12
        agent_number = '10'
        queue = Mock()
        agent = Mock(user_ids=[])
        agent.id = agent_id
        agent.number = agent_number
        agent.queues = [queue]
        extension = '1001'
        context = 'default'
        state_interface_sip = 'PJSIP/abcd'
        skills = format_agent_skills(agent_id)
        tenant_uuid = '00000000-0000-4000-8000-000000001234'

        self.line_dao.get_interface_from_line_id.return_value = state_interface_sip
        self.line_dao.get_main_extension_context_from_line_id.return_value = (
            extension,
            context,
        )
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'),
            Mock(uuid='43'),
        ]
        self.amid_client.action.return_value = [{'Response': 'Ok'}]
        self.agent_dao.agent_with_id.return_value = Mock(tenant_uuid=tenant_uuid)

        self.login_action.login_agent_on_line(agent, line_id)

        self.agent_status_dao.log_in_agent.assert_called_once_with(
            agent_id, agent_number, extension, context, ANY, state_interface_sip
        )
        self.agent_status_dao.add_agent_to_queues.assert_called_once_with(
            agent_id, agent.queues
        )
        self.queue_log_manager.on_agent_logged_in.assert_called_once_with(
            agent_number, extension, context
        )
        self.amid_client.action.assert_called_once_with(
            'QueueAdd',
            {
                'Queue': queue.name,
                'Interface': ANY,
                'MemberName': ANY,
                'StateInterface': state_interface_sip,
                'Penalty': queue.penalty,
                'Skills': skills,
            },
        )
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10, AgentStatusUpdateEvent.STATUS_LOGGED_IN),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True,
                'tenant_uuid': tenant_uuid,
            },
        )
    def test_logoff_agent(self):
        agent_id = 10
        user_id = 42
        agent_number = '10'
        queue_name = 'q1'
        queue = Mock()
        queue.name = queue_name
        agent_status = Mock(user_ids=[user_id])
        agent_status.agent_id = agent_id
        agent_status.agent_number = agent_number
        agent_status.login_at = datetime.datetime.utcnow()
        agent_status.queues = [queue]
        tenant_uuid = '00000000-0000-4000-8000-000000001ebc'
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'),
            Mock(uuid='43'),
        ]
        self.agent_dao.agent_with_id.return_value = Mock(tenant_uuid=tenant_uuid)
        self.pause_manager.unpause_agent.side_effect = AmidProtocolError(
            Mock(json=Mock(return_value=[{'Message': 'Interface not found'}]))
        )

        self.logoff_action.logoff_agent(agent_status)

        self.amid_client.action.assert_called_once_with(
            'QueueRemove', {'Queue': queue.name, 'Interface': agent_status.interface}
        )
        assert_that(
            self.blf_manager.set_user_blf.call_args_list,
            contains_inanyorder(
                call(user_id, 'agentstaticlogin', 'NOT_INUSE', '*{}'.format(agent_id)),
                call(user_id, 'agentstaticlogin', 'NOT_INUSE', agent_number),
                call(user_id, 'agentstaticlogoff', 'INUSE', '*{}'.format(agent_id)),
                call(user_id, 'agentstaticlogoff', 'INUSE', agent_number),
                call(
                    user_id, 'agentstaticlogtoggle', 'NOT_INUSE', '*{}'.format(agent_id)
                ),
                call(user_id, 'agentstaticlogtoggle', 'NOT_INUSE', agent_number),
            ),
        )
        self.pause_manager.unpause_agent.assert_called_once_with(agent_status)
        self.queue_log_manager.on_agent_logged_off.assert_called_once_with(
            agent_number, agent_status.extension, agent_status.context, ANY
        )
        self.agent_status_dao.remove_agent_from_all_queues.assert_called_once_with(
            agent_id
        )
        self.agent_status_dao.log_off_agent.assert_called_once_with(agent_id)
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10, AgentStatusUpdateEvent.STATUS_LOGGED_OUT),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True,
                'tenant_uuid': tenant_uuid,
            },
        )
Exemple #4
0
 def _send_bus_status_update(self, agent):
     status = AgentStatusUpdateEvent.STATUS_LOGGED_IN
     event = AgentStatusUpdateEvent(agent.id, status)
     logger.debug('Looking for users with agent id %s...', agent.id)
     with db_utils.session_scope():
         users = self._user_dao.find_all_by_agent_id(agent.id)
         logger.debug('Found %s users.', len(users))
         headers = {'user_uuid:{uuid}'.format(uuid=user.uuid): True for user in users}
         headers['agent_id:{id}'.format(id=str(agent.id))] = True
         self._bus_publisher.publish(event, headers=headers)
Exemple #5
0
 def _send_bus_status_update(self, agent_status):
     status = AgentStatusUpdateEvent.STATUS_LOGGED_OUT
     agent_id = agent_status.agent_id
     event = AgentStatusUpdateEvent(agent_id, status)
     with db_utils.session_scope():
         users = self._user_dao.find_all_by_agent_id(agent_id)
         tenant_uuid = self._agent_dao.agent_with_id(agent_id).tenant_uuid
         logger.debug('Found %s users.', len(users))
         headers = {
             'user_uuid:{uuid}'.format(uuid=user.uuid): True
             for user in users
         }
         headers['agent_id:{id}'.format(id=str(agent_id))] = True
         headers['tenant_uuid'] = tenant_uuid
         self._bus_publisher.publish(event, headers=headers)
    def test_logoff_agent_already_off_on_asterisk(self):
        agent_id = 10
        agent_number = '10'
        queue_name = 'q1'
        queue = Mock()
        queue.name = queue_name
        agent_status = Mock(user_ids=[])
        agent_status.agent_id = agent_id
        agent_status.agent_number = agent_number
        agent_status.login_at = datetime.datetime.utcnow()
        agent_status.queues = [queue]
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'),
            Mock(uuid='43'),
        ]
        tenant_uuid = '00000000-0000-4000-8000-000000001ebc'
        self.agent_dao.agent_with_id.return_value = Mock(tenant_uuid=tenant_uuid)

        response = Mock()
        response.json.return_value = [
            {'Message': 'Unable to remove interface: Not there'}
        ]
        self.amid_client.action.side_effect = AmidProtocolError(response)

        self.logoff_action.logoff_agent(agent_status)

        self.amid_client.action.assert_called_once_with(
            'QueueRemove', {'Queue': queue.name, 'Interface': agent_status.interface}
        )
        self.queue_log_manager.on_agent_logged_off.assert_called_once_with(
            agent_number, agent_status.extension, agent_status.context, ANY
        )
        self.agent_status_dao.remove_agent_from_all_queues.assert_called_once_with(
            agent_id
        )
        self.agent_status_dao.log_off_agent.assert_called_once_with(agent_id)
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10, AgentStatusUpdateEvent.STATUS_LOGGED_OUT),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True,
                'tenant_uuid': tenant_uuid,
            },
        )
Exemple #7
0
    def test_login_agent(self):
        agent_id = 10
        agent_number = '10'
        queue = Mock()
        agent = Mock()
        agent.id = agent_id
        agent.number = agent_number
        agent.queues = [queue]
        extension = '1001'
        context = 'default'
        state_interface_sip = 'SIP/abcd'
        state_interface_pjsip = 'PJSIP/abcd'
        skills = format_agent_skills(agent_id)

        self.line_dao.get_interface_from_exten_and_context.return_value = state_interface_sip
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'), Mock(uuid='43')
        ]

        self.login_action.login_agent(agent, extension, context)

        self.agent_status_dao.log_in_agent.assert_called_once_with(
            agent_id, agent_number, extension, context, ANY,
            state_interface_pjsip)
        self.agent_status_dao.add_agent_to_queues.assert_called_once_with(
            agent_id, agent.queues)
        self.queue_log_manager.on_agent_logged_in.assert_called_once_with(
            agent_number, extension, context)
        self.ami_client.queue_add.assert_called_once_with(
            queue.name, ANY, ANY, state_interface_pjsip, queue.penalty, skills)
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10,
                                   AgentStatusUpdateEvent.STATUS_LOGGED_IN),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True
            },
        )
Exemple #8
0
    def test_login_agent(self):
        user_id = 42
        agent_id = 10
        agent_number = '10'
        queue = Mock()
        agent = Mock(user_ids=[user_id])
        agent.id = agent_id
        agent.number = agent_number
        agent.queues = [queue]
        extension = '1001'
        context = 'default'
        state_interface_sip = 'PJSIP/abcd'
        skills = format_agent_skills(agent_id)
        tenant_uuid = '00000000-0000-4000-8000-000000001234'

        self.line_dao.get_interface_from_exten_and_context.return_value = (
            state_interface_sip
        )
        self.user_dao.find_all_by_agent_id.return_value = [
            Mock(uuid='42'),
            Mock(uuid='43'),
        ]
        self.amid_client.action.return_value = [{'Response': 'Ok'}]
        self.agent_dao.agent_with_id.return_value = Mock(tenant_uuid=tenant_uuid)

        self.login_action.login_agent(agent, extension, context)

        self.agent_status_dao.log_in_agent.assert_called_once_with(
            agent_id, agent_number, extension, context, ANY, state_interface_sip
        )
        self.agent_status_dao.add_agent_to_queues.assert_called_once_with(
            agent_id, agent.queues
        )
        self.queue_log_manager.on_agent_logged_in.assert_called_once_with(
            agent_number, extension, context
        )
        self.amid_client.action.assert_called_once_with(
            'QueueAdd',
            {
                'Queue': queue.name,
                'Interface': ANY,
                'MemberName': ANY,
                'StateInterface': state_interface_sip,
                'Penalty': queue.penalty,
                'Skills': skills,
            },
        )
        assert_that(
            self.blf_manager.set_user_blf.call_args_list,
            contains_inanyorder(
                call(user_id, 'agentstaticlogin', 'INUSE', '*{}'.format(agent_id)),
                call(user_id, 'agentstaticlogin', 'INUSE', agent_number),
                call(user_id, 'agentstaticlogoff', 'NOT_INUSE', '*{}'.format(agent_id)),
                call(user_id, 'agentstaticlogoff', 'NOT_INUSE', agent_number),
                call(user_id, 'agentstaticlogtoggle', 'INUSE', '*{}'.format(agent_id)),
                call(user_id, 'agentstaticlogtoggle', 'INUSE', agent_number),
            ),
        )
        self.bus_publisher.publish.assert_called_once_with(
            AgentStatusUpdateEvent(10, AgentStatusUpdateEvent.STATUS_LOGGED_IN),
            headers={
                'user_uuid:42': True,
                'user_uuid:43': True,
                'agent_id:10': True,
                'tenant_uuid': tenant_uuid,
            },
        )