def test_get_plugins(self):
        clients = self.clients_manager.clients
        get_plugins_mock = Mock(return_value=clients)
        with patch('monitorrent.plugin_managers.get_plugins',
                   get_plugins_mock):
            self.clients_manager = ClientsManager()

        self.assertEqual(clients, self.clients_manager.clients)
Example #2
0
    def test_successful_update_settings(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.set_settings = MagicMock(return_value=True)

        client = Client(clients_manager)
        self.api.add_route('/api/clients/{client}', client)

        self.simulate_request('/api/clients/{0}'.format(1), method="PUT",
                              body=json.dumps({'login': '******', 'password': '******'}))
        self.assertEqual(self.srmock.status, falcon.HTTP_NO_CONTENT)
Example #3
0
    def test_check_client_not_found(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.check_connection = MagicMock(side_effect=KeyError)

        client = ClientCheck(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/clients/{client}/check', client)

        self.simulate_request('/api/clients/{0}/check'.format('tracker.org'))
        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
Example #4
0
    def test_check_client_error(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.check_connection = MagicMock(side_effect=Exception)

        client = ClientCheck(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/clients/{client}/check', client)

        self.simulate_request('/api/clients/{0}/check'.format('tracker.org'))
        self.assertEqual(self.srmock.status, falcon.HTTP_INTERNAL_SERVER_ERROR)
Example #5
0
    def test_get_default_not_found(self):
        clients_manager = ClientsManager({'tracker.org': ClientCollectionTest.TestClient()})
        clients_manager.default_client = None

        client = DefaultClient(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/default_client', client)

        body = self.simulate_request('/api/default_client', decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
    def test_get_default_not_found(self):
        clients_manager = ClientsManager({'tracker.org': ClientCollectionTest.TestClient()})
        clients_manager.default_client = None

        client = DefaultClient(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/default_client', client)

        body = self.simulate_request('/api/default_client', decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
Example #7
0
    def test_eroor_update_settings(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.set_settings = MagicMock(side_effect=Exception)

        client = Client(clients_manager)
        self.api.add_route('/api/clients/{client}', client)

        self.simulate_request('/api/clients/{0}'.format(1), method="PUT",
                              body=json.dumps({'login': '******', 'password': '******'}))
        self.assertEqual(self.srmock.status, falcon.HTTP_INTERNAL_SERVER_ERROR)
Example #8
0
    def test_not_found_update_settings(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.set_settings = MagicMock(side_effect=KeyError)

        client = Client(clients_manager)
        self.api.add_route('/api/clients/{client}', client)

        self.simulate_request('/api/clients/{0}'.format(1), method="PUT",
                              body=json.dumps({'login': '******', 'password': '******'}))
        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
    def setUp(self):
        super(ClientsManagerTest, self).setUp()

        self.client1 = Mock()
        self.client2 = Mock()

        self.clients_manager = ClientsManager(
            {
                self.CLIENT1_NAME: self.client1,
                self.CLIENT2_NAME: self.client2
            }, self.CLIENT1_NAME)
Example #10
0
    def test_not_found_settings(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.get_settings = MagicMock(side_effect=KeyError)

        client = Client(clients_manager)
        self.api.add_route('/api/clients/{client}', client)

        self.simulate_request('/api/clients/{0}'.format(1))

        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
        self.assertTrue('application/json' in self.srmock.headers_dict['Content-Type'])
Example #11
0
    def test_get_settings_error(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.get_settings = MagicMock(side_effect=Exception)

        client = Client(clients_manager)
        self.api.add_route('/api/clients/{client}', client)

        self.simulate_request('/api/clients/{0}'.format(1))

        self.assertEqual(self.srmock.status, falcon.HTTP_INTERNAL_SERVER_ERROR)
        self.assertTrue('application/json' in self.srmock.headers_dict['Content-Type'])
Example #12
0
    def test_get_last_execute(self):
        execute_mock = Mock()
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})

        self.TestDatetime.mock_now = datetime.now(pytz.utc)

        with patch('monitorrent.engine.datetime',
                   self.TestDatetime(2015, 8, 28)):
            engine_runner = DBEngineRunner(Logger(), self.trackers_manager,
                                           clients_manager)

            self.assertIsNone(engine_runner.last_execute)

            engine_runner.execute(None)
            sleep(0.1)

            engine_runner.stop()
            engine_runner.join(1)
            self.assertFalse(engine_runner.is_alive())
            engine_runner = DBEngineRunner(Logger(), self.trackers_manager,
                                           clients_manager)

            self.assertEqual(self.TestDatetime.mock_now,
                             engine_runner.last_execute)

            engine_runner.stop()
            engine_runner.join(1)
            self.assertFalse(engine_runner.is_alive())
Example #13
0
    def test_manual_execute_with_ids_ignored_while_in_execute(self):
        waiter = Event()

        long_execute_waiter = Event()

        # noinspection PyUnusedLocal
        def execute(*args, **kwargs):
            waiter.set()
            long_execute_waiter.wait(1)
            self.assertTrue(long_execute_waiter.is_set)

        execute_mock = Mock(side_effect=execute)
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = EngineRunner(Logger(),
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=1)
        engine_runner.execute(None)
        waiter.wait(0.3)
        waiter.clear()
        ids = [1, 2, 3]
        engine_runner.execute(ids)
        long_execute_waiter.set()
        waiter.wait(0.3)
        self.assertTrue(waiter.is_set)
        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        execute_mock.assert_called_once_with(ANY, None)
Example #14
0
    def test_exeption_in_finally_execute(self):
        waiter = Event()

        # noinspection PyUnusedLocal
        def execute(*args, **kwargs):
            waiter.set()

        execute_mock = Mock(side_effect=execute)
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        logger = Logger()
        logger.finished = Mock(side_effect=Exception("Failed to save"))
        engine_runner = EngineRunner(logger,
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=0.1)
        waiter.wait(1)
        self.assertTrue(waiter.is_set)
        self.assertTrue(engine_runner.is_alive())

        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        self.assertEqual(1, execute_mock.call_count)
Example #15
0
    def test_update_interval_during_execute(self, test_interval):
        waiter = Event()
        scope = self.Bunch()
        scope.first_execute = True

        # noinspection PyUnusedLocal
        def execute(*args, **kwargs):
            engine_runner.interval = test_interval
            if scope.first_execute:
                scope.start = time()
                scope.first_execute = False
            else:
                scope.end = time()
                waiter.set()

        execute_mock = Mock(side_effect=execute)
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = EngineRunner(Logger(),
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=0.1)
        waiter.wait(2)
        self.assertTrue(waiter.is_set)
        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        self.assertEqual(2, execute_mock.call_count)

        # noinspection PyUnresolvedReferences
        delta = scope.end - scope.start

        self.assertLessEqual(abs(delta - test_interval), 0.02)
Example #16
0
    def test_stop_after_multiple_execute(self, value):
        waiter = Event()
        scope = self.Bunch()
        scope.execute_count = 0

        # noinspection PyUnusedLocal
        def execute(*args, **kwargs):
            scope.execute_count += 1
            if scope.execute_count < value:
                return
            waiter.set()

        execute_mock = Mock(side_effect=execute)
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = EngineRunner(Logger(),
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=0.1)
        waiter.wait(2)
        self.assertTrue(waiter.is_set)
        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        self.assertEqual(value, execute_mock.call_count)
    def test_get_plugins(self):
        clients = self.clients_manager.clients
        get_plugins_mock = Mock(return_value=clients)
        with patch('monitorrent.plugin_managers.get_plugins', get_plugins_mock):
            self.clients_manager = ClientsManager()

        self.assertEqual(clients, self.clients_manager.clients)
Example #18
0
    def test_empty_get_settings(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.get_settings = MagicMock(return_value=None)

        client = Client(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/clients/{client}', client)

        body = self.simulate_request('/api/clients/{0}'.format(1), decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_OK)
        self.assertTrue('application/json' in self.srmock.headers_dict['Content-Type'])

        result = json.loads(body)

        self.assertIsInstance(result, dict)
        self.assertEqual(result, {})
    def setUp(self):
        super(ClientsManagerTest, self).setUp()

        self.client1 = Mock()
        self.client2 = Mock()

        self.clients_manager = ClientsManager({self.CLIENT1_NAME: self.client1, self.CLIENT2_NAME: self.client2}, self.CLIENT1_NAME)
Example #20
0
    def test_check_client(self, value):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})
        clients_manager.check_connection = MagicMock(return_value=value)

        client = ClientCheck(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/clients/{client}/check', client)

        body = self.simulate_request('/api/clients/{0}/check'.format('tracker.org'), decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_OK)
        self.assertTrue('application/json' in self.srmock.headers_dict['Content-Type'])

        result = json.loads(body)

        self.assertIsInstance(result, dict)
        self.assertEqual(result, {'status': value})
Example #21
0
 def create_runner(self, logger=None):
     self.settings_manager = Mock()
     self.clients_manager = ClientsManager({})
     self.notifier_manager = NotifierManager(self.settings_manager, {})
     # noinspection PyTypeChecker
     self.engine_runner = DBEngineRunner(
         Logger() if logger is None else logger, self.settings_manager,
         self.trackers_manager, self.clients_manager, self.notifier_manager)
Example #22
0
    def test_set_default_not_found(self):
        clients_manager = ClientsManager({'tracker.org': ClientCollectionTest.TestClient()})

        client = ClientDefault(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/clients/{client}/default', client)

        self.simulate_request('/api/clients/{0}/default'.format('random.org'), method='PUT')
        self.assertEqual(self.srmock.status, falcon.HTTP_NOT_FOUND)
Example #23
0
 def create_runner(self, logger=None, interval=0.1):
     self.settings_manager = Mock()
     self.clients_manager = ClientsManager({})
     self.notifier_manager = NotifierManager(self.settings_manager, {})
     self.engine_runner = EngineRunner(
         Logger() if logger is None else logger,
         self.settings_manager,
         self.trackers_manager,
         self.clients_manager,
         self.notifier_manager,
         interval=interval)
Example #24
0
    def test_get_default(self):
        clients_manager = ClientsManager({'tracker.org': ClientCollectionTest.TestClient()})

        client = DefaultClient(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/default_client', client)

        body = self.simulate_request('/api/default_client', decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_OK)

        result = json.loads(body)

        assert result == {'name': 'test_client', 'settings': {}, 'fields': {}}
Example #25
0
    def test_stop_bofore_execute(self):
        execute_mock = MagicMock()
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = EngineRunner(Logger(),
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=0.1)
        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        execute_mock.assert_not_called()
Example #26
0
    def setUp(self):
        super(EngineTest, self).setUp()

        self.log_mock = Logger()
        self.log_info_mock = MagicMock()
        self.log_downloaded_mock = MagicMock()
        self.log_failed_mock = MagicMock()

        self.log_mock.info = self.log_info_mock
        self.log_mock.downloaded = self.log_downloaded_mock
        self.log_mock.failed = self.log_failed_mock

        self.clients_manager = ClientsManager()
        self.engine = Engine(self.log_mock, self.clients_manager)
Example #27
0
    def test_get_all(self):
        clients_manager = ClientsManager({'test': ClientCollectionTest.TestClient()})

        client_collection = ClientCollection(clients_manager)
        self.api.add_route('/api/clients', client_collection)

        body = self.simulate_request('/api/clients', decode='utf-8')

        self.assertEqual(self.srmock.status, falcon.HTTP_OK)
        self.assertTrue('application/json' in self.srmock.headers_dict['Content-Type'])

        result = json.loads(body)

        self.assertIsInstance(result, list)
        self.assertEqual(1, len(result))

        self.assertEqual(result[0], {'name': 'test', 'form': ClientCollectionTest.TestClient.form, 'is_default': True})
Example #28
0
    def test_get_default_with_fields(self):
        clients_manager = ClientsManager({'tracker.org': self.TestClientWithFields()})

        client = DefaultClient(clients_manager)
        client.__no_auth__ = True
        self.api.add_route('/api/default_client', client)

        body = self.simulate_request('/api/default_client', decode="utf-8")
        self.assertEqual(self.srmock.status, falcon.HTTP_OK)

        result = json.loads(body)

        expected_fields = {
            'download_dir': u'/mnt/media/download',
            'other': None
        }
        assert result == {'name': 'test_client_with_fields', 'settings': {}, 'fields': expected_fields}
Example #29
0
    def setUp(self):
        super(EngineTest, self).setUp()

        self.log_mock = Logger()
        self.log_info_mock = MagicMock()
        self.log_downloaded_mock = MagicMock()
        self.log_failed_mock = MagicMock()

        self.log_mock.info = self.log_info_mock
        self.log_mock.downloaded = self.log_downloaded_mock
        self.log_mock.failed = self.log_failed_mock

        self.clients_manager = ClientsManager()
        self.settings_manager = Mock()
        self.trackers_manager = TrackersManager(self.settings_manager, {})
        self.notifier_manager = NotifierManager({})
        self.engine = Engine(self.log_mock, self.settings_manager,
                             self.trackers_manager, self.clients_manager,
                             self.notifier_manager)
Example #30
0
    def test_stop_after_execute(self):
        waiter = Event()

        # noinspection PyUnusedLocal
        def execute(*args, **kwargs):
            waiter.set()

        execute_mock = Mock(side_effect=execute)
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = EngineRunner(Logger(),
                                     self.trackers_manager,
                                     clients_manager,
                                     interval=0.1)
        waiter.wait(1)
        self.assertTrue(waiter.is_set)
        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())

        self.assertEqual(1, execute_mock.call_count)
Example #31
0
    def test_set_interval(self, value):
        execute_mock = Mock()
        self.trackers_manager.execute = execute_mock
        clients_manager = ClientsManager({})
        engine_runner = DBEngineRunner(Logger(), self.trackers_manager,
                                       clients_manager)

        self.assertEqual(7200, engine_runner.interval)

        engine_runner.interval = value

        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())
        engine_runner = DBEngineRunner(Logger(), self.trackers_manager,
                                       clients_manager)

        self.assertEqual(value, engine_runner.interval)

        engine_runner.stop()
        engine_runner.join(1)
        self.assertFalse(engine_runner.is_alive())
    def test_empty_clients(self):
        clients_amanger = ClientsManager({})

        self.assertFalse(clients_amanger.add_torrent('!torrent'))
        self.assertFalse(clients_amanger.find_torrent('hash'))
        self.assertFalse(clients_amanger.remove_torrent('hash'))
class ClientsManagerTest(TestCase):
    CLIENT1_NAME = 'client1'
    CLIENT2_NAME = 'client2'

    def setUp(self):
        super(ClientsManagerTest, self).setUp()

        self.client1 = Mock()
        self.client2 = Mock()

        self.clients_manager = ClientsManager({self.CLIENT1_NAME: self.client1, self.CLIENT2_NAME: self.client2}, self.CLIENT1_NAME)

    def test_get_settings(self):
        settings1 = {'login': '******', 'password': '******'}
        settings2 = {'login': '******', 'password': '******'}

        get_settings1_mock = MagicMock(return_value=settings1)
        get_settings2_mock = MagicMock(return_value=settings2)
        self.client1.get_settings = get_settings1_mock
        self.client2.get_settings = get_settings2_mock

        settings = self.clients_manager.get_settings(self.CLIENT1_NAME)

        self.assertEqual(settings1, settings)

        get_settings1_mock.assert_called_with()
        get_settings2_mock.assert_not_called()

    def test_set_settings(self):
        settings = {'login': '******', 'password': '******'}

        set_settings1_mock = MagicMock(return_value=True)
        set_settings2_mock = MagicMock(return_value=True)
        self.client1.set_settings = set_settings1_mock
        self.client2.set_settings = set_settings2_mock

        self.assertTrue(self.clients_manager.set_settings(self.CLIENT1_NAME, settings))

        set_settings1_mock.assert_called_with(settings)
        set_settings2_mock.assert_not_called()

    @data(True, False)
    def test_check_connection(self, value):
        check_connection_mock1 = MagicMock(return_value=value)
        check_connection_mock2 = MagicMock(return_value=value)
        self.client1.check_connection = check_connection_mock1
        self.client2.check_connection = check_connection_mock2

        self.assertEqual(value, self.clients_manager.check_connection(self.CLIENT1_NAME))
        self.assertEqual(value, self.clients_manager.check_connection(self.CLIENT2_NAME))

        check_connection_mock1.assert_called_once_with()
        check_connection_mock2.assert_called_once_with()

    def test_find_torrent_true(self):
        result = {'name': 'movie.torrent'}
        find_torrent_mock1 = MagicMock(return_value=result)
        find_torrent_mock2 = MagicMock(return_value=None)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.assertEqual(result, self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_called_once_with(torrent_hash)
        find_torrent_mock2.assert_not_called()

    def test_find_torrent_true_default_client2(self):
        result = {'name': 'movie.torrent'}
        find_torrent_mock1 = MagicMock(return_value=None)
        find_torrent_mock2 = MagicMock(return_value=result)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertEqual(result, self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_not_called()
        find_torrent_mock2.assert_called_once_with(torrent_hash)

    def test_find_torrent_false(self):
        find_torrent_mock1 = MagicMock(return_value=None)
        find_torrent_mock2 = MagicMock(return_value=None)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_called_once_with(torrent_hash)
        find_torrent_mock2.assert_not_called()

    def test_add_torrent_true(self):
        add_torrent_mock1 = MagicMock(return_value=True)
        add_torrent_mock2 = MagicMock(return_value=False)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = b'!torrent_file'
        self.assertTrue(self.clients_manager.add_torrent(torrent))

        add_torrent_mock1.assert_called_once_with(torrent)
        add_torrent_mock2.assert_not_called()

    def test_add_torrent_true_default_client2(self):
        add_torrent_mock1 = MagicMock(return_value=False)
        add_torrent_mock2 = MagicMock(return_value=True)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = '!torrent_file'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertTrue(self.clients_manager.add_torrent(torrent))

        add_torrent_mock1.assert_not_called()
        add_torrent_mock2.assert_called_once_with(torrent)

    def test_add_torrent_false(self):
        add_torrent_mock1 = MagicMock(return_value=False)
        add_torrent_mock2 = MagicMock(return_value=False)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = b'!torrent_file'
        self.assertFalse(self.clients_manager.add_torrent(torrent))

        add_torrent_mock1.assert_called_once_with(torrent)
        add_torrent_mock2.assert_not_called()

    def test_remove_torrent_true(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=True)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_called_once_with(torrent_hash)
        remove_torrent_mock2.assert_not_called()

    def test_remove_torrent_true_default_client2(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=True)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertTrue(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_not_called()
        remove_torrent_mock2.assert_called_once_with(torrent_hash)

    def test_remove_torrent_false(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=False)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_called_once_with(torrent_hash)
        remove_torrent_mock2.assert_not_called()

    def test_get_plugins(self):
        clients = self.clients_manager.clients
        get_plugins_mock = Mock(return_value=clients)
        with patch('monitorrent.plugin_managers.get_plugins', get_plugins_mock):
            self.clients_manager = ClientsManager()

        self.assertEqual(clients, self.clients_manager.clients)

    def test_get_default(self):
        self.assertEqual(self.client1, self.clients_manager.get_default())

        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertEqual(self.client2, self.clients_manager.get_default())

        self.clients_manager.set_default(self.CLIENT1_NAME)
        self.assertEqual(self.client1, self.clients_manager.get_default())

    def test_empty_clients(self):
        clients_amanger = ClientsManager({})

        self.assertFalse(clients_amanger.add_torrent('!torrent'))
        self.assertFalse(clients_amanger.find_torrent('hash'))
        self.assertFalse(clients_amanger.remove_torrent('hash'))

    def test_unknow_client(self):
        with self.assertRaises(KeyError):
            self.clients_manager.set_default('random_name')
    def test_empty_clients(self):
        clients_amanger = ClientsManager({})

        self.assertFalse(clients_amanger.add_torrent('!torrent', None))
        self.assertFalse(clients_amanger.find_torrent('hash'))
        self.assertFalse(clients_amanger.remove_torrent('hash'))
class ClientsManagerTest(TestCase):
    CLIENT1_NAME = 'client1'
    CLIENT2_NAME = 'client2'

    def setUp(self):
        super(ClientsManagerTest, self).setUp()

        self.client1 = Mock()
        self.client2 = Mock()

        self.clients_manager = ClientsManager(
            {
                self.CLIENT1_NAME: self.client1,
                self.CLIENT2_NAME: self.client2
            }, self.CLIENT1_NAME)

    def test_get_settings(self):
        settings1 = {'login': '******', 'password': '******'}
        settings2 = {'login': '******', 'password': '******'}

        get_settings1_mock = MagicMock(return_value=settings1)
        get_settings2_mock = MagicMock(return_value=settings2)
        self.client1.get_settings = get_settings1_mock
        self.client2.get_settings = get_settings2_mock

        settings = self.clients_manager.get_settings(self.CLIENT1_NAME)

        self.assertEqual(settings1, settings)

        get_settings1_mock.assert_called_with()
        get_settings2_mock.assert_not_called()

    def test_set_settings(self):
        settings = {'login': '******', 'password': '******'}

        set_settings1_mock = MagicMock(return_value=True)
        set_settings2_mock = MagicMock(return_value=True)
        self.client1.set_settings = set_settings1_mock
        self.client2.set_settings = set_settings2_mock

        self.clients_manager.set_settings(self.CLIENT1_NAME, settings)

        set_settings1_mock.assert_called_with(settings)
        set_settings2_mock.assert_not_called()

    @data(True, False)
    def test_check_connection(self, value):
        check_connection_mock1 = MagicMock(return_value=value)
        check_connection_mock2 = MagicMock(return_value=value)
        self.client1.check_connection = check_connection_mock1
        self.client2.check_connection = check_connection_mock2

        self.assertEqual(
            value, self.clients_manager.check_connection(self.CLIENT1_NAME))
        self.assertEqual(
            value, self.clients_manager.check_connection(self.CLIENT2_NAME))

        check_connection_mock1.assert_called_once_with()
        check_connection_mock2.assert_called_once_with()

    def test_find_torrent_true(self):
        result = {'name': 'movie.torrent'}
        find_torrent_mock1 = MagicMock(return_value=result)
        find_torrent_mock2 = MagicMock(return_value=None)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.assertEqual(result,
                         self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_called_once_with(torrent_hash)
        find_torrent_mock2.assert_not_called()

    def test_find_torrent_true_default_client2(self):
        result = {'name': 'movie.torrent'}
        find_torrent_mock1 = MagicMock(return_value=None)
        find_torrent_mock2 = MagicMock(return_value=result)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertEqual(result,
                         self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_not_called()
        find_torrent_mock2.assert_called_once_with(torrent_hash)

    def test_find_torrent_false(self):
        find_torrent_mock1 = MagicMock(return_value=None)
        find_torrent_mock2 = MagicMock(return_value=None)
        self.client1.find_torrent = find_torrent_mock1
        self.client2.find_torrent = find_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.find_torrent(torrent_hash))

        find_torrent_mock1.assert_called_once_with(torrent_hash)
        find_torrent_mock2.assert_not_called()

    def test_add_torrent_true(self):
        add_torrent_mock1 = MagicMock(return_value=True)
        add_torrent_mock2 = MagicMock(return_value=False)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = b'!torrent_file'
        self.assertTrue(self.clients_manager.add_torrent(torrent, None))

        add_torrent_mock1.assert_called_once_with(torrent, None)
        add_torrent_mock2.assert_not_called()

    def test_add_torrent_true_default_client2(self):
        add_torrent_mock1 = MagicMock(return_value=False)
        add_torrent_mock2 = MagicMock(return_value=True)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = '!torrent_file'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertTrue(self.clients_manager.add_torrent(torrent, None))

        add_torrent_mock1.assert_not_called()
        add_torrent_mock2.assert_called_once_with(torrent, None)

    def test_add_torrent_false(self):
        add_torrent_mock1 = MagicMock(return_value=False)
        add_torrent_mock2 = MagicMock(return_value=False)
        self.client1.add_torrent = add_torrent_mock1
        self.client2.add_torrent = add_torrent_mock2

        torrent = b'!torrent_file'
        self.assertFalse(self.clients_manager.add_torrent(torrent, None))

        add_torrent_mock1.assert_called_once_with(torrent, None)
        add_torrent_mock2.assert_not_called()

    def test_remove_torrent_true(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=True)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_called_once_with(torrent_hash)
        remove_torrent_mock2.assert_not_called()

    def test_remove_torrent_true_default_client2(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=True)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertTrue(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_not_called()
        remove_torrent_mock2.assert_called_once_with(torrent_hash)

    def test_remove_torrent_false(self):
        remove_torrent_mock1 = MagicMock(return_value=False)
        remove_torrent_mock2 = MagicMock(return_value=False)
        self.client1.remove_torrent = remove_torrent_mock1
        self.client2.remove_torrent = remove_torrent_mock2

        torrent_hash = 'hash'
        self.assertFalse(self.clients_manager.remove_torrent(torrent_hash))

        remove_torrent_mock1.assert_called_once_with(torrent_hash)
        remove_torrent_mock2.assert_not_called()

    def test_get_plugins(self):
        clients = self.clients_manager.clients
        get_plugins_mock = Mock(return_value=clients)
        with patch('monitorrent.plugin_managers.get_plugins',
                   get_plugins_mock):
            self.clients_manager = ClientsManager()

        self.assertEqual(clients, self.clients_manager.clients)

    def test_get_default(self):
        self.assertEqual(self.client1, self.clients_manager.get_default())

        self.clients_manager.set_default(self.CLIENT2_NAME)
        self.assertEqual(self.client2, self.clients_manager.get_default())

        self.clients_manager.set_default(self.CLIENT1_NAME)
        self.assertEqual(self.client1, self.clients_manager.get_default())

    def test_empty_clients(self):
        clients_amanger = ClientsManager({})

        self.assertFalse(clients_amanger.add_torrent('!torrent', None))
        self.assertFalse(clients_amanger.find_torrent('hash'))
        self.assertFalse(clients_amanger.remove_torrent('hash'))

    def test_unknow_client(self):
        with self.assertRaises(KeyError):
            self.clients_manager.set_default('random_name')