示例#1
0
    def init(self):
        '''This method is invoked before each test case run in order to set common dependencies.'''

        self._model_facade = Mock()
        self._model_facade_cls = Mock(return_value=self._model_facade)

        self._db_conn = Mock()
        self._conn_manager = Mock()
        self._conn_manager.get_connection = Mock(return_value=self._db_conn)

        self._validator = PersonValidator(
            model_facade_cls=self._model_facade_cls,
            conn_manager=self._conn_manager)
    def init(self):
        '''This method is invoked before each test case run in order to set common dependencies.'''

        self._model_facade = Mock()
        self._model_facade_cls = Mock(return_value=self._model_facade)

        self._db_conn = Mock()
        self._conn_manager = Mock()
        self._conn_manager.get_connection = Mock(return_value=self._db_conn)

        self._validator = PersonValidator(model_facade_cls=self._model_facade_cls, conn_manager=self._conn_manager)
class PersonValidatorTests(FantasticoUnitTestsCase):
    '''This class provides the tests suite for person validator.'''

    _model_facade = None
    _model_facade_cls = None
    _conn_manager = None
    _db_conn = None
    _validator = None

    def init(self):
        '''This method is invoked before each test case run in order to set common dependencies.'''

        self._model_facade = Mock()
        self._model_facade_cls = Mock(return_value=self._model_facade)

        self._db_conn = Mock()
        self._conn_manager = Mock()
        self._conn_manager.get_connection = Mock(return_value=self._db_conn)

        self._validator = PersonValidator(model_facade_cls=self._model_facade_cls, conn_manager=self._conn_manager)

    def test_validate_post_notsupported(self):
        '''This test case ensures creation of new persons through api always fails.'''

        request = Mock()
        request.method = "POST"

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.validate({}, request)

    def test_format_notsupported(self):
        '''This test case ensures retrieval of persons through api always fails.'''

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.format_resource({}, Mock())

    def test_format_collection_notsupported(self):
        '''This test case ensures retrieval of persons collection through api allways fails.'''

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.format_collection([{}, {}], Mock())

    def test_validate_missing_firstname(self):
        '''This test case ensures missing first name generates a roa error.'''

        for resource in [None, Person(), Person(first_name=""), Person(first_name="     ")]:
            self._validate_missing_attr("first_name", resource)

    def test_validate_missing_lastname(self):
        '''This test case ensures missing first name generates a roa error.'''

        for resource in [Person(first_name="John", last_name=None),
                         Person(first_name="John", last_name=""),
                         Person(first_name="John", last_name="    ")]:
            self._validate_missing_attr("last_name", resource)

    def test_validate_personid_given(self):
        '''This test case ensures an exception is raised if person id attribut is specified in resource.'''

        resource = Person(first_name="John", last_name="Doe", email_address="*****@*****.**")
        resource.person_id = 1

        with self.assertRaises(FantasticoRoaError) as ctx:
            self._validator.validate(resource, Mock(), existing_resource_id=5)

        self.assertTrue(str(ctx.exception).find("person_id") > -1, "person_id is expected in exception message.")

    def test_validate_notowned_by(self):
        '''This test case ensures validate fails if the current person does not have the current logged in user associated with
        it.'''

        resource = Person(first_name="John", last_name="Doe", email_address="*****@*****.**")

        with self.assertRaises(OAuth2UnauthorizedError):
            self._test_validate_owned_by_user(resource, 1, person_id=10)

    def test_validate_ok(self):
        '''This test case ensures validate succeeds if all mandatory fields are provided and person has current logged in user
        associated to it.'''

        resource = Person(first_name="John", last_name="Doe", email_address="*****@*****.**")

        self._test_validate_owned_by_user(resource, 1, person_id=1)

    def _test_validate_owned_by_user(self, resource, user_id, person_id):
        '''This method provides a template for testing validation for scenarios where resource belongs / does not belong to
        expected user.'''

        token = Token({"user_id": user_id, "scopes": []})

        request = Mock()
        request.request_id = 1
        request.context = Mock()
        request.context.security = SecurityContext(token)

        self._model_facade.find_by_pk = Mock(return_value=User(person_id=1))

        self._validator.validate(resource, request, person_id)

        self._conn_manager.get_connection.assert_called_once_with(request.request_id)
        self._model_facade_cls.assert_called_once_with(User, self._db_conn)
        self._model_facade.find_by_pk.assert_called_once_with({User.user_id: token.user_id})

    def test_validate_missing_email(self):
        '''This test case ensures missing email address generates a roa error.'''

        for resource in [Person(first_name="John", last_name="Doe", email_address=None),
                         Person(first_name="John", last_name="Doe", email_address=""),
                         Person(first_name="John", last_name="Doe", email_address="     ")]:
            self._validate_missing_attr("email_address", resource)

    def _validate_missing_attr(self, attr_name, resource):
        '''This method provides a template for asserting missing attributes during validation.'''

        with self.assertRaises(FantasticoRoaError) as ctx:
            self._validator.validate(resource, Mock())

        self.assertTrue(str(ctx.exception).find(attr_name) > -1)
