def testSQLSyncToCouch(self): self.assertEqual(self.getCouchCount(), 0) self.assertEqual(self.getSQLCount(), 0) # Test Create sql_obj = PhoneNumber() self.setRandomSQLObjectValues(sql_obj) sql_obj.save() sleep(1) self.assertEqual(self.getCouchCount(), 1) self.assertEqual(self.getSQLCount(), 1) couch_obj = VerifiedNumber.get(sql_obj.couch_id) self.checkFieldValues(couch_obj, sql_obj, PhoneNumber._migration_get_fields()) self.assertTrue(VerifiedNumber.get_db().get_rev(couch_obj._id).startswith('2-')) # Test Update self.setRandomSQLObjectValues(sql_obj) sql_obj.save() sleep(1) self.assertEqual(self.getCouchCount(), 1) self.assertEqual(self.getSQLCount(), 1) couch_obj = VerifiedNumber.get(sql_obj.couch_id) self.checkFieldValues(couch_obj, sql_obj, PhoneNumber._migration_get_fields()) self.assertTrue(VerifiedNumber.get_db().get_rev(couch_obj._id).startswith('3-')) # Test Delete couch_id = couch_obj._id sql_obj.delete() with self.assertRaises(ResourceNotFound): VerifiedNumber.get(couch_id) self.assertEqual(self.getCouchCount(), 0) self.assertEqual(self.getSQLCount(), 0)
def _test_cache_clear(self, refresh_each_time=True): """ A test to make sure that the cache clearing is working as expected. This test gets run twice using different values for refresh_each_time. This makes sure that the mechanism used for clearing the cache works whether you're updating a document you just saved or getting a document fresh from the database and updating it. """ created = PhoneNumber( domain='phone-number-test', owner_doc_type='CommCareCase', owner_id='fake-owner-id1', phone_number='99912341234', backend_id=None, ivr_backend_id=None, verified=True, pending_verification=False, is_two_way=True, contact_last_modified=datetime.utcnow() ) created.save() self.assertNoMatch('99952345234', '52345234', 'fake-owner-id2') self.assertMatch(created, '99912341234', '12341234', 'fake-owner-id1') # Update Phone Number if refresh_each_time: created = PhoneNumber.objects.get(pk=created.pk) created.phone_number = '99952345234' created.save() self.assertNoMatch('99912341234', '12341234', 'fake-owner-id2') self.assertMatch(created, '99952345234', '52345234', 'fake-owner-id1') # Update Owner Id if refresh_each_time: created = PhoneNumber.objects.get(pk=created.pk) created.owner_id = 'fake-owner-id2' created.save() self.assertNoMatch('99912341234', '12341234', 'fake-owner-id1') self.assertMatch(created, '99952345234', '52345234', 'fake-owner-id2') created.delete() self.assertNoMatch('99952345234', '52345234', 'fake-owner-id2')
def _sync_case_phone_number(contact_case): phone_info = contact_case.get_phone_info() lock_keys = ['sync-case-phone-number-for-%s' % contact_case.case_id] if phone_info.phone_number: lock_keys.append('verifying-phone-number-%s' % phone_info.phone_number) with CriticalSection(lock_keys, timeout=5 * 60): phone_number = contact_case.get_verified_number() if ( phone_number and phone_number.contact_last_modified and phone_number.contact_last_modified >= contact_case.server_modified_on ): return if phone_info.requires_entry: try: contact_case.verify_unique_number(phone_info.phone_number) except (InvalidFormatException, PhoneNumberInUseException): if phone_number: phone_number.delete() return if not phone_number: phone_number = PhoneNumber( domain=contact_case.domain, owner_doc_type=contact_case.doc_type, owner_id=contact_case.case_id, ) elif _phone_number_is_same(phone_number, phone_info): return phone_number.phone_number = phone_info.phone_number phone_number.backend_id = phone_info.sms_backend_id phone_number.ivr_backend_id = phone_info.ivr_backend_id phone_number.verified = True phone_number.contact_last_modified = contact_case.server_modified_on phone_number.save() else: if phone_number: phone_number.delete()