def process(self, entity): """Function that defines how to process each entity in a pipeline of models. Args: entity: datastore_services.Model. A domain object to validate. Yields: ModelDomainObjectValidateError. Error for domain object validation. """ try: domain_object = self._get_model_domain_object_instance(entity) # pylint: disable=assignment-from-none validation_type = self._get_domain_object_validation_type(entity) if domain_object is None: return if validation_type == VALIDATION_MODES.neutral: domain_object.validate() elif validation_type == VALIDATION_MODES.strict: domain_object.validate(strict=True) elif validation_type == VALIDATION_MODES.non_strict: domain_object.validate(strict=False) else: raise Exception( 'Invalid validation type for domain object: %s' % (validation_type)) except Exception as e: yield base_validation_errors.ModelDomainObjectValidateError( entity, e)
def test_model_domain_object_validate_error(self) -> None: model = base_models.BaseModel(id='123', deleted=True, created_on=self.YEAR_AGO, last_updated=self.YEAR_AGO) error_message = 'Invalid validation type for domain object: Invalid' error = base_validation_errors.ModelDomainObjectValidateError( model, error_message) msg = ('ModelDomainObjectValidateError in BaseModel(id="123"): Entity' ' fails domain validation with the error: %s' % error_message) self.assertEqual(error.stderr, msg)
def test_error_is_raised_with_invalid_validation_type_for_domain_object( self): model = base_models.BaseModel(id='mock-123', deleted=False, created_on=self.YEAR_AGO, last_updated=self.NOW) output = (self.pipeline | beam.Create([model]) | beam.ParDo( MockValidateModelDomainObjectInstancesWithInvalid())) self.assert_pcoll_equal(output, [ base_validation_errors.ModelDomainObjectValidateError( model, 'Invalid validation type for domain object: invalid') ])
def test_validation_type_for_exploration_domain_object(self) -> None: model_instance1 = exp_models.ExplorationModel( id='mock-123', title='title', category='category', language_code='en', init_state_name=feconf.DEFAULT_INIT_STATE_NAME, states={ feconf.DEFAULT_INIT_STATE_NAME: ( state_domain.State.create_default_state( # type: ignore[no-untyped-call] feconf.DEFAULT_INIT_STATE_NAME, is_initial_state=True ).to_dict()), }, states_schema_version=feconf.CURRENT_STATE_SCHEMA_VERSION, created_on=self.YEAR_AGO, last_updated=self.NOW ) model_instance2 = exp_models.ExplorationModel( id='mock-123', title='title', category='category', language_code='en', init_state_name=feconf.DEFAULT_INIT_STATE_NAME, states={ feconf.DEFAULT_INIT_STATE_NAME: ( state_domain.State.create_default_state( # type: ignore[no-untyped-call] 'end', is_initial_state=True ).to_dict()), }, states_schema_version=feconf.CURRENT_STATE_SCHEMA_VERSION, created_on=self.YEAR_AGO, last_updated=self.NOW ) output = ( self.pipeline | beam.Create([model_instance1, model_instance2]) | beam.ParDo(MockValidateExplorationModelDomainObjectInstances()) ) self.assert_pcoll_equal(output, [ base_validation_errors.ModelDomainObjectValidateError( model_instance2, 'The destination end is not a valid state.') ])