def test_reprocess_unfinished_submission_ledger_create(self): from corehq.apps.commtrack.tests.util import get_single_balance_block case_id = uuid.uuid4().hex self.factory.create_or_update_cases([ CaseStructure(case_id=case_id, attrs={ 'case_type': 'parent', 'create': True }) ]) transaction_patch = patch( 'corehq.form_processor.backends.sql.processor.transaction') ledger_save_patch = patch( 'corehq.form_processor.backends.sql.dbaccessors.LedgerAccessorSQL.save_ledger_values', side_effect=InternalError) with transaction_patch, ledger_save_patch, self.assertRaises( InternalError): submit_case_blocks( get_single_balance_block(case_id, 'product1', 100), self.domain) stubs = UnfinishedSubmissionStub.objects.filter(domain=self.domain, saved=False).all() self.assertEqual(1, len(stubs)) ledgers = LedgerAccessorSQL.get_ledger_values_for_case(case_id) self.assertEqual(0, len(ledgers)) # case transaction got saved case = CaseAccessorSQL.get_case(case_id) self.assertEqual(2, len(case.transactions)) self.assertTrue(case.transactions[0].is_case_create) self.assertTrue(case.transactions[1].is_ledger_transaction) ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case( case_id) self.assertEqual(0, len(ledger_transactions)) result = reprocess_unfinished_stub(stubs[0]) self.assertEqual(0, len(result.cases)) self.assertEqual(1, len(result.ledgers)) ledgers = LedgerAccessorSQL.get_ledger_values_for_case(case_id) self.assertEqual(1, len(ledgers)) ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case( case_id) self.assertEqual(1, len(ledger_transactions)) # case still only has 2 transactions case = CaseAccessorSQL.get_case(case_id) self.assertEqual(2, len(case.transactions))
def test_delete_ledger_values_case_section(self): from corehq.apps.commtrack.tests.util import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, product_id, 10) for product_id in [self.product_a._id, self.product_b._id] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form([self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values(self.case_one.case_id, 'stock') self.assertEqual(2, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(0, len(ledger_values))
def test_delete_ledger_values_case_section_1(self): from corehq.apps.commtrack.tests import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, self.product_a._id, 10, section_id=section_id) for section_id in ['stock', 'consumption'] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form([self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values(self.case_one.case_id, 'stock') self.assertEqual(1, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(1, len(ledger_values)) self.assertEqual('consumption', ledger_values[0].section_id)
def test_delete_ledger_values_case_section(self): from corehq.apps.commtrack.tests.util import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, product_id, 10) for product_id in [self.product_a._id, self.product_b._id] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case( self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form( [self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values( self.case_one.case_id, 'stock') self.assertEqual(2, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case( self.case_one.case_id) self.assertEqual(0, len(ledger_values))
def setUp(self): # can't do this in setUpClass until Django 1.9 since @override_settings # doesn't apply to classmethods from corehq.apps.commtrack.tests import get_single_balance_block factory = CaseFactory(domain=self.domain) self.case = factory.create_case() submit_case_blocks([ get_single_balance_block(self.case.case_id, self.product._id, 10) ], self.domain) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case.case_id) self.assertEqual(1, len(ledger_values))
def test_ledgers(self): expected_object_counts = Counter({ XFormInstanceSQL: 3, BlobMeta: 3, CommCareCaseSQL: 1, CaseTransaction: 3, LedgerValue: 1, LedgerTransaction: 2 }) case = self.factory.create_case() submit_case_blocks([ get_single_balance_block(case.case_id, self.product._id, 10) ], self.domain_name) submit_case_blocks([ get_single_balance_block(case.case_id, self.product._id, 5) ], self.domain_name) pre_ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(case.case_id) pre_ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(case.case_id) self.assertEqual(1, len(pre_ledger_values)) self.assertEqual(2, len(pre_ledger_transactions)) self._dump_and_load(expected_object_counts) post_ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(case.case_id) post_ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(case.case_id) self.assertEqual(1, len(post_ledger_values)) self.assertEqual(2, len(post_ledger_transactions)) self.assertEqual(pre_ledger_values[0].ledger_reference, post_ledger_values[0].ledger_reference) self.assertDictEqual(pre_ledger_values[0].to_json(), post_ledger_values[0].to_json()) pre_ledger_transactions = sorted(pre_ledger_transactions, key=lambda t: t.pk) post_ledger_transactions = sorted(post_ledger_transactions, key=lambda t: t.pk) for pre, post in zip(pre_ledger_transactions, post_ledger_transactions): self.assertEqual(str(pre), str(post))
def get_ledgers_for_case(self, case_id): return LedgerAccessorSQL.get_ledger_values_for_case(case_id)
def test_reprocess_unfinished_submission_ledger_rebuild(self): from corehq.apps.commtrack.tests.util import get_single_balance_block case_id = uuid.uuid4().hex form_ids = [] form_ids.append( submit_case_blocks([ CaseBlock(case_id=case_id, create=True, case_type='shop').as_string(), get_single_balance_block(case_id, 'product1', 100), ], self.domain)[0].form_id) transaction_patch = patch( 'corehq.form_processor.backends.sql.processor.transaction') ledger_save_patch = patch( 'corehq.form_processor.backends.sql.dbaccessors.LedgerAccessorSQL.save_ledger_values', side_effect=InternalError) with transaction_patch, ledger_save_patch, self.assertRaises( InternalError): submit_case_blocks( get_single_balance_block(case_id, 'product1', 50), self.domain) stubs = UnfinishedSubmissionStub.objects.filter(domain=self.domain, saved=False).all() self.assertEqual(1, len(stubs)) form_ids.append(stubs[0].xform_id) # submit another form afterwards form_ids.append( submit_case_blocks( get_single_balance_block(case_id, 'product1', 25), self.domain)[0].form_id) ledgers = LedgerAccessorSQL.get_ledger_values_for_case(case_id) self.assertEqual(1, len(ledgers)) self.assertEqual(25, ledgers[0].balance) ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case( case_id) self.assertEqual(2, len(ledger_transactions)) # should rebuild ledger transactions result = reprocess_unfinished_stub(stubs[0]) self.assertEqual(0, len(result.cases)) self.assertEqual(1, len(result.ledgers)) ledgers = LedgerAccessorSQL.get_ledger_values_for_case(case_id) self.assertEqual(1, len(ledgers)) # still only 1 self.assertEqual(25, ledgers[0].balance) ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case( case_id) self.assertEqual(3, len(ledger_transactions)) # make sure transactions are in correct order self.assertEqual(form_ids, [trans.form_id for trans in ledger_transactions]) self.assertEqual(100, ledger_transactions[0].updated_balance) self.assertEqual(100, ledger_transactions[0].delta) self.assertEqual(50, ledger_transactions[1].updated_balance) self.assertEqual(-50, ledger_transactions[1].delta) self.assertEqual(25, ledger_transactions[2].updated_balance) self.assertEqual(-25, ledger_transactions[2].delta)