Exemple #1
0
    def test_case_search_reindex_by_domain(self):
        """
        Tests reindexing for a particular domain only
        """
        other_domain = "yunkai"
        CaseSearchConfig.objects.get_or_create(pk=other_domain, enabled=True)

        desired_case = self._make_case(domain=other_domain)
        undesired_case = self._make_case(domain=self.domain)  # noqa

        with self.assertRaises(CaseSearchNotEnabledException):
            get_case_search_reindexer(domain=self.domain).reindex()

        get_case_search_reindexer(domain=other_domain).reindex()
        self._assert_case_in_es(other_domain, desired_case)
    def test_case_search_reindex_by_domain(self):
        """
        Tests reindexing for a particular domain only
        """
        other_domain = "yunkai"
        CaseSearchConfig.objects.get_or_create(pk=other_domain, enabled=True)

        desired_case = self._make_case(domain=other_domain)
        undesired_case = self._make_case(domain=self.domain)  # noqa

        with self.assertRaises(CaseSearchNotEnabledException):
            get_case_search_reindexer(domain=self.domain).reindex()

        get_case_search_reindexer(domain=other_domain).reindex()
        self._assert_case_in_es(other_domain, desired_case)
 def setUp(self):
     self.domain = create_domain(DOMAIN)
     self.user = CommCareUser.create(DOMAIN, USERNAME, PASSWORD)
     initialize_index_and_mapping(get_es_new(), CASE_SEARCH_INDEX_INFO)
     CaseSearchConfig.objects.get_or_create(pk=DOMAIN, enabled=True)
     delete_all_cases()
     self.case_id = uuid4().hex
     _, [self.case] = post_case_blocks([CaseBlock(
         create=True,
         case_id=self.case_id,
         case_type=CASE_TYPE,
         case_name=CASE_NAME,
         external_id=CASE_NAME,
         user_id=OWNER_ID,
         owner_id=OWNER_ID,
         update={'opened_by': OWNER_ID},
     ).as_xml()], {'domain': DOMAIN})
     get_case_search_reindexer(DOMAIN).reindex()
     es = get_es_new()
     es.indices.refresh(CASE_SEARCH_INDEX)
 def setUp(self):
     self.domain = create_domain(DOMAIN)
     self.user = CommCareUser.create(DOMAIN, USERNAME, PASSWORD)
     initialize_index_and_mapping(get_es_new(), CASE_SEARCH_INDEX_INFO)
     CaseSearchConfig.objects.get_or_create(pk=DOMAIN, enabled=True)
     delete_all_cases()
     self.case_id = uuid4().hex
     _, [self.case] = post_case_blocks([
         CaseBlock(
             create=True,
             case_id=self.case_id,
             case_type=CASE_TYPE,
             case_name=CASE_NAME,
             external_id=CASE_NAME,
             user_id=OWNER_ID,
             owner_id=OWNER_ID,
             update={
                 'opened_by': OWNER_ID
             },
         ).as_xml()
     ], {'domain': DOMAIN})
     get_case_search_reindexer(DOMAIN).reindex()
     es = get_es_new()
     es.indices.refresh(CASE_SEARCH_INDEX)
