URL: https://github.com/freeipa/freeipa/pull/366
Author: tiran
 Title: #366: Use pytest conftest.py 
Action: synchronized

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/366/head:pr366
git checkout pr366
From 2e56469a7cbbc1de9b3fa24b715ab235adc184d6 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Tue, 3 Jan 2017 18:04:53 +0100
Subject: [PATCH 1/3] Use pytest conftest.py

Let's replace some ugly hacks with proper pytest conftest.py hooks.
Test initialization of ipalib.api is now handled in
pytest_cmdline_main(). Pytest plugins, markers and ignores are also
moved into conftest.py. Additional guards make it possible to run tests
without ipaserver installed.
---
 ipalib/__init__.py     |  6 ----
 ipatests/conftest.py   | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++
 ipatests/ipa-run-tests |  3 --
 ipatests/pytest.ini    | 10 -------
 make-test              |  2 +-
 5 files changed, 78 insertions(+), 20 deletions(-)
 create mode 100644 ipatests/conftest.py

diff --git a/ipalib/__init__.py b/ipalib/__init__.py
index 4a61ace..9cbe528 100644
--- a/ipalib/__init__.py
+++ b/ipalib/__init__.py
@@ -950,9 +950,3 @@ def create_api(mode='dummy'):
 
 api = create_api(mode=None)
 
-if os.environ.get('IPA_UNIT_TEST_MODE', None) == 'cli_test':
-    from ipalib.cli import cli_plugins
-    api.bootstrap(context='cli', in_server=False, in_tree=True, fallback=False)
-    for klass in cli_plugins:
-        api.add_plugin(klass)
-    api.finalize()
diff --git a/ipatests/conftest.py b/ipatests/conftest.py
new file mode 100644
index 0000000..0399e2f
--- /dev/null
+++ b/ipatests/conftest.py
@@ -0,0 +1,77 @@
+#
+# Copyright (C) 2016  FreeIPA Contributors see COPYING for license
+#
+
+from __future__ import print_function
+
+from ipalib import api
+from ipalib.cli import cli_plugins
+try:
+    import ipaserver
+except ImportError:
+    ipaserver = None
+
+
+MARKERS = [
+    'tier0: basic unit tests and critical functionality',
+    'tier1: functional API tests',
+    'cs_acceptance: Acceptance test suite for Dogtag Certificate Server',
+    'ds_acceptance: Acceptance test suite for 389 Directory Server',
+]
+
+NO_RECURSE_DIRS = [
+    # build directories
+    'ipaclient/build',
+    'ipalib/build',
+    'ipaplatform/build',
+    'ipapython/build',
+    'ipaserver/build',
+    'ipatests/build',
+    # install/share/wsgi.py
+    'install/share'
+]
+
+pytest_plugins = [
+    'ipatests.pytest_plugins.additional_config',
+    'ipatests.pytest_plugins.beakerlib',
+    'ipatests.pytest_plugins.declarative',
+    'ipatests.pytest_plugins.nose_compat',
+]
+
+# The integration plugin is not available in client-only builds.
+try:
+    import ipatests.pytest_plugins.integration
+except ImportError:
+    if ipaserver is not None:
+        raise
+else:
+    pytest_plugins.append('ipatests.pytest_plugins.integration')
+
+
+def pytest_configure(config):
+    # register an additional marker
+    for marker in MARKERS:
+        config.addinivalue_line('markers', marker)
+
+    for norecursedir in NO_RECURSE_DIRS:
+        config.addinivalue_line('norecursedirs', norecursedir)
+
+
+def pytest_cmdline_main(config):
+    api.bootstrap(
+        context=u'cli',
+        in_server=False,
+        in_tree=True,
+        fallback=False)
+
+    for klass in cli_plugins:
+        api.add_plugin(klass)
+
+    try:
+        api.finalize()
+    except ImportError as e:
+        # ipaclient has no ipaserver
+        if ipaserver is not None:
+            raise
+        else:
+            print(e)
diff --git a/ipatests/ipa-run-tests b/ipatests/ipa-run-tests
index 53fa7b3..8df477d 100755
--- a/ipatests/ipa-run-tests
+++ b/ipatests/ipa-run-tests
@@ -34,9 +34,6 @@ import pytest
 
 import ipatests
 
