def test_message(self): model = base_models.BaseModel(id='123', created_on=self.NOW, last_updated=self.YEAR_AGO) error = audit_errors.InconsistentTimestampsError(model) self.assertEqual( error.message, 'InconsistentTimestampsError in BaseModel(id="123"): created_on=%r ' 'is later than last_updated=%r' % (self.NOW, self.YEAR_AGO))
def test_process_reports_model_timestamp_relationship_error(self): invalid_timestamp = base_models.BaseModel(id='123', created_on=self.NOW, last_updated=self.YEAR_AGO) output = (self.pipeline | beam.Create([invalid_timestamp]) | beam.ParDo(base_model_audits.ValidateModelTimestamps())) self.assert_pcoll_equal(output, [ audit_errors.InconsistentTimestampsError(invalid_timestamp), ])
def process(self, input_model): """Function that defines how to process each element in a pipeline of models. Args: input_model: datastore_services.Model. Entity to validate. Yields: ModelMutatedDuringJobError. Error for models mutated during the job. InconsistentTimestampsError. Error for models with inconsistent timestamps. """ model = jobs_utils.clone_model(input_model) if model.created_on > (model.last_updated + MAX_CLOCK_SKEW_SECS): yield audit_errors.InconsistentTimestampsError(model) current_datetime = datetime.datetime.utcnow() if (model.last_updated - MAX_CLOCK_SKEW_SECS) > current_datetime: yield audit_errors.ModelMutatedDuringJobError(model)
def test_base_model_audits(self): base_model_with_invalid_id = base_models.BaseModel( id='123@?!*', deleted=False, created_on=self.YEAR_AGO, last_updated=self.NOW) base_model_with_invalid_timestamps = base_models.BaseModel( id='124', deleted=False, created_on=self.NOW, last_updated=self.YEAR_LATER) base_model_with_inconsistent_timestamps = base_models.BaseModel( id='125', deleted=False, created_on=self.YEAR_LATER, last_updated=self.YEAR_AGO) expired_base_model = base_models.BaseModel(id='126', deleted=True, created_on=self.YEAR_AGO, last_updated=self.YEAR_AGO) valid_base_model = base_models.BaseModel(id='127', deleted=False, created_on=self.YEAR_AGO, last_updated=self.NOW) self.model_io_stub.put_multi([ base_model_with_invalid_id, base_model_with_invalid_timestamps, base_model_with_inconsistent_timestamps, expired_base_model, valid_base_model, ]) self.assert_job_output_is([ audit_errors.ModelIdRegexError( base_model_with_invalid_id, base_model_audits.BASE_MODEL_ID_PATTERN), audit_errors.ModelMutatedDuringJobError( base_model_with_invalid_timestamps), audit_errors.InconsistentTimestampsError( base_model_with_inconsistent_timestamps), audit_errors.ModelExpiredError(expired_base_model), ])