def test_save_parent_only_separated(self, mock_role_separated): """Test where the parent document is role separated but this child is not; it's expected the parent's _USER documents be used for _parent """ mock_role_separated.return_value = False mock_engine = mock.Mock() plugin = fake_plugins.FakeSeparatedChildPlugin(es_engine=mock_engine) parent_plugin = fake_plugins.RoleSeparatedPlugin(es_engine=mock_engine) plugin.register_parent(parent_plugin) indexing_helper = helper.IndexingHelper(plugin) bulk_name = 'searchlight.elasticsearch.plugins.helper.helpers.bulk' child_docs = copy.deepcopy(fake_plugins.CHILD_DATA) with mock.patch(bulk_name) as mock_bulk: indexing_helper.save_documents(child_docs) self.assertEqual(1, len(mock_bulk.call_args_list)) actions = list(mock_bulk.call_args_list[0][1]['actions']) expected_doc = copy.deepcopy(child_docs[0]) expected_doc[ROLE_USER_FIELD] = ['user', 'admin'] expected_actions = [ {'_op_type': 'index', '_id': 'child1', '_source': expected_doc, '_parent': 'simple1_USER'}, ] self.assertEqual(expected_actions, list(actions))
def test_save_child_parent_both_separated(self): mock_engine = mock.Mock() plugin = fake_plugins.FakeSeparatedChildPlugin(es_engine=mock_engine) parent_plugin = fake_plugins.RoleSeparatedPlugin(es_engine=mock_engine) plugin.register_parent(parent_plugin) indexing_helper = helper.IndexingHelper(plugin) bulk_name = 'searchlight.elasticsearch.plugins.helper.helpers.bulk' child_docs = copy.deepcopy(fake_plugins.CHILD_DATA) # First run where both child and parent are role-separated (and thus # we'd expect two copies of both parent and child with appropriate # ids linking them) with mock.patch(bulk_name) as mock_bulk: indexing_helper.save_documents(child_docs) self.assertEqual(1, len(mock_bulk.call_args_list)) actions = list(mock_bulk.call_args_list[0][1]['actions']) expected_admin_doc = copy.deepcopy(child_docs[0]) expected_admin_doc[ROLE_USER_FIELD] = 'admin' expected_user_doc = copy.deepcopy(child_docs[0]) expected_user_doc[ROLE_USER_FIELD] = 'user' expected_actions = [ {'_op_type': 'index', '_id': 'child1_ADMIN', '_source': expected_admin_doc, '_parent': 'simple1_ADMIN'}, {'_op_type': 'index', '_id': 'child1_USER', '_source': expected_user_doc, '_parent': 'simple1_USER'} ] self.assertEqual(expected_actions, list(actions))
def test_delete_children_role_separated(self): mock_engine = mock.Mock() plugin = fake_plugins.FakeSeparatedChildPlugin(es_engine=mock_engine) parent_plugin = fake_plugins.RoleSeparatedPlugin(es_engine=mock_engine) plugin.register_parent(parent_plugin) indexing_helper = helper.IndexingHelper(plugin) scan_name = 'searchlight.elasticsearch.plugins.helper.helpers.scan' bulk_name = 'searchlight.elasticsearch.plugins.helper.helpers.bulk' mock_scan_data = [{ '_id': '1_ADMIN', 'fields': { '_parent': 'p1_ADMIN' } }, { '_id': '1_USER', 'fields': { '_parent': 'p1_USER' } }] with mock.patch(scan_name, return_value=mock_scan_data) as mock_scan: with mock.patch(bulk_name) as mock_bulk: indexing_helper.delete_documents_with_parent('p1') parent_type = plugin.parent_plugin_type() base_full_parent_type = '%s#%s' % (parent_type, 'p1') expected_scan_query = { 'fields': ['_parent', '_routing'], 'query': { 'terms': { '_parent': [ base_full_parent_type + '_ADMIN', base_full_parent_type + '_USER' ] } } } mock_scan.assert_called_with(client=plugin.engine, index=plugin.alias_name_listener, doc_type=plugin.document_type, query=expected_scan_query) expected_delete_actions = [{ '_op_type': 'delete', '_id': '1_ADMIN', '_parent': 'p1_ADMIN' }, { '_op_type': 'delete', '_id': '1_USER', '_parent': 'p1_USER' }] mock_bulk.assert_called_with(client=plugin.engine, index=plugin.alias_name_listener, doc_type=plugin.document_type, actions=expected_delete_actions)
def test_delete_unknown_parent(self): mock_engine = mock.Mock() plugin = fake_plugins.FakeSeparatedChildPlugin(es_engine=mock_engine) doc_id = 'aaaa-bbbb' parent_id = '1111-2222' # Mock the delete function because the internals are tested elsewhere # First test with parent and routing with mock.patch.object(plugin.index_helper, 'delete_document') as mock_del: mock_engine.search.return_value = { 'hits': { 'total': 1, 'hits': [{ '_id': doc_id + helper.ADMIN_ID_SUFFIX, '_routing': parent_id, '_parent': parent_id + helper.ADMIN_ID_SUFFIX }] } } plugin.index_helper.delete_document_unknown_parent(doc_id) mock_del.assert_called_with({ '_id': doc_id, '_parent': parent_id, '_routing': parent_id }) # Now no explicit routing with mock.patch.object(plugin.index_helper, 'delete_document') as mock_del: mock_engine.search.return_value = { 'hits': { 'total': 1, 'hits': [{ '_id': doc_id + helper.ADMIN_ID_SUFFIX, '_parent': parent_id + helper.ADMIN_ID_SUFFIX }] } } plugin.index_helper.delete_document_unknown_parent(doc_id) mock_del.assert_called_with({'_id': doc_id, '_parent': parent_id}) # Test no results found with mock.patch.object(plugin.index_helper, 'delete_document') as mock_del: mock_engine.search.return_value = { 'hits': { 'total': 0, 'hits': [] } } plugin.index_helper.delete_document_unknown_parent(doc_id) self.assertEqual(0, mock_del.call_count) # Also test a non-separated plugin mock_engine = mock.Mock() plugin = fake_plugins.FakeChildPlugin(es_engine=mock_engine) with mock.patch.object(plugin.index_helper, 'delete_document') as mock_del: mock_engine.search.return_value = { 'hits': { 'total': 1, 'hits': [{ '_id': doc_id, '_parent': parent_id }] } } plugin.index_helper.delete_document_unknown_parent(doc_id) mock_del.assert_called_with({'_id': doc_id, '_parent': parent_id})