"""Dependency injector provider utils unit tests."""

import unittest2 as unittest

from dependency_injector import (
    providers,
    errors,
)


class IsProviderTests(unittest.TestCase):

    def test_with_instance(self):
        self.assertTrue(providers.is_provider(providers.Provider()))

    def test_with_class(self):
        self.assertFalse(providers.is_provider(providers.Provider))

    def test_with_string(self):
        self.assertFalse(providers.is_provider('some_string'))

    def test_with_object(self):
        self.assertFalse(providers.is_provider(object()))

    def test_with_subclass_instance(self):
        class SomeProvider(providers.Provider):
            pass

        self.assertTrue(providers.is_provider(SomeProvider()))

    def test_with_class_with_getattr(self):
        class SomeClass(object):
            def __getattr__(self, _):
                return False

        self.assertFalse(providers.is_provider(SomeClass()))


class EnsureIsProviderTests(unittest.TestCase):

    def test_with_instance(self):
        provider = providers.Provider()
        self.assertIs(providers.ensure_is_provider(provider), provider)

    def test_with_class(self):
        self.assertRaises(errors.Error,
                          providers.ensure_is_provider,
                          providers.Provider)

    def test_with_string(self):
        self.assertRaises(errors.Error,
                          providers.ensure_is_provider,
                          'some_string')

    def test_with_object(self):
        self.assertRaises(errors.Error, providers.ensure_is_provider, object())