class TrackersManagerTest(TestCase):
    def setUp(self):
        super(TrackersManagerTest, self).setUp()
        self.tracker1 = Tracker1()
        self.tracker2 = Tracker2()

        self.trackers_manager = TrackersManager(
            TrackerSettings(10),
            OrderedDict(((TRACKER1_PLUGIN_NAME, self.tracker1),
                         (TRACKER2_PLUGIN_NAME, self.tracker2))))

    def test_get_settings(self):
        self.assertIsNone(
            self.trackers_manager.get_settings(TRACKER1_PLUGIN_NAME))

        credentials2 = {'login': '******'}
        get_credentials_mock = MagicMock(return_value=credentials2)
        self.tracker2.get_credentials = get_credentials_mock

        self.assertEqual(
            self.trackers_manager.get_settings(TRACKER2_PLUGIN_NAME),
            credentials2)

        get_credentials_mock.assert_called_with()

    def test_set_settings(self):
        credentials1 = {'login': '******'}
        self.assertFalse(
            self.trackers_manager.set_settings(TRACKER1_PLUGIN_NAME,
                                               credentials1))

        credentials2 = {'login': '******', 'password': '******'}
        update_credentials_mock2 = MagicMock()
        self.tracker2.update_credentials = update_credentials_mock2

        self.assertTrue(
            self.trackers_manager.set_settings(TRACKER2_PLUGIN_NAME,
                                               credentials2))

        update_credentials_mock2.assert_called_with(credentials2)

    def test_check_connection(self):
        self.assertFalse(
            self.trackers_manager.check_connection(TRACKER1_PLUGIN_NAME))

        verify_mock = MagicMock(return_value=True)
        self.tracker2.verify = verify_mock

        self.assertTrue(
            self.trackers_manager.check_connection(TRACKER2_PLUGIN_NAME))

        verify_mock.assert_called_with()

    def test_prepare_add_topic_1(self):
        parsed_url = {'display_name': "Some Name / Translated Name"}
        prepare_add_topic_mock1 = MagicMock(return_value=parsed_url)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1
        result = self.trackers_manager.prepare_add_topic(
            'http://tracker.com/1/')
        self.assertIsNotNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')

        self.assertEqual(result, {
            'form': TrackerPluginBase.topic_form,
            'settings': parsed_url
        })

    def test_prepare_add_topic_2(self):
        prepare_add_topic_mock1 = MagicMock(return_value=None)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1

        parsed_url = {'display_name': "Some Name / Translated Name"}
        prepare_add_topic_mock2 = MagicMock(return_value=parsed_url)
        self.tracker2.prepare_add_topic = prepare_add_topic_mock2

        result = self.trackers_manager.prepare_add_topic(
            'http://tracker.com/1/')
        self.assertIsNotNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')
        prepare_add_topic_mock2.assert_called_with('http://tracker.com/1/')

        self.assertEqual(result, {
            'form': TrackerPluginBase.topic_form,
            'settings': parsed_url
        })

    def test_prepare_add_topic_3(self):
        prepare_add_topic_mock1 = MagicMock(return_value=None)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1

        prepare_add_topic_mock2 = MagicMock(return_value=None)
        self.tracker2.prepare_add_topic = prepare_add_topic_mock2

        result = self.trackers_manager.prepare_add_topic(
            'http://tracker.com/1/')
        self.assertIsNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')
        prepare_add_topic_mock2.assert_called_with('http://tracker.com/1/')

    def test_add_topic_1(self):
        can_parse_url_mock1 = MagicMock(return_value=True)
        add_topic_mock1 = MagicMock(return_value=True)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertTrue(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_called_with(url, params)

    def test_add_topic_2(self):
        can_parse_url_mock1 = MagicMock(return_value=False)
        add_topic_mock1 = MagicMock(return_value=False)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        can_parse_url_mock2 = MagicMock(return_value=True)
        add_topic_mock2 = MagicMock(return_value=True)
        self.tracker2.can_parse_url = can_parse_url_mock2
        self.tracker2.add_topic = add_topic_mock2

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertTrue(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_not_called()

        can_parse_url_mock2.assert_called_with(url)
        add_topic_mock2.assert_called_with(url, params)

    def test_add_topic_3(self):
        can_parse_url_mock1 = MagicMock(return_value=False)
        add_topic_mock1 = MagicMock(return_value=False)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        can_parse_url_mock2 = MagicMock(return_value=False)
        add_topic_mock2 = MagicMock(return_value=False)
        self.tracker2.can_parse_url = can_parse_url_mock2
        self.tracker2.add_topic = add_topic_mock2

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertFalse(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_not_called()

        can_parse_url_mock2.assert_called_with(url)
        add_topic_mock2.assert_not_called()
class TrackersManagerTest(TestCase):
    def setUp(self):
        super(TrackersManagerTest, self).setUp()
        self.tracker1 = Tracker1()
        self.tracker2 = Tracker2()

        tracker_settings = TrackerSettings(10, None)
        settings_manager = Mock()
        settings_manager.tracker_settings = tracker_settings

        # noinspection PyTypeChecker
        self.trackers_manager = TrackersManager(settings_manager, OrderedDict((
            (TRACKER1_PLUGIN_NAME, self.tracker1),
            (TRACKER2_PLUGIN_NAME, self.tracker2))
        ))

    def test_get_settings(self):
        self.assertIsNone(self.trackers_manager.get_settings(TRACKER1_PLUGIN_NAME))

        credentials2 = {'login': '******'}
        get_credentials_mock = MagicMock(return_value=credentials2)
        self.tracker2.get_credentials = get_credentials_mock

        self.assertEqual(self.trackers_manager.get_settings(TRACKER2_PLUGIN_NAME), credentials2)

        get_credentials_mock.assert_called_with()

    def test_set_settings(self):
        credentials1 = {'login': '******'}
        self.assertFalse(self.trackers_manager.set_settings(TRACKER1_PLUGIN_NAME, credentials1))

        credentials2 = {'login': '******', 'password': '******'}
        update_credentials_mock2 = MagicMock()
        self.tracker2.update_credentials = update_credentials_mock2

        self.assertTrue(self.trackers_manager.set_settings(TRACKER2_PLUGIN_NAME, credentials2))

        update_credentials_mock2.assert_called_with(credentials2)

    def test_check_connection(self):
        self.assertFalse(self.trackers_manager.check_connection(TRACKER1_PLUGIN_NAME))

        verify_mock = MagicMock(return_value=True)
        self.tracker2.verify = verify_mock

        self.assertTrue(self.trackers_manager.check_connection(TRACKER2_PLUGIN_NAME))

        verify_mock.assert_called_with()

    def test_prepare_add_topic_1(self):
        parsed_url = {'display_name': "Some Name / Translated Name"}
        prepare_add_topic_mock1 = MagicMock(return_value=parsed_url)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1
        result = self.trackers_manager.prepare_add_topic('http://tracker.com/1/')
        self.assertIsNotNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')

        self.assertEqual(result, {'form': TrackerPluginBase.topic_form, 'settings': parsed_url})

    def test_prepare_add_topic_2(self):
        prepare_add_topic_mock1 = MagicMock(return_value=None)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1

        parsed_url = {'display_name': "Some Name / Translated Name"}
        prepare_add_topic_mock2 = MagicMock(return_value=parsed_url)
        self.tracker2.prepare_add_topic = prepare_add_topic_mock2

        result = self.trackers_manager.prepare_add_topic('http://tracker.com/1/')
        self.assertIsNotNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')
        prepare_add_topic_mock2.assert_called_with('http://tracker.com/1/')

        self.assertEqual(result, {'form': TrackerPluginBase.topic_form, 'settings': parsed_url})

    def test_prepare_add_topic_3(self):
        prepare_add_topic_mock1 = MagicMock(return_value=None)
        self.tracker1.prepare_add_topic = prepare_add_topic_mock1

        prepare_add_topic_mock2 = MagicMock(return_value=None)
        self.tracker2.prepare_add_topic = prepare_add_topic_mock2

        result = self.trackers_manager.prepare_add_topic('http://tracker.com/1/')
        self.assertIsNone(result)

        prepare_add_topic_mock1.assert_called_with('http://tracker.com/1/')
        prepare_add_topic_mock2.assert_called_with('http://tracker.com/1/')

    def test_add_topic_1(self):
        can_parse_url_mock1 = MagicMock(return_value=True)
        add_topic_mock1 = MagicMock(return_value=True)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertTrue(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_called_with(url, params)

    def test_add_topic_2(self):
        can_parse_url_mock1 = MagicMock(return_value=False)
        add_topic_mock1 = MagicMock(return_value=False)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        can_parse_url_mock2 = MagicMock(return_value=True)
        add_topic_mock2 = MagicMock(return_value=True)
        self.tracker2.can_parse_url = can_parse_url_mock2
        self.tracker2.add_topic = add_topic_mock2

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertTrue(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_not_called()

        can_parse_url_mock2.assert_called_with(url)
        add_topic_mock2.assert_called_with(url, params)

    def test_add_topic_3(self):
        can_parse_url_mock1 = MagicMock(return_value=False)
        add_topic_mock1 = MagicMock(return_value=False)
        self.tracker1.can_parse_url = can_parse_url_mock1
        self.tracker1.add_topic = add_topic_mock1

        can_parse_url_mock2 = MagicMock(return_value=False)
        add_topic_mock2 = MagicMock(return_value=False)
        self.tracker2.can_parse_url = can_parse_url_mock2
        self.tracker2.add_topic = add_topic_mock2

        params = {'display_name': "Some Name / Translated Name"}
        url = 'http://tracker.com/1/'
        self.assertFalse(self.trackers_manager.add_topic(url, params))

        can_parse_url_mock1.assert_called_with(url)
        add_topic_mock1.assert_not_called()

        can_parse_url_mock2.assert_called_with(url)
        add_topic_mock2.assert_not_called()