Skip to content
Snippets Groups Projects
conftest.py 2.44 KiB
import os
import re
import shutil
import pytest
import mock


def pytest_runtest_teardown(item, nextitem):
    """
    Teardown method to clean up folder creations during testing. This method is called after each test, but performs
    deletions only after an entire test class was executed.
    :param item: tested item
    :param nextitem: next item (could be None, if no following test is available)
    """
    if nextitem is None or item.cls != nextitem.cls:
        # clean up all TestExperiment and data folder that have been created during testing
        rel_path = os.path.relpath(item.fspath.dirname, os.path.abspath(__file__))
        path = os.path.dirname(__file__)
        for stage in filter(None, rel_path.replace("..", ".").split("/")):
            path = os.path.abspath(os.path.join(path, stage))
            execute_removing(path)
        execute_removing(os.path.dirname(__file__))
    else:
        pass  # nothing to do if next test is from same test class


def execute_removing(path):
    list_dir = os.listdir(path)
    if "data" in list_dir and path != os.path.dirname(__file__):  # do not delete data folder in src
        shutil.rmtree(os.path.join(path, "data"), ignore_errors=True)
    # remove TestExperiment folders
    remove_files_from_regex(list_dir, path, re.compile(r"TestExperiment.*"))
    # remove all tracking json
    remove_files_from_regex(list_dir, path, re.compile(r"tracking_\d*\.json"))
    # remove all tracking pdf
    remove_files_from_regex(list_dir, path, re.compile(r"tracking_\d*\.pdf"))
    # remove all tracking json
    remove_files_from_regex(list_dir, path, re.compile(r"logging_\d*\.log"))


def remove_files_from_regex(list_dir, path, regex):
    r = list(filter(regex.search, list_dir))
    if len(r) > 0:
        for e in r:
            del_path = os.path.join(path, e)
            try:
                if os.path.isfile(del_path):
                    os.remove(del_path)
                else:
                    shutil.rmtree(os.path.join(path, e), ignore_errors=True)
            except:
                pass


@pytest.fixture(scope="session", autouse=True)
def default_session_fixture(request):
    """
    :type request: _pytest.python.SubRequest
    :return:
    """
    # patched = mock.patch("multiprocessing.cpu_count", return_value=1)
    # patched.__enter__()

    # def unpatch():
    #    patched.__exit__()

    # request.addfinalizer(unpatch)

    with mock.patch("psutil.cpu_count", return_value=1):
        yield