aboutsummaryrefslogtreecommitdiff
path: root/tests/bootstrap/test_new_instance.py
blob: dc3076e7890d312984ec20e9ae5517b1e022c4cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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