def test_simple_delete(self): factory = CaseFactory() case = factory.create_case() [case] = factory.create_or_update_case( CaseStructure(case_id=case.case_id, attrs={'update': {'foo': 'bar'}}) ) self.assertIsNotNone(self.casedb.get_case(case.case_id)) self.assertEqual(2, len(case.xform_ids)) for form_id in case.xform_ids: self.assertIsNotNone(self.formdb.get_form(form_id)) with capture_kafka_changes_context(topics.FORM_SQL, topics.CASE_SQL) as change_context: safe_hard_delete(case) if should_use_sql_backend(case.domain): self.assertEqual(3, len(change_context.changes)) expected_ids = {case.case_id} | set(case.xform_ids) self.assertEqual(expected_ids, {change.id for change in change_context.changes}) for change in change_context.changes: self.assertTrue(change.deleted) with self.assertRaises(CaseNotFound): self.casedb.get_case(case.case_id) for form_id in case.xform_ids: with self.assertRaises(XFormNotFound): self.formdb.get_form(form_id)
def test_form_archiving(self): now = datetime.utcnow() # make sure we timestamp everything so they have the right order case_id = _post_util(create=True, p1='p1-1', p2='p2-1', form_extras={'received_on': now}) _post_util(case_id=case_id, p2='p2-2', p3='p3-2', p4='p4-2', form_extras={'received_on': now + timedelta(seconds=1)}) _post_util(case_id=case_id, p4='p4-3', p5='p5-3', close=True, form_extras={'received_on': now + timedelta(seconds=2)}) case_accessors = CaseAccessors(REBUILD_TEST_DOMAIN) case = case_accessors.get_case(case_id) closed_by = case.closed_by closed_on = case.closed_on self.assertNotEqual('', closed_by) self.assertNotEqual(None, closed_on) def _check_initial_state(case): self.assertTrue(case.closed) self.assertEqual(closed_by, case.closed_by) self.assertEqual(closed_on, case.closed_on) self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-2') # updated in second post self.assertEqual(case.get_case_property('p3'), 'p3-2') # new in second post self.assertEqual(case.get_case_property('p4'), 'p4-3') # updated in third post self.assertEqual(case.get_case_property('p5'), 'p5-3') # new in third post if should_use_sql_backend(REBUILD_TEST_DOMAIN): # SQL stores one transaction per form self.assertEqual(3, len(primary_actions(case))) # create + update + close else: self.assertEqual(5, len(primary_actions(case))) # create + 3 updates + close _check_initial_state(case) # verify xform/action states [f1, f2, f3] = case.xform_ids if should_use_sql_backend(REBUILD_TEST_DOMAIN): [create, update, close] = case.actions self.assertEqual(f1, create.form_id) self.assertEqual(f2, update.form_id) self.assertEqual(f3, close.form_id) else: [create, u1, u2, u3, close] = case.actions self.assertEqual(f1, create.form_id) self.assertEqual(f1, u1.form_id) self.assertEqual(f2, u2.form_id) self.assertEqual(f3, u3.form_id) # todo: should this be the behavior for archiving the create form? form_acessors = FormAccessors(REBUILD_TEST_DOMAIN) f1_doc = form_acessors.get_form(f1) with capture_kafka_changes_context(topics.CASE_SQL) as change_context: f1_doc.archive() if should_use_sql_backend(case.domain): self.assertEqual([case.case_id], [change.id for change in change_context.changes])
def testPublishChanges(self): xml_data = self.get_xml('basic') response, xform, cases = submit_form_locally( xml_data, 'test-domain', ) with capture_kafka_changes_context(topics.FORM_SQL) as change_context: with drop_connected_signals(xform_archived): xform.archive() self.assertEqual(1, len(change_context.changes)) self.assertEqual(change_context.changes[0].id, xform.form_id) xform = self.formdb.get_form(xform.form_id) with capture_kafka_changes_context(topics.FORM_SQL) as change_context: with drop_connected_signals(xform_unarchived): xform.unarchive() self.assertEqual(1, len(change_context.changes)) self.assertEqual(change_context.changes[0].id, xform.form_id)
self.formdb = FormAccessors(TEST_DOMAIN_NAME) def test_simple_delete(self): factory = CaseFactory() case = factory.create_case() [case] = factory.create_or_update_case( CaseStructure(case_id=case.case_id, attrs={'update': { 'foo': 'bar' }})) self.assertIsNotNone(self.casedb.get_case(case.case_id)) self.assertEqual(2, len(case.xform_ids)) for form_id in case.xform_ids: self.assertIsNotNone(self.formdb.get_form(form_id)) with capture_kafka_changes_context(topics.FORM_SQL, topics.CASE_SQL) as change_context: safe_hard_delete(case) if should_use_sql_backend(case.domain): self.assertEqual(3, len(change_context.changes)) expected_ids = {case.case_id} | set(case.xform_ids) self.assertEqual(expected_ids, {change.id for change in change_context.changes}) for change in change_context.changes: self.assertTrue(change.deleted) with self.assertRaises(CaseNotFound): self.casedb.get_case(case.case_id) for form_id in case.xform_ids:
def test_form_archiving(self): now = datetime.utcnow() # make sure we timestamp everything so they have the right order case_id = _post_util(create=True, p1='p1-1', p2='p2-1', form_extras={'received_on': now}) _post_util(case_id=case_id, p2='p2-2', p3='p3-2', p4='p4-2', form_extras={'received_on': now + timedelta(seconds=1)}) _post_util(case_id=case_id, p4='p4-3', p5='p5-3', close=True, form_extras={'received_on': now + timedelta(seconds=2)}) case_accessors = CaseAccessors(REBUILD_TEST_DOMAIN) case = case_accessors.get_case(case_id) closed_by = case.closed_by closed_on = case.closed_on self.assertNotEqual('', closed_by) self.assertNotEqual(None, closed_on) def _check_initial_state(case): self.assertTrue(case.closed) self.assertEqual(closed_by, case.closed_by) self.assertEqual(closed_on, case.closed_on) self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-2') # updated in second post self.assertEqual(case.get_case_property('p3'), 'p3-2') # new in second post self.assertEqual(case.get_case_property('p4'), 'p4-3') # updated in third post self.assertEqual(case.get_case_property('p5'), 'p5-3') # new in third post if should_use_sql_backend(REBUILD_TEST_DOMAIN): # SQL stores one transaction per form self.assertEqual(3, len(primary_actions(case))) # create + update + close else: self.assertEqual(5, len(primary_actions(case))) # create + 3 updates + close _check_initial_state(case) # verify xform/action states [f1, f2, f3] = case.xform_ids if should_use_sql_backend(REBUILD_TEST_DOMAIN): [create, update, close] = case.actions self.assertEqual(f1, create.form_id) self.assertEqual(f2, update.form_id) self.assertEqual(f3, close.form_id) else: [create, u1, u2, u3, close] = case.actions self.assertEqual(f1, create.form_id) self.assertEqual(f1, u1.form_id) self.assertEqual(f2, u2.form_id) self.assertEqual(f3, u3.form_id) # todo: should this be the behavior for archiving the create form? form_acessors = FormAccessors(REBUILD_TEST_DOMAIN) f1_doc = form_acessors.get_form(f1) with capture_kafka_changes_context(topics.CASE_SQL) as change_context: f1_doc.archive() if should_use_sql_backend(case.domain): self.assertEqual([case.case_id], [change.id for change in change_context.changes]) case = case_accessors.get_case(case_id) if should_use_sql_backend(REBUILD_TEST_DOMAIN): self.assertEqual(2, len(primary_actions(case))) else: self.assertEqual(3, len(primary_actions(case))) [u2, u3] = case.xform_ids self.assertEqual(f2, u2) self.assertEqual(f3, u3) self.assertTrue(case.closed) # no change self.assertFalse('p1' in case.dynamic_case_properties()) # should disappear entirely self.assertEqual(case.get_case_property('p2'), 'p2-2') # no change self.assertEqual(case.get_case_property('p3'), 'p3-2') # no change self.assertEqual(case.get_case_property('p4'), 'p4-3') # no change self.assertEqual(case.get_case_property('p5'), 'p5-3') # no change def _reset(form_id): form_doc = form_acessors.get_form(form_id) form_doc.unarchive() case = case_accessors.get_case(case_id) _check_initial_state(case) _reset(f1) f2_doc = form_acessors.get_form(f2) f2_doc.archive() case = case_accessors.get_case(case_id) if should_use_sql_backend(REBUILD_TEST_DOMAIN): self.assertEqual(2, len(primary_actions(case))) else: self.assertEqual(4, len(primary_actions(case))) [u1, u3] = case.xform_ids self.assertEqual(f1, u1) self.assertEqual(f3, u3) self.assertTrue(case.closed) # no change self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-1') # loses second form update self.assertFalse('p3' in case.dynamic_case_properties()) # should disappear entirely self.assertEqual(case.get_case_property('p4'), 'p4-3') # no change self.assertEqual(case.get_case_property('p5'), 'p5-3') # no change _reset(f2) f3_doc = form_acessors.get_form(f3) f3_doc.archive() case = case_accessors.get_case(case_id) if should_use_sql_backend(REBUILD_TEST_DOMAIN): self.assertEqual(2, len(primary_actions(case))) else: self.assertEqual(3, len(primary_actions(case))) [u1, u2] = case.xform_ids self.assertEqual(f1, u1) self.assertEqual(f2, u2) self.assertFalse(case.closed) # reopened! self.assertEqual('', case.closed_by) self.assertEqual(None, case.closed_on) self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-2') # original self.assertEqual(case.get_case_property('p3'), 'p3-2') # new in second post self.assertEqual(case.get_case_property('p4'), 'p4-2') # loses third form update self.assertFalse('p5' in case.dynamic_case_properties()) # should disappear entirely _reset(f3)
def test_form_archiving(self): now = datetime.utcnow() # make sure we timestamp everything so they have the right order case_id = _post_util(create=True, p1='p1-1', p2='p2-1', form_extras={'received_on': now}) _post_util(case_id=case_id, p2='p2-2', p3='p3-2', p4='p4-2', form_extras={'received_on': now + timedelta(seconds=1)}) _post_util(case_id=case_id, p4='p4-3', p5='p5-3', close=True, form_extras={'received_on': now + timedelta(seconds=2)}) case = CommCareCase.objects.get_case(case_id, REBUILD_TEST_DOMAIN) closed_by = case.closed_by closed_on = case.closed_on self.assertNotEqual('', closed_by) self.assertNotEqual(None, closed_on) def _check_initial_state(case): self.assertTrue(case.closed) self.assertEqual(closed_by, case.closed_by) self.assertEqual(closed_on, case.closed_on) self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-2') # updated in second post self.assertEqual(case.get_case_property('p3'), 'p3-2') # new in second post self.assertEqual(case.get_case_property('p4'), 'p4-3') # updated in third post self.assertEqual(case.get_case_property('p5'), 'p5-3') # new in third post # SQL stores one transaction per form self.assertEqual(3, len( primary_actions(case))) # create + update + close _check_initial_state(case) # verify xform/action states [f1, f2, f3] = case.xform_ids [create, update, close] = case.actions self.assertEqual(f1, create.form_id) self.assertEqual(f2, update.form_id) self.assertEqual(f3, close.form_id) # todo: should this be the behavior for archiving the create form? get_form = XFormInstance.objects.get_form f1_doc = get_form(f1) with capture_kafka_changes_context(topics.CASE_SQL) as change_context: f1_doc.archive() self.assertEqual([case.case_id], [change.id for change in change_context.changes]) case = CommCareCase.objects.get_case(case_id, REBUILD_TEST_DOMAIN) self.assertEqual(2, len(primary_actions(case))) [u2, u3] = case.xform_ids self.assertEqual(f2, u2) self.assertEqual(f3, u3) self.assertTrue(case.closed) # no change self.assertFalse( 'p1' in case.dynamic_case_properties()) # should disappear entirely self.assertEqual(case.get_case_property('p2'), 'p2-2') # no change self.assertEqual(case.get_case_property('p3'), 'p3-2') # no change self.assertEqual(case.get_case_property('p4'), 'p4-3') # no change self.assertEqual(case.get_case_property('p5'), 'p5-3') # no change def _reset(form_id): form_doc = get_form(form_id) form_doc.unarchive() case = CommCareCase.objects.get_case(case_id, REBUILD_TEST_DOMAIN) _check_initial_state(case) _reset(f1) f2_doc = get_form(f2) f2_doc.archive() case = CommCareCase.objects.get_case(case_id, REBUILD_TEST_DOMAIN) self.assertEqual(2, len(primary_actions(case))) [u1, u3] = case.xform_ids self.assertEqual(f1, u1) self.assertEqual(f3, u3) self.assertTrue(case.closed) # no change self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-1') # loses second form update self.assertFalse( 'p3' in case.dynamic_case_properties()) # should disappear entirely self.assertEqual(case.get_case_property('p4'), 'p4-3') # no change self.assertEqual(case.get_case_property('p5'), 'p5-3') # no change _reset(f2) f3_doc = get_form(f3) f3_doc.archive() case = CommCareCase.objects.get_case(case_id, REBUILD_TEST_DOMAIN) self.assertEqual(2, len(primary_actions(case))) [u1, u2] = case.xform_ids self.assertEqual(f1, u1) self.assertEqual(f2, u2) self.assertFalse(case.closed) # reopened! self.assertEqual('', case.closed_by) self.assertEqual(None, case.closed_on) self.assertEqual(case.get_case_property('p1'), 'p1-1') # original self.assertEqual(case.get_case_property('p2'), 'p2-2') # original self.assertEqual(case.get_case_property('p3'), 'p3-2') # new in second post self.assertEqual(case.get_case_property('p4'), 'p4-2') # loses third form update self.assertFalse( 'p5' in case.dynamic_case_properties()) # should disappear entirely _reset(f3)