def test_use_default_num_retries(self): exception = self._get_delete_error(1, 0) failing_delete = test_utils.FailingFunction( search.Index.delete, exception, gae_search_services.DEFAULT_NUM_RETRIES ) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) assert_raises_ctx = self.assertRaises( gae_search_services.SearchFailureError) with delete_ctx, delete_docs_ctx, assert_raises_ctx as context_mgr: gae_search_services.delete_documents_from_index( ['doc'], 'my_index') self.assertEqual(context_mgr.exception.original_exception, exception) self.assertEqual( delete_docs_counter.times_called, gae_search_services.DEFAULT_NUM_RETRIES)
def test_delete_error_with_transient_result(self): error = self._get_delete_error(3, transient=1) failing_delete = test_utils.FailingFunction( search.Index.delete, error, 4) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) index = search.Index('my_index') for i in xrange(3): index.put(search.Document(doc_id='d' + str(i), fields=[ search.TextField(name='prop', value='value') ])) delete_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) with delete_ctx, delete_docs_ctx: gae_search_services.delete_documents_from_index( ['d0', 'd1', 'd2'], 'my_index', retries=5) self.assertEqual(delete_docs_counter.times_called, 5) for i in xrange(3): result = search.Index('my_index').get('doc' + str(i)) self.assertIsNone(result)
def test_delete_single_document(self): doc = search.Document(doc_id='doc_id', fields=[ search.TextField(name='k', value='v')]) index = search.Index('my_index') index.put([doc]) gae_search_services.delete_documents_from_index(['doc_id'], 'my_index') self.assertIsNone(index.get('doc_id'))
def test_delete_multiple_documents(self): index = search.Index('my_index') for i in xrange(10): field = search.TextField(name='k', value='v%d' % i) doc = search.Document(doc_id='doc%d' % i, fields=[field]) index.put([doc]) gae_search_services.delete_documents_from_index( ['doc' + str(i) for i in xrange(10)], 'my_index') for i in xrange(10): self.assertIsNone(index.get('doc%d' % i))
def test_use_custom_number_of_retries(self): exception = self._get_delete_error(1, 0) failing_delete = test_utils.FailingFunction( search.Index.delete, exception, 42) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) assert_raises_ctx = self.assertRaises( gae_search_services.SearchFailureError) with delete_ctx, delete_docs_ctx, assert_raises_ctx: gae_search_services.delete_documents_from_index( ['id'], 'index', 42) self.assertEqual(delete_docs_counter.times_called, 42)
def test_put_error_without_transient_result(self): error = self._get_delete_error(3) delete_spy = test_utils.FailingFunction(search.Index.delete, error, 1) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) delete_ctx = self.swap(search.Index, 'delete', delete_spy) assert_raises_ctx = self.assertRaises( gae_search_services.SearchFailureError) with delete_docs_ctx, delete_ctx, assert_raises_ctx as e: gae_search_services.delete_documents_from_index( ['a', 'b', 'c'], 'my_index') # assert that the method only gets called once, since the error is not # transient self.assertEqual(delete_docs_counter.times_called, 1) self.assertEqual(e.exception.original_exception, error)
def test_put_error_without_transient_result(self): error = self._get_delete_error(3) delete_spy = test_utils.FailingFunction(search.Index.delete, error, 1) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) delete_ctx = self.swap(search.Index, 'delete', delete_spy) assert_raises_ctx = self.assertRaisesRegexp( gae_search_services.SearchFailureError, '<class \'google.appengine.api.search.search.DeleteError\'>: lol') with delete_docs_ctx, delete_ctx, assert_raises_ctx as e: gae_search_services.delete_documents_from_index( ['a', 'b', 'c'], 'my_index') # Assert that the method only gets called once, since the error is not # transient. self.assertEqual(delete_docs_counter.times_called, 1) self.assertEqual(e.exception.original_exception, error)
def test_use_default_num_retries(self): exception = self._get_delete_error(1, transient=0) failing_delete = test_utils.FailingFunction(search.Index.delete, exception, 1) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap(gae_search_services, 'delete_documents_from_index', delete_docs_counter) assert_raises_ctx = self.assertRaisesRegexp( gae_search_services.SearchFailureError, '<class \'google.appengine.api.search.search.DeleteError\'>: lol') with delete_ctx, delete_docs_ctx, assert_raises_ctx as context_mgr: gae_search_services.delete_documents_from_index(['doc'], 'my_index') self.assertEqual(context_mgr.exception.original_exception, exception) self.assertEqual(delete_docs_counter.times_called, 1)
def test_use_default_num_retries(self): exception = self._get_delete_error(1, 0) failing_delete = test_utils.FailingFunction( search.Index.delete, exception, gae_search_services.DEFAULT_NUM_RETRIES) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) delete_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap(gae_search_services, 'delete_documents_from_index', delete_docs_counter) assert_raises_ctx = self.assertRaises( gae_search_services.SearchFailureError) with delete_ctx, delete_docs_ctx, assert_raises_ctx as context_mgr: gae_search_services.delete_documents_from_index(['doc'], 'my_index') self.assertEqual(context_mgr.exception.original_exception, exception) self.assertEqual(delete_docs_counter.times_called, gae_search_services.DEFAULT_NUM_RETRIES)
def test_arguments_are_preserved_in_retries(self): index = search.Index('index') index.put([search.Document(doc_id='doc', fields=[ search.TextField(name='prop', value='val') ])]) exception = self._get_delete_error(1, 0) failing_delete = test_utils.FailingFunction( search.Index.delete, exception, 3) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) index_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) with index_ctx, delete_docs_ctx: gae_search_services.delete_documents_from_index( ['doc'], 'index', 4) self.assertEqual(delete_docs_counter.times_called, 4) result = search.Index('my_index').get('doc') self.assertIsNone(result)
def test_arguments_are_preserved_in_retries(self): index = search.Index('index') index.put([search.Document(doc_id='doc', fields=[ search.TextField(name='prop', value='val') ])]) exception = self._get_delete_error(1, 0) failing_delete = test_utils.FailingFunction( search.Index.delete, exception, 3) delete_docs_counter = test_utils.CallCounter( gae_search_services.delete_documents_from_index) index_ctx = self.swap(search.Index, 'delete', failing_delete) delete_docs_ctx = self.swap( gae_search_services, 'delete_documents_from_index', delete_docs_counter) with index_ctx, delete_docs_ctx: gae_search_services.delete_documents_from_index( ['doc'], 'index', 4) self.assertEqual(delete_docs_counter.times_called, 4) result = search.Index('my_index').get('doc') self.assertIsNone(result)
def test_index_must_be_string(self): with self.assertRaises(ValueError): gae_search_services.delete_documents_from_index( ['doc_id'], search.Index('ind'))
def test_doc_ids_must_be_strings(self): with self.assertRaisesRegexp(ValueError, str(dict)): gae_search_services.delete_documents_from_index( ['d1', { 'id': 'd2' }], 'index')
def test_index_must_be_string(self): with self.assertRaises(ValueError): gae_search_services.delete_documents_from_index( ['doc_id'], search.Index('ind'))
def test_doc_ids_must_be_strings(self): with self.assertRaisesRegexp(ValueError, str(dict)): gae_search_services.delete_documents_from_index( ['d1', {'id': 'd2'}], 'index')