def _rebuild_couch_case_and_re_diff(self, couch_case, sql_case_json):
        from corehq.form_processor.backends.couch.processor import FormProcessorCouch
        from corehq.apps.tzmigration.timezonemigration import json_diff

        rebuilt_case = FormProcessorCouch.hard_rebuild_case(
            self.domain, couch_case['_id'], None, save=False, lock=False
        )
        rebuilt_case_json = rebuilt_case.to_json()
        diffs = json_diff(rebuilt_case_json, sql_case_json, track_list_indices=False)
        diffs = filter_case_diffs(
            rebuilt_case_json, sql_case_json, diffs, self.forms_that_touch_cases_without_actions
        )
        return rebuilt_case_json, diffs
Example #2
0
    def _rebuild_couch_case_and_re_diff(self, couch_case, sql_case_json):
        from corehq.form_processor.backends.couch.processor import FormProcessorCouch
        from corehq.apps.tzmigration.timezonemigration import json_diff

        rebuilt_case = FormProcessorCouch.hard_rebuild_case(
            self.domain, couch_case['_id'], None, save=False, lock=False
        )
        rebuilt_case_json = rebuilt_case.to_json()
        diffs = json_diff(rebuilt_case_json, sql_case_json, track_list_indices=False)
        diffs = filter_case_diffs(
            rebuilt_case_json, sql_case_json, diffs, self.forms_that_touch_cases_without_actions
        )
        return rebuilt_case_json, diffs
Example #3
0
def rebuild_couch_case_and_re_diff(couch_case, sql_case_json, statedb):
    assert couch_case["domain"] == sql_case_json["domain"], \
        (couch_case["domain"], sql_case_json["domain"])
    rebuilt_case = FormProcessorCouch.hard_rebuild_case(couch_case["domain"],
                                                        couch_case['_id'],
                                                        None,
                                                        save=False,
                                                        lock=False)
    rebuilt_case_json = rebuilt_case.to_json()
    diffs = json_diff(rebuilt_case_json,
                      sql_case_json,
                      track_list_indices=False)
    diffs = filter_case_diffs(rebuilt_case_json, sql_case_json, diffs, statedb)
    return rebuilt_case_json, diffs
Example #4
0
 def xml_to_form(domain, xml_meta, case_id, all_metas):
     form_id = xml_meta.parent_id
     with xml_meta.open() as fh:
         xml = fh.read()
     form_data = convert_xform_to_json(xml)
     form = FormProcessorCouch.new_xform(form_data)
     form.domain = domain
     form.received_on = get_received_on(case_id, form_id)
     for meta in all_metas:
         form.external_blobs[meta.name] = BlobMetaRef(
             key=meta.key,
             blobmeta_id=meta.id,
             content_type=meta.content_type,
             content_length=meta.content_length,
         )
     return form
def test_get_case_with_lock(self, lock, wrap):
    case, case_lock = FormProcessorCouch.get_case_with_lock(self.case_id, lock, wrap)

    try:
        if lock:
            self.assertIsNotNone(case_lock)
        else:
            self.assertIsNone(case_lock)

        if wrap:
            self.assertEqual(len(case.actions), 2)
        else:
            self.assertEqual('actions' in case, True)

        self.assertIsInstance(case, CommCareCase if wrap else dict)
    finally:
        release_lock(case_lock, True)
Example #6
0
def diff_case(sql_case, couch_case, dd_count):
    def diff(couch_json, sql_json):
        diffs = json_diff(couch_json, sql_json, track_list_indices=False)
        return filter_case_diffs(couch_json, sql_json, diffs, _diff_state)
    case_id = couch_case['_id']
    sql_json = sql_case.to_json()
    dd_count("commcare.couchsqlmigration.case.diffed")
    diffs = check_domains(case_id, couch_case, sql_json)
    if diffs:
        dd_count("commcare.couchsqlmigration.case.has_diff")
        return couch_case, diffs
    diffs = diff(couch_case, sql_json)
    if diffs:
        domain = couch_case["domain"]
        try:
            with convert_rebuild_error():
                couch_case = FormProcessorCouch.hard_rebuild_case(
                    domain, case_id, None, save=False, lock=False
                ).to_json()
            dd_count("commcare.couchsqlmigration.case.rebuild.couch")
            diffs = diff(couch_case, sql_json)
            if diffs:
                if should_sort_sql_transactions(sql_case, couch_case):
                    with convert_rebuild_error():
                        sql_case = rebuild_case_with_couch_action_order(sql_case)
                    dd_count("commcare.couchsqlmigration.case.rebuild.sql.sort")
                    diffs = diff(couch_case, sql_case.to_json())
                elif not was_rebuilt(sql_case):
                    with convert_rebuild_error():
                        sql_case = rebuild_case(sql_case)
                    dd_count("commcare.couchsqlmigration.case.rebuild.sql")
                    diffs = diff(couch_case, sql_case.to_json())
        except RebuildError as err:
            dd_count("commcare.couchsqlmigration.case.rebuild.error")
            log.warning(f"Case {case_id} rebuild -> {err}")
    if diffs:
        dd_count("commcare.couchsqlmigration.case.has_diff")
    return couch_case, diffs
Example #7
0
def hard_rebuild(couch_case):
    return FormProcessorCouch.hard_rebuild_case(couch_case["domain"],
                                                couch_case['_id'],
                                                None,
                                                save=False,
                                                lock=False).to_json()
        cls.case = post_case_blocks([case.as_xml()], domain=cls.domain)[1][0]

    @classmethod
    def tearDownClass(cls):
        cls.case.delete()
        super(TestFormProcessorCouch, cls).tearDownClass()


@generate_cases([
    (True, True),
    (True, False),
    (False, True),
    (False, False),
], TestFormProcessorCouch)
def test_get_case_with_lock(self, lock, wrap):
    case, case_lock = FormProcessorCouch.get_case_with_lock(
        self.case_id, lock, wrap)

    try:
        if lock:
            self.assertIsNotNone(case_lock)
        else:
            self.assertIsNone(case_lock)

        if wrap:
            self.assertEqual(len(case.actions), 2)
        else:
            self.assertEqual('actions' in case, True)

        self.assertIsInstance(case, CommCareCase if wrap else dict)
    finally:
        release_lock(case_lock, True)
Example #9
0
        cls.case.delete()
        super(TestFormProcessorCouch, cls).tearDownClass()


@generate_cases([
    (True, True, True),
    (True, True, False),
    (True, False, True),
    (True, False, False),
    (False, True, True),
    (False, True, False),
    (False, False, True),
    (False, False, False),
], TestFormProcessorCouch)
def test_get_case_with_lock(self, lock, strip_history, wrap):
    case, case_lock = FormProcessorCouch.get_case_with_lock(
        self.case_id, lock, strip_history, wrap)

    try:
        if lock and not strip_history:
            self.assertIsNotNone(case_lock)
        else:
            self.assertIsNone(case_lock)

        if wrap:
            self.assertEqual(len(case.actions), 0 if strip_history else 2)
        else:
            self.assertEqual('actions' in case,
                             False if strip_history else True)

        self.assertIsInstance(case, CommCareCase if wrap else dict)
    finally: