def test_sync_log(self): from casexml.apps.phone.models import SyncLog, SimplifiedSyncLog from corehq.apps.users.models import WebUser, CommCareUser from casexml.apps.phone.models import get_sync_log_class_by_format web_user = WebUser.create( domain=self.domain_name, username='******', password='******', email='*****@*****.**', ) mobile_user = CommCareUser.create( self.domain_name, 'mobile_user1', 'secret' ) other_user = CommCareUser.create( 'other_domain', 'mobile_user2', 'secret' ) self.addCleanup(other_user.delete) l1 = SyncLog(user_id=web_user._id) l1.save() l2 = SimplifiedSyncLog(user_id=mobile_user._id) l2.save() other_log = SyncLog(user_id=other_user._id) other_log.save() def _synclog_to_class(doc): if doc['doc_type'] == 'SyncLog': return get_sync_log_class_by_format(doc.get('log_format')) expected_docs = [web_user, mobile_user, l1, l2] not_expected_docs = [other_user, other_log] self._dump_and_load(expected_docs, not_expected_docs, doc_to_doc_class=_synclog_to_class)
def test_synced_during_and_after_bug_resolution_returns_200(self): during = SimplifiedSyncLog( user_id=self.restore_user.user_id, date=datetime(2016, 7, 19, 20, 0) # during bug ) during.save() after = SimplifiedSyncLog( user_id=self.restore_user.user_id, previous_log_id=during._id, date=datetime(2016, 7, 21, 19, 0) # after resolution ) after.save() restore_config = RestoreConfig( project=self.project, restore_user=self.restore_user, params=RestoreParams( sync_log_id=after._id, version="2.0", ), cache_settings=RestoreCacheSettings() ) response = restore_config.get_response() self.assertEqual(response.status_code, 200)
def test_synced_before_and_after_bug_resolution_200(self): before = SimplifiedSyncLog( user_id=self.restore_user.user_id, date=datetime(2016, 7, 19, 18, 0) # synced before bug was introduced ) before.save() restore_config = RestoreConfig(project=self.project, restore_user=self.restore_user, params=RestoreParams( sync_log_id=before._id, version="2.0", ), cache_settings=RestoreCacheSettings()) response = restore_config.get_response() self.assertEqual(response.status_code, 200) after = SimplifiedSyncLog( user_id=self.restore_user.user_id, previous_log_id=before._id, date=datetime(2016, 7, 21, 19, 0) # after resolution ) after.save() restore_config = RestoreConfig(project=self.project, restore_user=self.restore_user, params=RestoreParams( sync_log_id=after._id, version="2.0", ), cache_settings=RestoreCacheSettings()) response = restore_config.get_response() self.assertEqual(response.status_code, 200)
def test_pillow(self): from corehq.apps.change_feed.topics import get_topic_offset from corehq.pillows.synclog import get_user_sync_history_pillow consumer = get_test_kafka_consumer(topics.SYNCLOG_SQL) # get the seq id before the change is published kafka_seq = get_topic_offset(topics.SYNCLOG_SQL) # make sure user has empty reporting-metadata before a sync ccuser = CommCareUser.get(self.ccuser._id) self.assertEqual(ccuser.reporting_metadata.last_syncs, []) # do a sync synclog = SimplifiedSyncLog(domain=self.domain.name, user_id=self.ccuser._id, date=datetime.datetime(2015, 7, 1, 0, 0), app_id='123') synclog.save() # make sure kafka change updates the user with latest sync info message = next(consumer) change_meta = change_meta_from_kafka_message(message.value) synclog = self._get_latest_synclog() self.assertEqual(change_meta.document_id, synclog._id) self.assertEqual(change_meta.domain, self.domain.name) # make sure processor updates the user correctly pillow = get_user_sync_history_pillow() pillow.process_changes(since=kafka_seq) process_reporting_metadata_staging() ccuser = CommCareUser.get(self.ccuser._id) self.assertEqual(len(ccuser.reporting_metadata.last_syncs), 1) self.assertEqual(ccuser.reporting_metadata.last_syncs[0].sync_date, synclog.date) self.assertEqual(ccuser.reporting_metadata.last_sync_for_user.sync_date, synclog.date)
def test_update(self): synclog = SimplifiedSyncLog(domain='test', user_id='user1', date=datetime(2015, 7, 1, 0, 0)) synclog.save() with self.assertNumQueries(1): # previously this was 2 queries, fetch + update synclog.save()
def test_return_412_between_bug_dates(self): log = SimplifiedSyncLog(user_id=self.restore_user.user_id, date=datetime(2016, 7, 19, 19, 20)) log.save() restore_config = RestoreConfig(project=self.project, restore_user=self.restore_user, params=RestoreParams( sync_log_id=log._id, version="2.0", ), cache_settings=RestoreCacheSettings()) response = restore_config.get_response() self.assertEqual(response.status_code, 412)
def test_sync_log_invalidation_bug(self): sync_log = SimplifiedSyncLog( user_id='6dac4940-913e-11e0-9d4b-005056aa7fb5') sync_log.save() self.addCleanup(FormProcessorTestUtils.delete_all_sync_logs) _, case = self._doCreateCaseWithMultimedia() # this used to fail before we fixed http://manage.dimagi.com/default.asp?158373 self._doSubmitUpdateWithMultimedia( new_attachments=['commcare_logo_file'], removes=[], sync_token=sync_log._id)
def test_default_mobile_ucr_sync_interval(self): """ When sync interval is set, ReportFixturesProvider should provide reports only if the interval has passed since the last sync or a new build is being requested. """ from corehq.apps.userreports.reports.data_source import ConfigurableReportDataSource with patch.object(ConfigurableReportDataSource, 'get_data') as get_data_mock: get_data_mock.return_value = self.rows with mock_datasource_config(): self.domain_obj.default_mobile_ucr_sync_interval = 4 # hours two_hours_ago = datetime.utcnow() - timedelta(hours=2) recent_sync = SimplifiedSyncLog( domain=self.domain_obj.name, date=two_hours_ago, user_id='456', build_id=self.app1.get_id, ) recent_sync.save() fixtures = call_fixture_generator(report_fixture_generator, self.user, app=self.app1, last_sync=recent_sync, project=self.domain_obj) reports = self._get_fixture(fixtures, ReportFixturesProviderV1.id) self.assertIsNone(reports) recent_sync_new_build = SimplifiedSyncLog( domain=self.domain_obj.name, date=two_hours_ago, user_id='456', build_id='123', ) recent_sync_new_build.save() fixtures = call_fixture_generator( report_fixture_generator, self.user, app=self.app1, last_sync=recent_sync_new_build, project=self.domain_obj) reports = self._get_fixture( fixtures, ReportFixturesProviderV1.id).findall('.//report') self.assertEqual(len(reports), 1) self.assertEqual(reports[0].attrib.get('id'), '123456') self.domain_obj.default_mobile_ucr_sync_interval = None
def test_copy_payload(self): sync_log = SimplifiedSyncLog(case_ids_on_phone=set(["case-1", "case-2"])) sync_log.save() payload = dummy_restore_xml(sync_log._id).strip() fd, path = tempfile.mkstemp() with os.fdopen(fd, "wb") as f: f.write(payload) with open(path, "r") as f: updated_fileref = copy_payload_and_synclog_and_get_new_file(f) updated_payload = updated_fileref.file.read() updated_id = synclog_id_from_restore_payload(updated_payload) self.assertNotEqual(sync_log._id, updated_id) self.assertTrue(_restore_id_block(updated_id) in updated_payload) self.assertFalse(sync_log._id in updated_payload) updated_log = get_properly_wrapped_sync_log(updated_id) self.assertEqual(updated_log.case_ids_on_phone, sync_log.case_ids_on_phone)
def test_copy_payload(self): sync_log = SimplifiedSyncLog(case_ids_on_phone=set(['case-1', 'case-2'])) sync_log.save() payload = dummy_restore_xml(sync_log._id).strip() fd, path = tempfile.mkstemp() with os.fdopen(fd, 'wb') as f: f.write(payload) with open(path, 'r') as f: updated_fileref = copy_payload_and_synclog_and_get_new_file(f) updated_payload = updated_fileref.file.read() updated_id = synclog_id_from_restore_payload(updated_payload) self.assertNotEqual(sync_log._id, updated_id) self.assertTrue(_restore_id_block(updated_id) in updated_payload) self.assertFalse(sync_log._id in updated_payload) updated_log = get_properly_wrapped_sync_log(updated_id) self.assertEqual(updated_log.case_ids_on_phone, sync_log.case_ids_on_phone)
def test_simple(self): synclog = SimplifiedSyncLog(domain='test', user_id='user1', date=datetime(2015, 7, 1, 0, 0)) synclog.save() self.assertEqual(self._count(), 1) synclog.delete() self.assertEqual(self._count(), 0)