示例#4
0
class PersonValidatorTests(FantasticoUnitTestsCase):
    '''This class provides the tests suite for person validator.'''

    _model_facade = None
    _model_facade_cls = None
    _conn_manager = None
    _db_conn = None
    _validator = None

    def init(self):
        '''This method is invoked before each test case run in order to set common dependencies.'''

        self._model_facade = Mock()
        self._model_facade_cls = Mock(return_value=self._model_facade)

        self._db_conn = Mock()
        self._conn_manager = Mock()
        self._conn_manager.get_connection = Mock(return_value=self._db_conn)

        self._validator = PersonValidator(
            model_facade_cls=self._model_facade_cls,
            conn_manager=self._conn_manager)

    def test_validate_post_notsupported(self):
        '''This test case ensures creation of new persons through api always fails.'''

        request = Mock()
        request.method = "POST"

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.validate({}, request)

    def test_format_notsupported(self):
        '''This test case ensures retrieval of persons through api always fails.'''

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.format_resource({}, Mock())

    def test_format_collection_notsupported(self):
        '''This test case ensures retrieval of persons collection through api allways fails.'''

        with self.assertRaises(FantasticoRoaMethodNotSupportedError):
            self._validator.format_collection([{}, {}], Mock())

    def test_validate_missing_firstname(self):
        '''This test case ensures missing first name generates a roa error.'''

        for resource in [
                None,
                Person(),
                Person(first_name=""),
                Person(first_name="     ")
        ]:
            self._validate_missing_attr("first_name", resource)

    def test_validate_missing_lastname(self):
        '''This test case ensures missing first name generates a roa error.'''

        for resource in [
                Person(first_name="John", last_name=None),
                Person(first_name="John", last_name=""),
                Person(first_name="John", last_name="    ")
        ]:
            self._validate_missing_attr("last_name", resource)

    def test_validate_personid_given(self):
        '''This test case ensures an exception is raised if person id attribut is specified in resource.'''

        resource = Person(first_name="John",
                          last_name="Doe",
                          email_address="*****@*****.**")
        resource.person_id = 1

        with self.assertRaises(FantasticoRoaError) as ctx:
            self._validator.validate(resource, Mock(), existing_resource_id=5)

        self.assertTrue(
            str(ctx.exception).find("person_id") > -1,
            "person_id is expected in exception message.")

    def test_validate_notowned_by(self):
        '''This test case ensures validate fails if the current person does not have the current logged in user associated with
        it.'''

        resource = Person(first_name="John",
                          last_name="Doe",
                          email_address="*****@*****.**")

        with self.assertRaises(OAuth2UnauthorizedError):
            self._test_validate_owned_by_user(resource, 1, person_id=10)

    def test_validate_ok(self):
        '''This test case ensures validate succeeds if all mandatory fields are provided and person has current logged in user
        associated to it.'''

        resource = Person(first_name="John",
                          last_name="Doe",
                          email_address="*****@*****.**")

        self._test_validate_owned_by_user(resource, 1, person_id=1)

    def _test_validate_owned_by_user(self, resource, user_id, person_id):
        '''This method provides a template for testing validation for scenarios where resource belongs / does not belong to
        expected user.'''

        token = Token({"user_id": user_id, "scopes": []})

        request = Mock()
        request.request_id = 1
        request.context = Mock()
        request.context.security = SecurityContext(token)

        self._model_facade.find_by_pk = Mock(return_value=User(person_id=1))

        self._validator.validate(resource, request, person_id)

        self._conn_manager.get_connection.assert_called_once_with(
            request.request_id)
        self._model_facade_cls.assert_called_once_with(User, self._db_conn)
        self._model_facade.find_by_pk.assert_called_once_with(
            {User.user_id: token.user_id})

    def test_validate_missing_email(self):
        '''This test case ensures missing email address generates a roa error.'''

        for resource in [
                Person(first_name="John", last_name="Doe", email_address=None),
                Person(first_name="John", last_name="Doe", email_address=""),
                Person(first_name="John",
                       last_name="Doe",
                       email_address="     ")
        ]:
            self._validate_missing_attr("email_address", resource)

    def _validate_missing_attr(self, attr_name, resource):
        '''This method provides a template for asserting missing attributes during validation.'''

        with self.assertRaises(FantasticoRoaError) as ctx:
            self._validator.validate(resource, Mock())

        self.assertTrue(str(ctx.exception).find(attr_name) > -1)