class GrantHandlerFactoryTests(FantasticoUnitTestsCase):
    '''This class provides the tests suite for supported handlers factory.'''

    _tokens_service = None
    _tokens_service_cls = None
    _settings_facade = None
    _factory = None

    def init(self):
        '''This method is invoked automatically in order to setup common dependencies for all test cases.'''

        self._tokens_service = Mock()
        self._tokens_service_cls = Mock(return_value=self._tokens_service)

        self._settings_facade = Mock()

        settings_facade_cls = Mock(return_value=self._settings_facade)
        self._settings_facade.get = self._mock_get_setting

        self._factory = GrantHandlerFactory(tokens_service_cls=self._tokens_service_cls, settings_facade_cls=settings_facade_cls)

        settings_facade_cls.assert_called_once_with()

    def _mock_get_setting(self, setting_name):
        '''This method mocks get from settings_facade instance.'''

        if setting_name == "oauth2_idp":
            return {"idp_index": "/oauth/idp/ui/login"}

        return Mock()

    def test_get_handler_ok(self):
        '''This test case ensures a correct instance of a grant handler can be obtained using the factory.'''

        db_conn = Mock()

        grant_handler = self._factory.get_handler(GrantHandlerFactory.IMPLICIT_GRANT, db_conn)

        self.assertIsInstance(grant_handler, ImplicitGrantHandler)

        self._tokens_service_cls.assert_called_once_with(db_conn)

    def test_get_handler_unsupported(self):
        '''This test case ensures a concrete oauth2 exception is raised if a handler_type is not supported.'''

        db_conn = Mock()
        handler_type = "unsupported"

        with self.assertRaises(OAuth2UnsupportedGrantError) as ctx:
            self._factory.get_handler(handler_type, db_conn)

        self.assertEqual(handler_type, ctx.exception.handler_type)
    def init(self):
        '''This method is invoked automatically in order to setup common dependencies for all test cases.'''

        self._tokens_service = Mock()
        self._tokens_service_cls = Mock(return_value=self._tokens_service)

        self._settings_facade = Mock()

        settings_facade_cls = Mock(return_value=self._settings_facade)
        self._settings_facade.get = self._mock_get_setting

        self._factory = GrantHandlerFactory(tokens_service_cls=self._tokens_service_cls, settings_facade_cls=settings_facade_cls)

        settings_facade_cls.assert_called_once_with()