diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/bootstrap/test_new_instance.py | 96 | 
1 files changed, 65 insertions, 31 deletions
diff --git a/tests/bootstrap/test_new_instance.py b/tests/bootstrap/test_new_instance.py index 00f9833..7686fde 100644 --- a/tests/bootstrap/test_new_instance.py +++ b/tests/bootstrap/test_new_instance.py @@ -2,6 +2,7 @@  script, as described in the documentation.  """ +import configparser  import contextlib  import logging  import os @@ -10,6 +11,8 @@ import subprocess  import venv  from pathlib import Path +import sqlalchemy +  LOGGER = logging.getLogger(__name__)  REPO_BASE = Path(__file__).parent.parent.parent @@ -51,36 +54,67 @@ def create_config(config_name: Path):      Path("data").mkdir() +def cleanup_database(config_name: Path): +    """Connects to the database and ensures everything is reset. + +    :param config_name: Path to the config file. +    """ +    if not config_name.exists(): +        return + +    parser = configparser.ConfigParser() +    parser["DEFAULT"]["here"] = str(config_name.parent) +    parser.read(config_name) + +    db_url = parser["app:main"]["sqlalchemy.url"] +    engine = sqlalchemy.create_engine(db_url) + +    match engine.name: +        case "sqlite": +            pass +        case "postgresql": +            with engine.connect() as connection: +                connection.execute(sqlalchemy.text("DROP SCHEMA public CASCADE;")) +                connection.execute(sqlalchemy.text("CREATE SCHEMA public;")) +                connection.commit() + +  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("Installing additional SQL engines") -        subprocess.check_call( -            [binaries_path / "pip", "install", "psycopg2"] -        ) - -        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 +        try: +            # 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("Installing additional SQL engines") +            subprocess.check_call( +                [binaries_path / "pip", "install", "psycopg2"] +            ) + +            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 +        finally: +            # Clean up the database. This is important with anything but SQLite, as +            # the tables would otherwise persist and interfere with the other tests. +            cleanup_database(Path("testing.ini")) +  | 
