From 83e08799d6b55bc2119aff4f9749bad103b5f574 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Tue, 16 Apr 2024 22:48:23 +0200 Subject: add test for fietsupdate bootstrapping --- tests/bootstrap/test_new_instance.py | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 tests/bootstrap/test_new_instance.py (limited to 'tests') diff --git a/tests/bootstrap/test_new_instance.py b/tests/bootstrap/test_new_instance.py new file mode 100644 index 0000000..e136579 --- /dev/null +++ b/tests/bootstrap/test_new_instance.py @@ -0,0 +1,70 @@ +"""Test to ensure that bootstrapping a new instance works with the fietsupdate +script, as described in the documentation. +""" + +import contextlib +import logging +import os +import shutil +import subprocess +import venv +from pathlib import Path + +LOGGER = logging.getLogger(__name__) +REPO_BASE = Path(__file__).parent.parent.parent + + +@contextlib.contextmanager +def chdir(path: Path): + """Change path as context manager. + + Changes back to the previous path on ``__exit__``. + """ + cwd = Path.cwd() + os.chdir(path) + try: + yield + finally: + os.chdir(cwd) + + +def install_fietsboek(venv_path: Path) -> Path: + """Creates a virtual env in the given path and installs fietsboek. + + :param venv_path: Path in which the virtual environment should be created. + :return: The path to the ``bin`` directory in which all scripts reside. + """ + venv.create(venv_path, with_pip=True) + subprocess.check_call([venv_path / "bin" / "pip", "install", str(REPO_BASE)]) + return venv_path / "bin" + + +def test_setup_via_fietsupdate(tmpdir): + with chdir(tmpdir): + # We create a new temporary virtual environment with a fresh install, just + # to be sure there's as little interference as possible. + LOGGER.info("Installing Fietsboek into clean env") + binaries_path = install_fietsboek(tmpdir / "venv") + + LOGGER.info("Creating a test configuration") + shutil.copy(REPO_BASE / "testing.ini", "testing.ini") + Path("data").mkdir() + + # Try to run the migrations + subprocess.check_call( + [binaries_path / "fietsupdate", "update", "-c", "testing.ini", "-f"] + ) + + # Also try to add an administrator + subprocess.check_call([ + binaries_path / "fietsctl", + "user", + "add", + "-c", "testing.ini", + "--email", "foobar@example.com", + "--name", "Foo Bar", + "--password", "raboof", + "--admin", + ]) + + assert True -- cgit v1.2.3 From 7f526efeed7b807a3b56f465637bee5dc8a27e3d Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 18 Apr 2024 22:28:55 +0200 Subject: have data_dir as a placeholder in testing.ini --- tests/bootstrap/test_new_instance.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/bootstrap/test_new_instance.py b/tests/bootstrap/test_new_instance.py index e136579..dc3076e 100644 --- a/tests/bootstrap/test_new_instance.py +++ b/tests/bootstrap/test_new_instance.py @@ -39,6 +39,18 @@ def install_fietsboek(venv_path: Path) -> Path: return venv_path / "bin" +def create_config(config_name: Path): + """Copies the testing.ini config and fills in the placeholders. + + :param config_name: Path to the resulting config. + """ + shutil.copy(REPO_BASE / "testing.ini", config_name) + config = config_name.read_text() + config = config.replace("# %% fietsboek.data_dir %%", "fietsboek.data_dir = %(here)s/data") + config_name.write_text(config) + Path("data").mkdir() + + def test_setup_via_fietsupdate(tmpdir): with chdir(tmpdir): # We create a new temporary virtual environment with a fresh install, just @@ -47,8 +59,7 @@ def test_setup_via_fietsupdate(tmpdir): binaries_path = install_fietsboek(tmpdir / "venv") LOGGER.info("Creating a test configuration") - shutil.copy(REPO_BASE / "testing.ini", "testing.ini") - Path("data").mkdir() + create_config(Path("testing.ini")) # Try to run the migrations subprocess.check_call( -- cgit v1.2.3 From c0b49a618d96f2088234dbb4c0ca8006475d432e Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Thu, 18 Apr 2024 22:30:46 +0200 Subject: also remove user data on test teardown --- tests/conftest.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 94f795a..cd74b0b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -75,6 +75,8 @@ def _cleanup_data(app_settings): data_dir = Path(app_settings["fietsboek.data_dir"]) if (data_dir / "tracks").is_dir(): shutil.rmtree(data_dir / "tracks") + if (data_dir / "users").is_dir(): + shutil.rmtree(data_dir / "users") @pytest.fixture(scope='module') def app(app_settings, dbengine, tmp_path_factory): -- cgit v1.2.3