From 94461add1f22c37bf7bbc2b255a1d1155744aac2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 24 Mar 2021 10:47:41 +0000
Subject: [PATCH] TST: Created  function _read_config_files

Created  function _read_config_files to read pycaosdb.ini files from different paths. Testfile changed accordingly.
---
 CHANGELOG.md                    |  2 ++
 src/caosdb/__init__.py          | 14 ++++---------
 src/caosdb/configuration.py     | 20 ++++++++++++++++++
 unittests/test_configuration.py | 36 ++++++++++++++++++++++++++++-----
 4 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6defee79..d464d725 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 * `etag` property for the `caosdb.Query` class. The etag allows to debug the
   caching and to decide whether the server has changed between queries.
+* function `_read_config_files` to read `pycaosdb.ini` files from different paths.
 
 ### Changed ###
 
@@ -19,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed ###
 
 ### Fixed ###
+* #45 - test_config_ini_via_envvar
 
 ### Security ###
 
diff --git a/src/caosdb/__init__.py b/src/caosdb/__init__.py
index b86fcd63..85792919 100644
--- a/src/caosdb/__init__.py
+++ b/src/caosdb/__init__.py
@@ -37,7 +37,7 @@ from os.path import expanduser, join
 import caosdb.apiutils
 from caosdb.common import administration
 from caosdb.common.datatype import (BOOLEAN, DATETIME, DOUBLE, FILE, INTEGER,
-                                    REFERENCE, TEXT, LIST)
+                                    LIST, REFERENCE, TEXT)
 # Import of the basic  API classes:
 from caosdb.common.models import (ACL, ALL, FIX, NONE, OBLIGATORY, RECOMMENDED,
                                   SUGGESTED, Container, DropOffBox, Entity,
@@ -45,15 +45,9 @@ from caosdb.common.models import (ACL, ALL, FIX, NONE, OBLIGATORY, RECOMMENDED,
                                   Query, QueryTemplate, Record, RecordType,
                                   delete, execute_query, get_global_acl,
                                   get_known_permissions, raise_errors)
-from caosdb.configuration import configure, get_config
+from caosdb.configuration import _read_config_files, configure, get_config
 from caosdb.connection.connection import configure_connection, get_connection
-from caosdb.version import version as __version__
 from caosdb.exceptions import *
+from caosdb.version import version as __version__
 
-# read configuration these files
-
-if "PYCAOSDBINI" in environ:
-    configure(expanduser(environ["PYCAOSDBINI"]))
-else:
-    configure(expanduser('~/.pycaosdb.ini'))
-configure(join(getcwd(), "pycaosdb.ini"))
+_read_config_files()
diff --git a/src/caosdb/configuration.py b/src/caosdb/configuration.py
index 4d079784..6e8a9c6f 100644
--- a/src/caosdb/configuration.py
+++ b/src/caosdb/configuration.py
@@ -28,6 +28,9 @@ except ImportError:
     # python3
     from configparser import ConfigParser
 
+from os import environ, getcwd
+from os.path import expanduser, join, isfile
+
 
 def _reset_config():
     global _pycaosdbconf
@@ -49,3 +52,20 @@ def configure(inifile):
 
 def get_config():
     return _pycaosdbconf
+
+
+def _read_config_files():
+    """Function to read config files from different paths. Checks for path in $PYCAOSDBINI or home directory (.pycaosdb.ini) and in the current working directory (pycaosdb.ini).
+
+    Returns:
+        [list]: list with successfully parsed ini-files. Order: env_var or home directory, cwd. Used for testing the function.
+    """
+    return_var = []
+    if "PYCAOSDBINI" in environ:
+        return_var.extend(configure(expanduser(environ["PYCAOSDBINI"])))
+    else:
+        return_var.extend(configure(expanduser('~/.pycaosdb.ini')))
+
+    if isfile(join(getcwd(), "pycaosdb.ini")):
+        return_var.extend(configure(join(getcwd(), "pycaosdb.ini")))
+    return return_var
diff --git a/unittests/test_configuration.py b/unittests/test_configuration.py
index 76445b6f..b135e7cd 100644
--- a/unittests/test_configuration.py
+++ b/unittests/test_configuration.py
@@ -22,19 +22,45 @@
 # ** end header
 #
 
+import pytest
 import caosdb as db
+from os import environ, getcwd, remove
+from os.path import expanduser, isfile, join
 from pytest import raises
 
 
-def test_config_ini_via_envvar():
-    from os import environ
-    from os.path import expanduser
+@pytest.fixture
+def temp_ini_files():
+    created_temp_ini_cwd = False
+    created_temp_ini_home = False
+    if not isfile(join(getcwd(), "pycaosdb.ini")):
+        open("pycaosdb.ini", 'a').close()  # create temporary ini file
+        created_temp_ini_cwd = True
+    if not isfile(expanduser("~/.pycaosdb.ini")):
+        open(expanduser("~/.pycaosdb.ini"), 'a').close()  # create temporary ini file in home directory
+        created_temp_ini_home = True
+    yield 0
+    if created_temp_ini_cwd:
+        remove("pycaosdb.ini")
+    if created_temp_ini_home:
+        remove(expanduser("~/.pycaosdb.ini"))
+    environ["PYCAOSDBINI"] = "~/.pycaosdb.ini"
+
+
+def test_config_ini_via_envvar(temp_ini_files):
 
     with raises(KeyError):
         environ["PYCAOSDBINI"]
 
     environ["PYCAOSDBINI"] = "bla bla"
     assert environ["PYCAOSDBINI"] == "bla bla"
-    assert db.configuration.configure(environ["PYCAOSDBINI"]) == []
+    # test wrong configuration file in envvar
+    assert not expanduser(environ["PYCAOSDBINI"]) in db.configuration._read_config_files()
+    # test good configuration file in envvar
     environ["PYCAOSDBINI"] = "~/.pycaosdb.ini"
-    assert db.configuration.configure(expanduser(environ["PYCAOSDBINI"])) == [expanduser("~/.pycaosdb.ini")]
+    assert expanduser("~/.pycaosdb.ini") in db.configuration._read_config_files()
+    # test without envvar
+    environ.pop("PYCAOSDBINI")
+    assert expanduser("~/.pycaosdb.ini") in db.configuration._read_config_files()
+    # test configuration file in cwd
+    assert join(getcwd(), "pycaosdb.ini") in db.configuration._read_config_files()
-- 
GitLab