Openmock
Mock/fake of opensearch library, allows you to mock opensearch-py
Fork of Python Elasticsearch(TM) Mock. Sometimes the developers who work with elasticsearch (TM),
don't really have any input in choice of host and need to get work done.
Installation
pip install openmock
Usage
To use Openmock, decorate your test method with @openmock decorator:
from unittest import TestCase
from openmock import openmock
class TestClass(TestCase):
@openmock
def test_should_return_something_from_opensearch(self):
self.assertIsNotNone(some_function_that_uses_opensearch())
Custom Behaviours
You can also force the behaviour of the OpenSearch instance by importing the openmock.behaviour
module:
from unittest import TestCase
from openmock import behaviour
class TestClass(TestCase):
...
def test_should_return_internal_server_error_when_simulate_server_error_is_true(self):
behaviour.server_failure.enable()
...
behaviour.server_failure.disable()
You can also disable all behaviours by calling behaviour.disable_all()
(Consider put this in your def tearDown(self)
method)
Available Behaviours
Code example
Let's say you have a prod code snippet like this one:
import opensearchpy
class FooService:
def __init__(self):
self.es = opensearchpy.OpenSearch(hosts=[{'host': 'localhost', 'port': 9200}])
def create(self, index, body):
es_object = self.es.index(index, body)
return es_object.get('_id')
def read(self, index, id):
es_object = self.es.get(index, id)
return es_object.get('_source')
Then you should be able to test this class by mocking OpenSearch using the following test class:
from unittest import TestCase
from openmock import openmock
from foo.bar import FooService
class FooServiceTest(TestCase):
@openmock
def should_create_and_read_object(self):
index = 'test-index'
expected_document = {
'foo': 'bar'
}
service = FooService()
id = service.create(index, expected_document)
self.assertIsNotNone(id)
document = service.read(index, id)
self.assertEquals(expected_document, document)
Notes:
- The mocked search method returns all available documents indexed on the index with the requested document type.
- The mocked suggest method returns the exactly suggestions dictionary passed as body serialized in OpenSearch.suggest response. Attention: If the term is an int, the suggestion will be
python term + 1
. If not, the suggestion will be formatted as python {0}_suggestion.format(term)
.
Example:
suggestion_body = {
'suggestion-string': {
'text': 'test_text',
'term': {
'field': 'string'
}
},
'suggestion-id': {
'text': 1234567,
'term': {
'field': 'id'
}
}
}
{
'suggestion-string': [
{
'text': 'test_text',
'length': 1,
'options': [
{
'text': 'test_text_suggestion',
'freq': 1,
'score': 1.0
}
],
'offset': 0
}
],
'suggestion-id': [
{
'text': 1234567,
'length': 1,
'options': [
{
'text': 1234568,
'freq': 1,
'score': 1.0
}
],
'offset': 0
}
],
}
Testing
Preferred for testing one version of python.
pytest test
Won't catch pytest tests.
python -m unittest
We are trying to support a full matrix of openmock versions and python versions 3.9+. This is slow.
tox
Changelog
See CHANGELOG.md
License
MIT with normalize_host.py
being Apache 2 from Elasticsearch.