def test_reconcile_transactions_within_fudge_factor(self, soft_assert_mock): """ tests a transanction with an early client date and late server date """ with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11 06:00"): new_old_xform = self._create_form() with freeze_time("2018-10-10 18:00"): new_old_trans = self._create_case_transaction(case, new_old_xform) with freeze_time("2018-10-11 06:00"): case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) with freeze_time("2018-10-11"): new_old_xform = self._create_form() new_old_trans = self._create_case_transaction(case, new_old_xform) case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertTrue(update_strategy.reconcile_transactions_if_necessary()) self._check_for_reconciliation_error_soft_assert(soft_assert_mock) CaseAccessorSQL.save_case(case) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary()) self._check_for_reconciliation_error_soft_assert(soft_assert_mock)
def test_save_processed_models_deprecated(self): existing_form, new_form = _simulate_form_edit() FormProcessorSQL.save_processed_models( ProcessedForms(new_form, existing_form)) self._validate_deprecation(existing_form, new_form)
def create_form_for_test(domain, case_id=None, attachments=None, save=True, state=XFormInstanceSQL.NORMAL): """ Create the models directly so that these tests aren't dependent on any other apps. Not testing form processing here anyway. :param case_id: create case with ID if supplied :param attachments: additional attachments dict :param save: if False return the unsaved form :return: form object """ from corehq.form_processor.utils import get_simple_form_xml form_id = uuid4().hex user_id = 'user1' utcnow = datetime.utcnow() form_xml = get_simple_form_xml(form_id, case_id) form = XFormInstanceSQL( form_id=form_id, xmlns='http://openrosa.org/formdesigner/form-processor', received_on=utcnow, user_id=user_id, domain=domain, state=state ) attachments = attachments or {} attachment_tuples = map( lambda a: Attachment(name=a[0], raw_content=a[1], content_type=a[1].content_type), attachments.items() ) attachment_tuples.append(Attachment('form.xml', form_xml, 'text/xml')) FormProcessorSQL.store_attachments(form, attachment_tuples) cases = [] if case_id: case = CommCareCaseSQL( case_id=case_id, domain=domain, type='', owner_id=user_id, opened_on=utcnow, modified_on=utcnow, modified_by=user_id, server_modified_on=utcnow, ) case.track_create(CaseTransaction.form_transaction(case, form)) cases = [case] if save: FormProcessorSQL.save_processed_models(ProcessedForms(form, None), cases) return form
def test_reconcile_not_necessary(self): with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11"): new_old_xform = self._create_form() new_old_trans = self._create_case_transaction(case, new_old_xform) case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary())
def test_first_transaction_not_create(self): with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-08"): new_old_xform = self._create_form() new_old_trans = self._create_case_transaction(case, new_old_xform) case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) self.assertTrue(case.check_transaction_order()) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertRaises(ReconciliationError, update_strategy.reconcile_transactions)
def _create_case(self, case_type=None, user_id=None, case_id=None): case_id = case_id or uuid.uuid4().hex user_id = user_id or 'mr_wednesday' utcnow = datetime.utcnow() case = CommCareCaseSQL( case_id=case_id, domain=self.DOMAIN, type=case_type or '', owner_id=user_id, opened_on=utcnow, modified_on=utcnow, modified_by=utcnow, server_modified_on=utcnow ) form = self._create_form(user_id, utcnow) case.track_create(self._create_case_transaction(case, form, utcnow, action_types=[128])) FormProcessorSQL.save_processed_models(ProcessedForms(form, []), [case]) return CaseAccessorSQL.get_case(case_id)
def _create_case(domain=None, form_id=None, case_type=None, user_id=None, closed=False): """ Create the models directly so that these tests aren't dependent on any other apps. Not testing form processing here anyway. :return: case_id """ domain = domain or DOMAIN form_id = form_id or uuid.uuid4().hex case_id = uuid.uuid4().hex user_id = user_id or 'user1' utcnow = datetime.utcnow() form = XFormInstanceSQL( form_id=form_id, xmlns='http://openrosa.org/formdesigner/form-processor', received_on=utcnow, user_id=user_id, domain=domain ) cases = [] if case_id: case = CommCareCaseSQL( case_id=case_id, domain=domain, type=case_type or '', owner_id=user_id, opened_on=utcnow, modified_on=utcnow, modified_by=user_id, server_modified_on=utcnow, closed=closed or False ) case.track_create(CaseTransaction.form_transaction(case, form)) cases = [case] FormProcessorSQL.save_processed_models(ProcessedForms(form, None), cases) return CaseAccessorSQL.get_case(case_id)
def _create_case(domain=None, form_id=None, case_type=None, user_id=None, closed=False, case_id=None): """ Create the models directly so that these tests aren't dependent on any other apps. Not testing form processing here anyway. :return: CommCareCaseSQL """ domain = domain or DOMAIN form_id = form_id or uuid.uuid4().hex case_id = case_id or uuid.uuid4().hex user_id = user_id or 'user1' utcnow = datetime.utcnow() form = XFormInstanceSQL( form_id=form_id, xmlns='http://openrosa.org/formdesigner/form-processor', received_on=utcnow, user_id=user_id, domain=domain) case = CommCareCaseSQL(case_id=case_id, domain=domain, type=case_type or '', owner_id=user_id, opened_on=utcnow, modified_on=utcnow, modified_by=user_id, server_modified_on=utcnow, closed=closed or False) case.track_create(CaseTransaction.form_transaction(case, form, utcnow)) cases = [case] FormProcessorSQL.save_processed_models(ProcessedForms(form, None), cases) return CaseAccessorSQL.get_case(case_id)
def _save_migrated_models(sql_form, case_stock_result): """ See SubmissionPost.save_processed_models for ~what this should do. However, note that that function does some things that this one shouldn't, e.g. process ownership cleanliness flags. """ forms_tuple = ProcessedForms(sql_form, None) stock_result = case_stock_result.stock_result if case_stock_result else None if stock_result: assert stock_result.populated return FormProcessorSQL.save_processed_models( forms_tuple, cases=case_stock_result.case_models if case_stock_result else None, stock_result=stock_result, publish_to_kafka=False)
def test_ignores_before_rebuild_transaction(self): with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11"): new_old_xform = self._create_form() with freeze_time("2018-10-08"): new_old_trans = self._create_case_transaction(case, new_old_xform) with freeze_time("2018-10-11"): case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) self.assertFalse(case.check_transaction_order()) with freeze_time("2018-10-13"): new_rebuild_xform = self._create_form() rebuild_detail = RebuildWithReason(reason="shadow's golden coin") rebuild_transaction = CaseTransaction.rebuild_transaction(case, rebuild_detail) case.track_create(rebuild_transaction) FormProcessorSQL.save_processed_models(ProcessedForms(new_rebuild_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary())
def _save_migrated_models(sql_form, case_stock_result=None): """ See SubmissionPost.save_processed_models for ~what this should do. However, note that that function does some things that this one shouldn't, e.g. process ownership cleanliness flags. """ forms_tuple = ProcessedForms(sql_form, None) stock_result = case_stock_result.stock_result if case_stock_result else None if stock_result: assert stock_result.populated return FormProcessorSQL.save_processed_models( forms_tuple, cases=case_stock_result.case_models if case_stock_result else None, stock_result=stock_result, publish_to_kafka=False )
if case_id: case = CommCareCaseSQL( case_id=case_id, domain=domain, type=case_type or '', owner_id=user_id, opened_on=utcnow, modified_on=utcnow, modified_by=user_id, server_modified_on=utcnow, closed=closed or False ) case.track_create(CaseTransaction.form_transaction(case, form)) cases = [case] FormProcessorSQL.save_processed_models(ProcessedForms(form, None), cases) return CaseAccessorSQL.get_case(case_id) def _create_case_with_index(referenced_case_id, identifier='parent', referenced_type='mother', relationship_id=CommCareCaseIndexSQL.CHILD, case_is_deleted=False, case_type='child'): case = _create_case(case_type=case_type) case.deleted = case_is_deleted index = CommCareCaseIndexSQL( case=case, identifier=identifier, referenced_type=referenced_type, referenced_id=referenced_case_id, relationship_id=relationship_id
def test_save_processed_models_deprecated(self): existing_form, new_form = _simulate_form_edit() FormProcessorSQL.save_processed_models(ProcessedForms(new_form, existing_form)) self._validate_deprecation(existing_form, new_form)