def test_broken_save(self): """ Test that if the second form submission terminates unexpectedly and the main form isn't saved, then there are no side effects such as the original having been marked as deprecated. """ class BorkDB(object): """context manager for making a db's bulk_save temporarily fail""" def __init__(self, db): self.old = {} self.db = db def __enter__(self): self.old['bulk_save'] = self.db.bulk_save self.db.bulk_save = MagicMock(name='bulk_save', side_effect=RequestFailed()) def __exit__(self, exc_type, exc_val, exc_tb): self.db.bulk_save = self.old['bulk_save'] xforms = FormProcessorInterface.get_by_doc_type(self.domain, 'XFormInstance') self.assertEqual(len(xforms), 0) xml_data1, xml_data2 = self._get_files() submit_form_locally(xml_data1, self.domain) xform = FormProcessorInterface.get_xform(self.ID) self.assertEqual(self.ID, xform.id) self.assertEqual("XFormInstance", xform.doc_type) self.assertEqual(self.domain, xform.domain) self.assertEqual( UnfinishedSubmissionStub.objects.filter(xform_id=self.ID).count(), 0 ) # This seems like a couch specific test util. Will likely need postgres test utils with BorkDB(XFormInstance.get_db()): with self.assertRaises(RequestFailed): submit_form_locally(xml_data2, self.domain) # it didn't go through, so make sure there are no edits still xforms = FormProcessorInterface.get_by_doc_type(self.domain, 'XFormDeprecated') self.assertEqual(len(xforms), 0) xform = FormProcessorInterface.get_xform(self.ID) self.assertIsNotNone(xform) self.assertEqual( UnfinishedSubmissionStub.objects.filter(xform_id=self.ID, saved=False).count(), 1 ) self.assertEqual( UnfinishedSubmissionStub.objects.filter(xform_id=self.ID).count(), 1 )
def test_no_case_id(self): """ submit form with a case block that has no case_id check that - it errors - the form is not saved under its original id - an XFormError is saved with the original id as orig_id - the error was logged (<-- is this hard to test?) <data xmlns="example.com/foo"> <case case_id=""> <update><foo>bar</foo></update> </case> </data> """ submit_form_locally( """<data xmlns="example.com/foo"> <meta> <instanceID>abc-easy-as-123</instanceID> </meta> <case case_id="" xmlns="http://commcarehq.org/case/transaction/v2"> <update><foo>bar</foo></update> </case> </data>""", 'my_very_special_domain', ) xform_errors = FormProcessorInterface.get_by_doc_type('my_very_special_domain', 'XFormError') related_errors = [xform_error for xform_error in xform_errors if xform_error.id == 'abc-easy-as-123'] self.assertEqual(len(related_errors), 1) related_error = related_errors[0] self.assertEqual(related_error.problem, 'IllegalCaseId: case_id must not be empty')
def test_uses_referrals(self): """ submit form with a case block that uses referrals check that - it errors - the form is not saved under its original id - an XFormError is saved with the original id as orig_id """ submit_form_locally( """<data xmlns="example.com/foo"> <meta> <instanceID>abc-easy-as-456</instanceID> </meta> <case case_id="123" xmlns="http://commcarehq.org/case/transaction/v2"> <referral> <referral_id>456</referral_id> <open> <referral_types>t1 t2</referral_types> </open> </referral> </case> </data>""", 'my_very_special_domain', ) xform_errors = FormProcessorInterface.get_by_doc_type('my_very_special_domain', 'XFormError') related_errors = [xform_error for xform_error in xform_errors if xform_error.id == 'abc-easy-as-456'] self.assertEqual(len(related_errors), 1) related_error = related_errors[0] self.assertEqual(related_error.problem, 'UsesReferrals: Sorry, referrals are no longer supported!')
def test_basic_edit(self): xml_data1, xml_data2 = self._get_files() yesterday = datetime.utcnow() - timedelta(days=1) xform = FormProcessorInterface.post_xform(xml_data1) self.assertEqual(self.ID, xform.id) self.assertEqual("XFormInstance", xform.doc_type) self.assertEqual("", xform.form['vitals']['height']) self.assertEqual("other", xform.form['assessment']['categories']) # post form back in time to simulate an edit FormProcessorInterface.update_properties( xform, domain=self.domain, received_on=yesterday, ) xform = FormProcessorInterface.post_xform(xml_data2, domain=self.domain) self.assertEqual(self.ID, xform.id) self.assertEqual("XFormInstance", xform.doc_type) self.assertEqual("100", xform.form['vitals']['height']) self.assertEqual("Edited Baby!", xform.form['assessment']['categories']) [deprecated_xform] = FormProcessorInterface.get_by_doc_type(self.domain, 'XFormDeprecated') self.assertEqual(self.ID, deprecated_xform.orig_id) self.assertNotEqual(self.ID, deprecated_xform.id) self.assertEqual('XFormDeprecated', deprecated_xform.doc_type) self.assertEqual("", deprecated_xform.form['vitals']['height']) self.assertEqual("other", deprecated_xform.form['assessment']['categories']) self.assertEqual(xform.received_on, deprecated_xform.received_on) self.assertEqual(xform.deprecated_form_id, deprecated_xform.id) self.assertTrue(xform.edited_on > deprecated_xform.received_on) self.assertEqual( FormProcessorInterface.get_attachment(deprecated_xform.id, 'form.xml'), xml_data1 ) self.assertEqual(FormProcessorInterface.get_attachment(self.ID, 'form.xml'), xml_data2)