-# This must be set so ipalib.api gets initialized property for tests:
-os.environ['IPA_UNIT_TEST_MODE'] = 'cli_test'
-
 # This is set to store --with-xunit report in an accessible place:
 os.environ['IPATEST_XUNIT_PATH'] = os.path.join(os.getcwd(), 'nosetests.xml')
 
diff --git a/ipatests/pytest.ini b/ipatests/pytest.ini
index c14eb5d..deb8688 100644
--- a/ipatests/pytest.ini
+++ b/ipatests/pytest.ini
@@ -8,16 +8,6 @@
 python_classes = test_ Test
 addopts = --doctest-modules
           --junit-prefix ipa
-          -p ipatests.pytest_plugins.nose_compat
-          -p ipatests.pytest_plugins.declarative
-          -p ipatests.pytest_plugins.integration
-          -p ipatests.pytest_plugins.beakerlib
-          -p ipatests.pytest_plugins.additional_config
             # Ignore files for doc tests.
             # TODO: ideally, these should all use __name__=='__main__' guards
           --ignore=install/share/wsgi.py
-markers =
-    tier0: basic unit tests and critical functionality
-    tier1: functional API tests
-    cs_acceptance: Acceptance test suite for Dogtag Certificate Server
-    ds_acceptance: Acceptance test suite for 389 Directory Server
diff --git a/make-test b/make-test
index 76e3dde..93323a1 100755
--- a/make-test
+++ b/make-test
@@ -1,4 +1,4 @@
 #! /bin/bash
 
 set -ex
-IPA_UNIT_TEST_MODE=cli_test PYTHONPATH=.:$PYTHONPATH py.test "$@"
+PYTHONPATH=.:$PYTHONPATH py.test "$@"

From 733004b78e31341ab919e3acf312bec12bc2e173 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Tue, 3 Jan 2017 18:08:05 +0100
Subject: [PATCH 2/3] Catch ValueError raised by pytest.config.getoption()

In latest version of pytest the function pytest.config.getoption()
raises ValueError for unknown options.
---
 ipatests/test_util.py | 6 ++++--
 ipatests/util.py      | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/ipatests/test_util.py b/ipatests/test_util.py
index 0fbd536..f4e7773 100644
--- a/ipatests/test_util.py
+++ b/ipatests/test_util.py
@@ -140,8 +140,10 @@ def test_eq(self):
 
 def test_assert_deepequal():
     f = util.assert_deepequal
-    # pylint: disable=no-member
-    pretty = pytest.config.getoption("pretty_print")
+    try:  # pylint: disable=no-member
+        pretty = pytest.config.getoption("pretty_print")
+    except (AttributeError, ValueError):
+        pretty = False
 
     # LEN and KEYS formats use special function to pretty print structures
     # depending on a pytest environment settings
diff --git a/ipatests/util.py b/ipatests/util.py
index 7b5e317..9320383 100644
--- a/ipatests/util.py
+++ b/ipatests/util.py
@@ -337,7 +337,7 @@ def assert_deepequal(expected, got, doc='', stack=tuple()):
     """
     try:
         pretty_print = pytest.config.getoption("pretty_print")  # pylint: disable=no-member
-    except AttributeError:
+    except (AttributeError, ValueError):
         pretty_print = False
 
     if pretty_print:

From 219820d852a88dee4bb9288fc29843d318e2c7cd Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Tue, 3 Jan 2017 18:34:12 +0100
Subject: [PATCH 3/3] Fix pylint violations

---
 ipalib/__init__.py   | 1 -
 ipatests/conftest.py | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/ipalib/__init__.py b/ipalib/__init__.py
index 9cbe528..5a11f86 100644
--- a/ipalib/__init__.py
+++ b/ipalib/__init__.py
@@ -949,4 +949,3 @@ def create_api(mode='dummy'):
     return api
 
 api = create_api(mode=None)
-
diff --git a/ipatests/conftest.py b/ipatests/conftest.py
index 0399e2f..d640b21 100644
--- a/ipatests/conftest.py
+++ b/ipatests/conftest.py
@@ -40,6 +40,7 @@
 
 # The integration plugin is not available in client-only builds.
 try:
+    # pylint: disable=unused-import
     import ipatests.pytest_plugins.integration
 except ImportError:
     if ipaserver is not None:
-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to