Exemple #5
0
class CaseSearchPillowTest(TestCase):

    domain = 'meereen'

    def setUp(self):
        super(CaseSearchPillowTest, self).setUp()
        FormProcessorTestUtils.delete_all_cases()
        self.elasticsearch = get_es_new()
        self.pillow = get_case_search_to_elasticsearch_pillow()
        ensure_index_deleted(CASE_SEARCH_INDEX)

        # Bootstrap ES
        initialize_index_and_mapping(get_es_new(), CASE_SEARCH_INDEX_INFO)

    def tearDown(self):
        ensure_index_deleted(CASE_SEARCH_INDEX)
        CaseSearchConfig.objects.all().delete()
        super(CaseSearchPillowTest, self).tearDown()

    def test_case_search_pillow(self):
        consumer = get_test_kafka_consumer(topics.CASE)
        kafka_seq = self._get_kafka_seq()

        case = self._make_case(case_properties={'foo': 'bar'})
        producer.send_change(topics.CASE,
                             doc_to_change(case.to_json()).metadata)
        # confirm change made it to kafka
        message = consumer.next()
        change_meta = change_meta_from_kafka_message(message.value)
        self.assertEqual(case.case_id, change_meta.document_id)
        self.assertEqual(self.domain, change_meta.domain)

        # enable case search for domain
        with patch(
                'corehq.pillows.case_search.case_search_enabled_for_domain',
                new=MagicMock(
                    return_value=True)) as fake_case_search_enabled_for_domain:
            # send to elasticsearch
            self.pillow.process_changes(since=kafka_seq, forever=False)
            fake_case_search_enabled_for_domain.assert_called_with(self.domain)

        self._assert_case_in_es(self.domain, case)

    def test_case_search_reindex_by_domain(self):
        """
        Tests reindexing for a particular domain only
        """
        other_domain = "yunkai"
        CaseSearchConfig.objects.get_or_create(pk=other_domain, enabled=True)
        case_search_enabled_for_domain.clear(self.domain)
        case_search_enabled_for_domain.clear(other_domain)

        desired_case = self._make_case(domain=other_domain)
        undesired_case = self._make_case(domain=self.domain)  # noqa

        with self.assertRaises(CaseSearchNotEnabledException):
            get_case_search_reindexer(domain=self.domain).reindex()

        get_case_search_reindexer(domain=other_domain).reindex()
        self._assert_case_in_es(other_domain, desired_case)

    def test_delete_case_search_cases(self):
        """
        Tests that cases are correctly removed from the es index
        """
        other_domain = "braavos"
        self._bootstrap_cases_in_es_for_domain(self.domain)
        case = self._bootstrap_cases_in_es_for_domain(other_domain)

        with self.assertRaises(TypeError):
            delete_case_search_cases(None)
        with self.assertRaises(TypeError):
            delete_case_search_cases({})

        # delete cases from one domain
        delete_case_search_cases(self.domain)

        # make sure the other domain's cases are still there
        self._assert_case_in_es(other_domain, case)

        # delete other domains cases
        delete_case_search_cases(other_domain)

        # make sure nothing is left
        self._assert_index_empty()

    @override_settings(TESTS_SHOULD_USE_SQL_BACKEND=True)
    def test_sql_case_search_pillow(self):
        consumer = get_test_kafka_consumer(topics.CASE_SQL)
        # have to get the seq id before the change is processed
        kafka_seq = self._get_kafka_seq()
        case = self._make_case(case_properties={'something': 'something_else'})

        # confirm change made it to kafka
        message = consumer.next()
        change_meta = change_meta_from_kafka_message(message.value)
        self.assertEqual(case.case_id, change_meta.document_id)
        self.assertEqual(self.domain, change_meta.domain)

        # enable case search for domain
        with patch(
                'corehq.pillows.case_search.case_search_enabled_for_domain',
                new=MagicMock(
                    return_value=True)) as fake_case_search_enabled_for_domain:
            # send to elasticsearch
            self.pillow.process_changes(since=kafka_seq, forever=False)
            fake_case_search_enabled_for_domain.assert_called_with(self.domain)

        self._assert_case_in_es(self.domain, case)

    def _get_kafka_seq(self):
        # KafkaChangeFeed listens for multiple topics (case, case-sql) in the case search pillow,
        # so we need to provide a dict of seqs to kafka
        return get_multi_topic_offset([topics.CASE, topics.CASE_SQL])

    def _make_case(self, domain=None, case_properties=None):
        # make a case
        case_id = uuid.uuid4().hex
        case_name = 'case-name-{}'.format(uuid.uuid4().hex)
        if domain is None:
            domain = self.domain
        case = create_and_save_a_case(domain, case_id, case_name,
                                      case_properties)
        return case

    def _assert_case_in_es(self, domain, case):
        # confirm change made it to elasticserach
        self.elasticsearch.indices.refresh(CASE_SEARCH_INDEX)
        results = CaseSearchES().run()
        self.assertEqual(1, results.total)
        case_doc = results.hits[0]

        self.assertEqual(domain, case_doc['domain'])
        self.assertEqual(case.case_id, case_doc['_id'])
        self.assertEqual(case.name, case_doc['name'])
        # Confirm change contains case_properties
        self.assertItemsEqual(case_doc['case_properties'][0].keys(),
                              ['key', 'value'])
        for case_property in case_doc['case_properties']:
            key = case_property['key']
            self.assertEqual(case.get_case_property(key),
                             case_property['value'])

    def _assert_index_empty(self):
        self.elasticsearch.indices.refresh(CASE_SEARCH_INDEX)
        results = CaseSearchES().run()
        self.assertEqual(0, results.total)

    def _bootstrap_cases_in_es_for_domain(self, domain):
        case = self._make_case(domain)
        CaseSearchConfig.objects.get_or_create(pk=domain, enabled=True)
        case_search_enabled_for_domain.clear(domain)
        get_case_search_reindexer(domain).reindex()
        return case
Exemple #6
0
 def _bootstrap_cases_in_es_for_domain(self, domain):
     case = self._make_case(domain)
     CaseSearchConfig.objects.get_or_create(pk=domain, enabled=True)
     get_case_search_reindexer(domain).reindex()
     return case
Exemple #7
0
def reindex_case_search_for_domain(domain):
    get_case_search_reindexer(domain).reindex()