Metadata-Version: 2.1
Name: pytest-redis
Version: 2.3.0
Summary: Redis fixtures and fixture factories for Pytest.
Home-page: https://github.com/ClearcodeHQ/pytest-redis
Maintainer: Grzegorz Śliwiński
Maintainer-email: fizyk+pypi@fizyk.net.pl
License: LGPLv3+
Keywords: tests,py.test,pytest,fixture,redis
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Software Development :: Testing
Classifier: Framework :: Pytest
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
Provides-Extra: tests
License-File: COPYING
License-File: COPYING.lesser
License-File: AUTHORS.rst

.. image:: https://raw.githubusercontent.com/ClearcodeHQ/pytest-redis/master/logo.png
    :width: 100px
    :height: 100px

pytest-redis
============

.. image:: https://img.shields.io/pypi/v/pytest-redis.svg
    :target: https://pypi.python.org/pypi/pytest-redis/
    :alt: Latest PyPI version

.. image:: https://img.shields.io/pypi/wheel/pytest-redis.svg
    :target: https://pypi.python.org/pypi/pytest-redis/
    :alt: Wheel Status

.. image:: https://img.shields.io/pypi/pyversions/pytest-redis.svg
    :target: https://pypi.python.org/pypi/pytest-redis/
    :alt: Supported Python Versions

.. image:: https://img.shields.io/pypi/l/pytest-redis.svg
    :target: https://pypi.python.org/pypi/pytest-redis/
    :alt: License

What is this?
=============

This is a pytest plugin, that enables you to test your code that relies on a running Redis database.
It allows you to specify additional fixtures for Redis process and client.

How to use
==========

Plugin contains three fixtures

* **redisdb** - This is a redis client fixture. It constructs a redis client and cleans redis database after the test.
    It relies on redis_proc fixture, and as such the redis process is started at the very beginning of the first test
    using this fixture, and stopped after the last test finishes.
* **redis_proc** - session scoped fixture, that starts Redis instance at it's first use and stops at the end of the tests.
* **redis_nooproc** - a nooprocess fixture, that's connecting to already running redis

Simply include one of these fixtures into your tests fixture list.

.. code-block:: python

    #
    def test_redis(redisdb):
        """Check that it's actually working on redis database."""
        redisdb.set('test1', 'test')
        redisdb.set('test2', 'test')

        my_functionality = MyRedisBasedComponent()
        my_functionality.do_something()
        assert my_functionality.did_something

        assert redisdb.get("did_it") == 1

For the example above works like following:

1. pytest runs tests
2. redis_proc starts redis database server
3. redisdb creates client connection to the server
4. test itself runs and finishes
5. redisdb cleans up the redis
6. redis_proc stops server (if that was the last test using it)
7. pytest ends running tests

You can also create additional redis client and process fixtures if you'd need to:


.. code-block:: python

    from pytest_redis import factories

    redis_my_proc = factories.redis_proc(port=None)
    redis_my = factories.redisdb('redis_my_proc')

    def test_my_redis(redis_my):
        """Check that it's actually working on redis database."""
        redis_my.set('test1', 'test')
        redis_my.set('test2', 'test')

        my_functionality = MyRedisBasedComponent()
        my_functionality.do_something()
        assert my_functionality.did_something

        assert redis_my.get("did_it") == 1

.. note::

    Each Redis process fixture can be configured in a different way than the others through the fixture factory arguments.


Connecting to already existing redis database
---------------------------------------------

Some projects are using already running redis servers (ie on docker instances).
In order to connect to them, one would be using the ``redis_nooproc`` fixture.

.. code-block:: python

    redis_external = factories.redisdb('redis_nooproc')

    def test_redis(redis_external):
        """Check that it's actually working on redis database."""
        redis_external.set('test1', 'test')
        redis_external.set('test2', 'test')

        my_functionality = MyRedisBasedComponent()
        my_functionality.do_something()
        assert my_functionality.did_something

        assert redis_external.get("did_it") == 1


By default the  ``redis_nooproc`` fixture would connect to Redis instance using **6379** port. Standard configuration options apply to it.

These are the configuration options that are working on all levels with the ``redis_nooproc`` fixture:

Configuration
=============

You can define your settings in three ways, it's fixture factory argument, command line option and pytest.ini configuration option.
You can pick which you prefer, but remember that these settings are handled in the following order:

    * ``Fixture factory argument``
    * ``Command line option``
    * ``Configuration option in your pytest.ini file``

