Skip to main content

Python Elasticsearch Mock for test purposes

Project description

ElasticMock

Python Elasticsearch Mock for test purposes

Build Status Coverage Status PyPI version GitHub license PyPI - Python Version ElasticSearch Version

Libraries.io dependency status for latest release Downloads

Installation

pip install ElasticMock

Usage

To use ElasticMock, decorate your test method with @elasticmock decorator:

from unittest import TestCase

from elasticmock import elasticmock


class TestClass(TestCase):

    @elasticmock
    def test_should_return_something_from_elasticsearch(self):
        self.assertIsNotNone(some_function_that_uses_elasticsearch())

Custom Behaviours

You can also force the behaviour of the ElasticSearch instance by importing the elasticmock.behaviour module:

from unittest import TestCase

from elasticmock 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

  • server_failure: Will make all calls to ElasticSearch returns the following error message:
    {
        'status_code': 500,
        'error': 'Internal Server Error'
    }
    

Code example

Let's say you have a prod code snippet like this one:

import elasticsearch

class FooService:

    def __init__(self):
        self.es = elasticsearch.Elasticsearch(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')

Than you should be able to test this class by mocking ElasticSearch using the following test class:

from unittest import TestCase
from elasticmock import elasticmock
from foo.bar import FooService

class FooServiceTest(TestCase):

    @elasticmock
    def should_create_and_read_object(self):
        # Variables used to test
        index = 'test-index'
        expected_document = {
            'foo': 'bar'
        }

        # Instantiate service
        service = FooService()

        # Index document on ElasticSearch
        id = service.create(index, expected_document)
        self.assertIsNotNone(id)

        # Retrive dpcument from ElasticSearch
        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 Elasticsearch.suggest response. Atention: 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_body = {
         'suggestion-string': {
             'text': 'test_text',
             'term': {
                 'field': 'string'
             }
         },
         'suggestion-id': {
             'text': 1234567,
             'term': {
                 'field': 'id'
             }
         }
     }
    
    • Suggestion Response:
    {
        '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

python setup.py test

Changelog

1.8.3:

  • Optimize sort implementation: fix descending order bug for string fields in multi-field sorting, use comparison-based sorting for correct mixed asc/desc handling

1.8.2:

  • Add match_phrase query support

1.8.1:

  • Add must not to query type
  • Add sort support

1.8.0:

1.7.0:

1.6.2:

1.6.1:

  • Fix Twine README.md

1.6.0:

1.5.1:

1.5.0:

1.4.0

1.3.7

1.3.6

1.3.5

1.3.4

1.3.3

1.3.2

1.3.1

  • elasticmock: Allow the same arguments to the mock that elasticsearch.Elasticsearch allows (Thanks @mattbreeden)

1.3.0:

1.2.0:

  • FakeElasticSearch: Mocked suggest method

1.1.1:

  • elasticmock: Changing the cleanup older FakeElasticSearch's instances order
  • FakeElasticSearch.index: Changing the method signature to correctly overrides the Elasticsearch.index method

1.1.0:

  • FakeElasticSearch: Mocked delete method

1.0.1:

  • setup.py: Fixed GitHub link

1.0.0:

  • elasticmock: Created @elasticmock decorator
  • FakeElasticSearch: Mocked exists, get, get_source, index, info, search and ping method

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

elasticmocknew-1.8.3.tar.gz (23.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

elasticmocknew-1.8.3-py3-none-any.whl (32.0 kB view details)

Uploaded Python 3

File details

Details for the file elasticmocknew-1.8.3.tar.gz.

File metadata

  • Download URL: elasticmocknew-1.8.3.tar.gz
  • Upload date:
  • Size: 23.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for elasticmocknew-1.8.3.tar.gz
Algorithm Hash digest
SHA256 7719fd5a629a74ae2147aefe8bd28a2f2e7492a70d383a702cfcd09afe3ff70b
MD5 1b7b4187075ac0f479d36c12fcc14698
BLAKE2b-256 2120f150e26152792d6ceecad5fa83cb36fe71a4bf6eedcb0aa8f86586a2ca4a

See more details on using hashes here.

File details

Details for the file elasticmocknew-1.8.3-py3-none-any.whl.

File metadata

  • Download URL: elasticmocknew-1.8.3-py3-none-any.whl
  • Upload date:
  • Size: 32.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.3

File hashes

Hashes for elasticmocknew-1.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a105cc43704b66091afe7d9496b94de0fd4003261113d8a3beef941aeead706e
MD5 f3a585f60df69f1de677f8557db7743e
BLAKE2b-256 a5623b74e6b8c2f3a488ed4282fbd8eb6d79b272efe02aee54ef1af2220b75be

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page