diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2025-06-12 20:28:37 +0200 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2025-06-12 20:28:37 +0200 | 
| commit | abba548d84fa66bd7ac81683d3a70611cd6a8a3b (patch) | |
| tree | 9343994c998cc84970a92510626b3a62e3fa46d9 /tests | |
| parent | cf25779d218a4ace062f3c0549c0f2901a0c2d6a (diff) | |
| parent | a52781d2e039ccf9f984e06a4ff3aa5e02caff8b (diff) | |
| download | fietsboek-abba548d84fa66bd7ac81683d3a70611cd6a8a3b.tar.gz fietsboek-abba548d84fa66bd7ac81683d3a70611cd6a8a3b.tar.bz2 fietsboek-abba548d84fa66bd7ac81683d3a70611cd6a8a3b.zip  | |
Merge branch 'postgres-support'
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/bootstrap/test_new_instance.py | 90 | ||||
| -rw-r--r-- | tests/conftest.py | 1 | ||||
| -rw-r--r-- | tests/integration/test_browse.py | 16 | ||||
| -rw-r--r-- | tests/playwright/conftest.py | 6 | 
4 files changed, 81 insertions, 32 deletions
diff --git a/tests/bootstrap/test_new_instance.py b/tests/bootstrap/test_new_instance.py index dc3076e..05076f4 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,31 +54,66 @@ 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("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")) diff --git a/tests/conftest.py b/tests/conftest.py index cd74b0b..652d443 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,6 +52,7 @@ def dbengine(app_settings, ini_file):      yield engine +    engine.dispose()      Base.metadata.drop_all(bind=engine)      alembic.command.stamp(alembic_cfg, None, purge=True) diff --git a/tests/integration/test_browse.py b/tests/integration/test_browse.py index 875821d..46ec329 100644 --- a/tests/integration/test_browse.py +++ b/tests/integration/test_browse.py @@ -22,6 +22,7 @@ def added_tracks(tm, dbsession, owner, data_manager):      tm.abort()      tracks = [] +    track_ids = []      with tm:          track = models.Track(              owner=owner, @@ -37,6 +38,7 @@ def added_tracks(tm, dbsession, owner, data_manager):          dbsession.flush()          data_manager.initialize(track.id).compress_gpx(load_gpx_asset("MyTourbook_1.gpx.gz"))          tracks.append(track) +        track_ids.append(track.id)          track = models.Track(              owner=owner, @@ -52,12 +54,13 @@ def added_tracks(tm, dbsession, owner, data_manager):          dbsession.flush()          data_manager.initialize(track.id).compress_gpx(load_gpx_asset("Teasi_1.gpx.gz"))          tracks.append(track) +        track_ids.append(track.id)      tm.begin()      tm.doom()      try: -        yield tracks +        yield track_ids      finally:          tm.abort()          with tm: @@ -80,13 +83,16 @@ def test_browse(testapp, dbsession, route_path, logged_in, tm, data_manager):  def test_archive(testapp, dbsession, route_path, logged_in, tm, data_manager):      # pylint: disable=too-many-positional-arguments -    with added_tracks(tm, dbsession, logged_in, data_manager): +    with added_tracks(tm, dbsession, logged_in, data_manager) as tracks:          archive = testapp.get( -            route_path('track-archive', _query=[("track_id[]", "1"), ("track_id[]", "2")]) +            route_path( +                'track-archive', +                _query=[("track_id[]", tracks[0]), ("track_id[]", tracks[1])], +            )          )          result = io.BytesIO(archive.body)          with zipfile.ZipFile(result, 'r') as zipped:              assert len(zipped.namelist()) == 2 -            assert "track_1.gpx" in zipped.namelist() -            assert "track_2.gpx" in zipped.namelist() +            assert f"track_{tracks[0]}.gpx" in zipped.namelist() +            assert f"track_{tracks[1]}.gpx" in zipped.namelist() diff --git a/tests/playwright/conftest.py b/tests/playwright/conftest.py index e914b01..adf5ef3 100644 --- a/tests/playwright/conftest.py +++ b/tests/playwright/conftest.py @@ -57,7 +57,11 @@ def dbaccess(app):      through and the running WSGI app cannot read them.      """      session_factory = app.registry["dbsession_factory"] -    return session_factory() +    factory = session_factory() + +    yield factory + +    factory.close()  class Helper:  | 
