diff options
| -rw-r--r-- | production.ini | 2 | ||||
| -rw-r--r-- | testing.ini | 7 | ||||
| -rw-r--r-- | tests/bootstrap/test_new_instance.py | 81 | ||||
| -rw-r--r-- | tests/conftest.py | 2 | 
4 files changed, 90 insertions, 2 deletions
diff --git a/production.ini b/production.ini index 987f441..1d785b5 100644 --- a/production.ini +++ b/production.ini @@ -33,7 +33,7 @@ setup = fietsboek.pshell.setup  [alembic]  # path to migration scripts -script_location = fietsboek/alembic +script_location = fietsboek:alembic  file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s  # file_template = %%(rev)s_%%(slug)s diff --git a/testing.ini b/testing.ini index 6f85219..82fddfd 100644 --- a/testing.ini +++ b/testing.ini @@ -13,6 +13,11 @@ pyramid.debug_routematch = false  pyramid.default_locale_name = en  sqlalchemy.url = sqlite:///%(here)s/testing.sqlite +# The pytest tests usually overwrite this with a temporary directory. Since +# this is cleaned on test teardown, we don't want to accidentally delete data +# that should not be deleted. Therefore, we specifically do not set a directory +# here, and leave a placeholder to be replaced properly by the tests. +# %% fietsboek.data_dir %%  redis.url = redis://localhost  fietsboek.default_tile_layers = @@ -37,7 +42,7 @@ setup = fietsboek.pshell.setup  [alembic]  # path to migration scripts -script_location = fietsboek/alembic +script_location = fietsboek:alembic  file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s  # file_template = %%(rev)s_%%(slug)s diff --git a/tests/bootstrap/test_new_instance.py b/tests/bootstrap/test_new_instance.py new file mode 100644 index 0000000..dc3076e --- /dev/null +++ b/tests/bootstrap/test_new_instance.py @@ -0,0 +1,81 @@ +"""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 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 +        # 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") +        create_config(Path("testing.ini")) + +        # 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 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):  | 
