Source code for pytest_dbfixtures.factories.mongo
# Copyright (C) 2013 by Clearcode <http://clearcode.cc>
# and associates (see AUTHORS).
# This file is part of pytest-dbfixtures.
# pytest-dbfixtures is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# pytest-dbfixtures is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public License
# along with pytest-dbfixtures. If not, see <http://www.gnu.org/licenses/>.
import pytest
from path import path
from tempfile import mkdtemp
from pytest_dbfixtures.executors import TCPExecutor
from pytest_dbfixtures.port import get_port
from pytest_dbfixtures.utils import get_config, try_import, get_process_fixture
[docs]def mongo_proc(executable=None, params=None, host=None, port=None,
logs_prefix=''):
"""
Mongo process factory.
:param str executable: path to mongod
:param str params: params
:param str host: hostname
:param str port: exact port (e.g. '8000')
or randomly selected port:
'?' - any random available port
'2000-3000' - random available port from a given range
'4002,4003' - random of 4002 or 4003 ports
:param str logs_prefix: prefix for log filename
:rtype: func
:returns: function which makes a mongo process
"""
@pytest.fixture(scope='session')
def mongo_proc_fixture(request):
"""
#. Get config.
#. Run a ``mongod`` process.
#. Stop ``mongod`` process after tests.
.. note::
`mongod <http://docs.mongodb.org/v2.2/reference/mongod/>`_
:param FixtureRequest request: fixture request object
:rtype: pytest_dbfixtures.executors.TCPExecutor
:returns: tcp executor
"""
config = get_config(request)
# make a temporary directory for tests and delete it
# if tests have been finished
tmpdir = path(mkdtemp(prefix='mongo_pytest_fixture'))
request.addfinalizer(lambda: tmpdir.exists() and tmpdir.rmtree())
mongo_exec = executable or config.mongo.mongo_exec
mongo_params = params or config.mongo.params
mongo_host = host or config.mongo.host
mongo_port = get_port(port or config.mongo.port)
logsdir = path(request.config.getvalue('logsdir'))
mongo_logpath = logsdir / '{prefix}mongo.{port}.log'.format(
prefix=logs_prefix,
port=mongo_port
)
mongo_executor = TCPExecutor(
'{mongo_exec} --bind_ip {host} --port {port} --dbpath {dbpath} --logpath {logpath} {params}'.format( # noqa
mongo_exec=mongo_exec,
params=mongo_params,
host=mongo_host,
port=mongo_port,
dbpath=tmpdir,
logpath=mongo_logpath,
),
host=mongo_host,
port=mongo_port,
)
mongo_executor.start()
request.addfinalizer(mongo_executor.stop)
return mongo_executor
return mongo_proc_fixture
[docs]def mongodb(process_fixture_name):
"""
Mongo database factory.
:param str process_fixture_name: name of the process fixture
:rtype: func
:returns: function which makes a connection to mongo
"""
@pytest.fixture
def mongodb_factory(request):
"""
#. Get pymongo module and config.
#. Get connection to mongo.
#. Drop collections before and after tests.
:param FixtureRequest request: fixture request object
:rtype: pymongo.connection.Connection
:returns: connection to mongo database
"""
proc_fixture = get_process_fixture(request, process_fixture_name)
pymongo, config = try_import('pymongo', request)
mongo_host = proc_fixture.host
mongo_port = proc_fixture.port
try:
client = pymongo.MongoClient
except AttributeError:
client = pymongo.Connection
mongo_conn = client(mongo_host, mongo_port)
def drop():
for db in mongo_conn.database_names():
for collection_name in mongo_conn[db].collection_names():
# Do not delete any of Mongo "system" collections
if not collection_name.startswith('system.'):
mongo_conn[db][collection_name].drop()
drop()
request.addfinalizer(drop)
return mongo_conn
return mongodb_factory
__all__ = [mongodb, mongo_proc]