import gzip from pathlib import Path import pytest from sqlalchemy import select, func from webtest import Upload from fietsboek import models @pytest.fixture() def logged_in(dbsession, testapp, route_path): user = models.User(email='foo@bar.com', is_verified=True) user.set_password("foobar") dbsession.add(user) login = testapp.get(route_path('login')) form = login.form form['email'] = 'foo@bar.com' form['password'] = 'foobar' response = form.submit() assert response.status_code == 302 def load_gpx_asset(filename): asset_dir = Path(__file__).parent.parent / 'assets' test_file = asset_dir / filename with gzip.open(test_file, 'rb') as fobj: return fobj.read() def test_upload_forbidden(testapp, route_path): upload_form = testapp.get(route_path('upload'), status="4*") def test_upload(testapp, dbsession, route_path, logged_in): # Step 1: Go to the upload form upload_site = testapp.get(route_path('upload')) # Step 2: Fill it out upload_form = upload_site.form upload_form['gpx'] = Upload('super_track.gpx', load_gpx_asset('Teasi_1.gpx.gz')) result = upload_form.submit().maybe_follow() # Step 3: We are now on the "Finish upload" page assert "

Upload

" in result.text finish_form = result.forms[0] finish_form["title"].value = "FoOoOo Bar's Testtrack" finish_form["description"].value = "Super descriptive text!" # The tagged-friend[] has a disabled attribute, which webtest does not # respect. Therefore, we need to manually remove it: finish_form.field_order = [ (name, field) for (name, field) in finish_form.field_order if name != "tagged-friend[]" ] result = finish_form.submit().maybe_follow() assert "

FoOoOo Bar's Testtrack

" in result.text # Step 4: Ensure the track is stored right track = dbsession.execute(select(models.Track)).scalar_one() assert track.title == "FoOoOo Bar's Testtrack" assert track.description == "Super descriptive text!" def test_upload_cancel(testapp, dbsession, route_path, logged_in): # Step 1: Go to the upload form upload_site = testapp.get(route_path('upload')) # Step 2: Fill it out upload_form = upload_site.form upload_form['gpx'] = Upload('super_track.gpx', load_gpx_asset('Teasi_1.gpx.gz')) result = upload_form.submit().maybe_follow() # Step 3: We are now on the "Finish upload" page assert "

Upload

" in result.text cancel_form = result.forms['cancelForm'] result = cancel_form.submit().maybe_follow() assert "Upload cancelled" in result.text # Step 4: Ensure the track is deleted again uploads = dbsession.execute(select(func.count()).select_from(models.Upload)).scalar() assert uploads == 0