.. list-table:: Configuration options
   :header-rows: 1

   * - Redis server option
     - Fixture factory argument
     - Command line option
     - pytest.ini option
     - Noop process fixture
     - Default
   * - executable
     - executable
     - --redis-exec
     - redis_exec
     - -
     - /usr/bin/redis-server
   * - host
     - host
     - --redis-host
     - redis_host
     - host
     - 127.0.0.1
   * - port
     - port
     - --redis-port
     - redis_port
     - port
     - random
   * - connection timeout
     - timeout
     - --redis-timeout
     - redis_timeout
     - -
     - 30
   * - number of databases
     - db_count
     - --redis-db-count
     - redis_db_count
     - -
     - 8
   * - Whether to enable logging to the system logger
     - syslog
     - --redis-syslog
     - redis_syslog
     - -
     - False
   * - Redis log verbosity level
     - loglevel
     - --redis-loglevel
     - redis_loglevel
     - -
     - notice
   * - Compress dump files
     - compress
     - --redis-compress
     - redis_compress
     - -
     - True
   * - Add checksum to RDB files
     - checksum
     - --redis-rdbcompress
     - redis_rdbchecksum
     - -
     - False
   * - Save configuration
     - save
     - --redis-save
     - redis_save
     - -
     - ""
   * - Redis test instance data directory path
     - datadir
     - --redis-datadir
     - redis_datadir
     - -
     - ""

Example usage:

* pass it as an argument in your own fixture

    .. code-block:: python

        redis_proc = factories.redis_proc(port=8888)

* use ``--redis-port`` command line option when you run your tests

    .. code-block::

        py.test tests --redis-port=8888


* specify your port as ``redis_port`` in your ``pytest.ini`` file.

    To do so, put a line like the following under the ``[pytest]`` section of your ``pytest.ini``:

    .. code-block:: ini

        [pytest]
        redis_port = 8888

Options below are for configuring redis client fixture.

+---------------------+--------------------------+---------------------+-------------------+---------+
| Redis client option | Fixture factory argument | Command line option | pytest.ini option | Default |
+=====================+==========================+=====================+===================+=========+
| decode_response     | decode                   | --redis-decode      | redis_decode      | False   |
+---------------------+--------------------------+---------------------+-------------------+---------+

Package resources
-----------------

* Bug tracker: https://github.com/ClearcodeHQ/pytest-redis/issues

CHANGELOG
=========


2.3.0
----------

Feature
+++++++

- Added datadir configuration that allows to modify the placement of a redis_proc generated files in the specific place.
  This helps overcome the issue with long tmp paths on macosx separately from the temporary path itself.

2.2.0
----------

Feature
+++++++

- Configure redis to listen on specific hostname exclusively using `--bind` parameter.

Misc
++++

- rely on `get_port` functionality delivered by `port_for`


2.1.1
----------

Misc
++++

- Rise more informative error when the unixsocket is too long. Now the error
  will hint at solution how to overcome it. This might be issue especially on
  MacOS, where the default temp folder is already a long path

2.1.0
----------

Features
++++++++

- Rely on tmpdir_factory for handling tmpdirs. Now it's cleanup should
  be handled better without much of the leftovers dangling indefinitely
  in the tmp directory.
- Store pidfile in fixture's temporary directory
- Support only python 3.7 and up

Backward incompatibilities
++++++++++++++++++++++++++

- Dropped `--redis-logsdir` command line option, `redis_logsdir` ini file
  configuration option and `logsdir` fixture factory configuration option.
  Logs will be automatically placed in fixture's temporary directory.
- Dropped `logs_prefix` argument from fixture factory argument

2.0.0
-------

- [feature] ability to properly connect to already existing postgresql server using ``redis_nooproc`` fixture.
- [enhancement] dropped support for python 2.7

1.3.2
-------

- [bugfix] - close file descriptor when reading redis version (by brunsgaard)

1.3.1
-------

- [bugfix] do not run redis explicitly with shell=True

1.3.0
-------

- [enhancement] RedisExecutor now provides attribute with path to unixsocket
- [enhancement] redis client fixture now connects to redis through unixsocket by default
- [enhancement] Version check got moved to executor, to be run just before starting Redis Server
- [feature] ability to configure decode_responses for redis client in command line, pytest.ini or factory argument.
- [bugfix] set decode_responses to False, same as StrictRedis default
- [enhancement] ability to change decode_responses value

1.2.1
-------

- [bugfix] raise specific error in case the redis executable path has been misconfigured or does not exists

1.2.0
-------

- [feature] ability to configure syslog-enabled for redis in command line, pytest.ini or factory argument.
- [feature] ability to configure rdbchecksum for redis in command line, pytest.ini or factory argument.
- [feature] ability to configure rdbcompression for redis in command line, pytest.ini or factory argument.
- [ehnacement] - RedisExecutor handling parameters and their translation to redis values if needed.
- [feature] ability to configure save option for redis in command line, pytest.ini or factory argument.

1.1.1
-------
- [cleanup] removed path.py dependency

1.1.0
-------

- [feature] - migrate usage of getfuncargvalue to getfixturevalue. require at least pytest 3.0.0

1.0.0
-------

- [enhancements] removed the possibility to pass the custom config. No need to include one in package now.
- [enhancements] command line, pytest.ini and fixture factory options for setting custom number of databases in redis
- [enhancements] command line, pytest.ini and fixture factory options for redis log verbosity
- [enhancements] command line, pytest.ini and fixture factory options for modifying connection timeout
- [enhancements] command line and pytest.ini options for modifying executable
- [enhancements] command line and pytest.ini options for modifying host
- [enhancements] command line and pytest.ini options for modifying port
- [enhancements] command line and pytest.ini options for modifying logs directory destination


