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