コード例 #1
0
ファイル: gigadl.py プロジェクト: K-Phoen/GigaDl
class TestGigaDl(unittest.TestCase):
    def setUp(self):
        self.test_downloader = MockDownloader()
        self.test_provider = MockProvider(self.test_downloader)
        self.gigadl = GigaDl()

    def test_init_one_provider(self):
        gigadl = GigaDl(self.test_provider)

        self.assertIn(self.test_provider, gigadl,
            'The provider given in the constructor is registered in the '
            'GigaDl instance')

        self.assertIs(gigadl.provider, self.test_provider,
            'The provider given in the constructor is the one currently used')

        self.assertIs(len(gigadl), 1, 'Only one provider is registered')

    def test_register_provider(self):
        bar_provider = MockProvider(self.test_downloader)

        self.gigadl.register_provider(self.test_provider)
        self.gigadl.register_provider(self.test_provider, 'foo')
        self.gigadl.register_provider(bar_provider, 'Bar bar')

        # match the name
        self.assertIn('Mock provider', self.gigadl,
            'The "Mock provider" provider in is registered in the GigaDl instance')

        self.assertIn('foo', self.gigadl,
            'The "foo" provider in is registered in the GigaDl instance')

        self.assertIn('Bar bar', self.gigadl,
            'The "bar" provider in is registered in the GigaDl instance')

        # match the object
        self.assertIn(self.test_provider, self.gigadl,
            'The "foo" provider in is registered in the GigaDl instance')

        self.assertIn(bar_provider, self.gigadl,
            'The "Bar bar" provider in is registered in the GigaDl instance')

        self.assertIs(len(self.gigadl), 3, 'Three providers are registered')

    def test_register_multiple_named_providers(self):
        bar_provider = MockProvider(self.test_downloader)

        self.gigadl.register_providers(foo=self.test_provider,
                                       bar=bar_provider)

        # match the name
        self.assertIn('foo', self.gigadl,
            'The "foo" provider in is registered in the GigaDl instance')

        self.assertIn('bar', self.gigadl,
            'The "bar" provider in is registered in the GigaDl instance')

        # match the object
        self.assertIn(bar_provider, self.gigadl,
            'The "foo" provider in is registered in the GigaDl instance')

        self.assertIn(self.test_provider, self.gigadl,
            'The "bar" provider in is registered in the GigaDl instance')

        self.assertIs(len(self.gigadl), 2, 'Two providers are registered')

    def test_register_multiple_providers(self):
        bar_provider = MockProvider(self.test_downloader, 'Bar bar')

        self.gigadl.register_providers(bar_provider, self.test_provider)

        # match the name
        self.assertIn('Mock provider', self.gigadl,
            'The "Mock provider" provider in is registered in the GigaDl instance')

        self.assertIn('Bar bar', self.gigadl,
            'The "Bar bar" provider in is registered in the GigaDl instance')

        # match the object
        self.assertIn(self.test_provider, self.gigadl,
            'The "Mock provider" provider in is registered in the GigaDl instance')

        self.assertIn(bar_provider, self.gigadl,
            'The "Bar bar" provider in is registered in the GigaDl instance')

        self.assertIs(len(self.gigadl), 2, 'Two providers are registered')

    def test_use(self):
        self.test_provider.search = throw_error

        # use our custom provider
        self.gigadl.register_provider(self.test_provider)
        self.gigadl.use('Mock provider')

        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('foo')

        self.assertIs(str(cm.exception), 'foo', 'The right provider is used '
                      'when giving its name')

        self.gigadl.use(self.test_provider)
        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('bar')

        self.assertIs(str(cm.exception), 'bar', 'The right provider is used '
                      'when giving an already registered object')

        bar_provider = MockProvider(self.test_downloader, 'Bar bar')
        bar_provider.search = throw_error

        self.gigadl.use(bar_provider)
        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('biz')

        self.assertIs(str(cm.exception), 'biz', 'The right provider is used '
                      'when giving a non registered object')

    def test_provider_setter_property(self):
        self.test_provider.search = throw_error

        # use our custom provider
        self.gigadl.register_provider(self.test_provider)
        self.gigadl.provider = 'Mock provider'

        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('foo')

        self.assertIs(str(cm.exception), 'foo', 'The right provider is used '
                      'when giving its name')

        self.gigadl.provider = self.test_provider
        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('bar')

        self.assertIs(str(cm.exception), 'bar', 'The right provider is used '
                      'when giving an already registered object')

        bar_provider = MockProvider(self.test_downloader, 'Bar bar')
        bar_provider.search = throw_error

        self.gigadl.provider = bar_provider
        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('biz')

        self.assertIs(str(cm.exception), 'biz', 'The right provider is used '
                      'when giving a non registered object')


    def test_provider_getter_property(self):
        self.assertIsNone(self.gigadl.provider, 'None if no provider selected')

        # register a provider and use it
        self.gigadl.register_provider(self.test_provider)
        self.gigadl.use(self.test_provider)

        self.assertIs(self.gigadl.provider, self.test_provider, 'When a '
                      'provider is selected, it is returned by the property')

        # register another provider
        bar_provider = MockProvider(self.test_downloader)
        self.gigadl.register_provider(bar_provider)

        self.assertIs(self.gigadl.provider, self.test_provider, 'Registering '
                      'another provider does not impact the selected one')

        # use it
        self.gigadl.use(bar_provider)

        self.assertIs(self.gigadl.provider, bar_provider, 'When another '
                      'provider is selected, it is returned by the property')

    def test_provider_deleter_property(self):
        self.assertIsNone(self.gigadl.provider, 'No provider selected')

        self.gigadl.register_provider(MockProvider(self.test_downloader, 'bar'))

        self.gigadl.use(self.test_provider)
        self.assertIs(self.gigadl.provider, self.test_provider, 'A provider is selected')

        del self.gigadl.provider
        self.assertIsNone(self.gigadl.provider, 'No provider selected')
        self.assertIs(len(self.gigadl), 1, 'Still one provider registered')
        self.assertNotIn('Mock provider', self.gigadl, 'The "Mock provider" is'
                         'not registered anymore')
        self.assertIn('bar', self.gigadl, 'The bar provider is still'
                      'registered')

    def test_search(self):
        with self.assertRaises(ValueError):
            self.gigadl.search('foo')

        self.test_provider.search = throw_error
        self.gigadl.provider = self.test_provider

        self.assertEqual(self.gigadl.search(''), [], 'An empty search returns an '
                      'empty list, withouth calling the provider')

        with self.assertRaises(ValueError) as cm:
            self.gigadl.search('biz')

        self.assertIs(str(cm.exception), 'biz', 'The search call is delegated '
                      'to the provider')

    def test_retrieve_data(self):
        with self.assertRaises(ValueError):
            self.gigadl.retrieve_data('http://www.some-url.com/?v=some_id')

        self.test_provider.retrieve_data = throw_error
        self.gigadl.provider = self.test_provider

        with self.assertRaises(ValueError):
            self.gigadl.retrieve_data('')

        with self.assertRaises(ValueError) as cm:
            self.gigadl.retrieve_data('biz')

        self.assertIs(str(cm.exception), 'biz', 'The retrieve_data call is delegated '
                      'to the provider')