diff --git a/weasyl/test/web/test_characters.py b/weasyl/test/web/test_characters.py index 1970c1ac9..d0a999cd4 100644 --- a/weasyl/test/web/test_characters.py +++ b/weasyl/test/web/test_characters.py @@ -33,14 +33,18 @@ def _character_user(db): return db_utils.create_user(username='character_test') -@pytest.fixture(name='character') -def _character(app, db, character_user): +def create_character(app, character_user, **kwargs): cookie = db_utils.create_session(character_user) - form = dict( - _BASE_FORM, - submitfile=webtest.Upload('wesley', read_asset('img/wesley1.png'), 'image/png'), - ) + for field in kwargs.keys(): + if field not in _BASE_FORM: + raise KeyError(field) + + form = { + **_BASE_FORM, + "submitfile": webtest.Upload('wesley', read_asset('img/wesley1.png'), 'image/png'), + **kwargs, + } resp = app.post('/submit/character', form, headers={'Cookie': cookie}).follow(headers={'Cookie': cookie}) charid = int(resp.html.find('input', {'name': 'charid'})['value']) @@ -48,6 +52,11 @@ def _character(app, db, character_user): return charid +@pytest.fixture(name='character') +def _character(app, db, character_user): + return create_character(app, character_user) + + @pytest.mark.usefixtures('db', 'character_user') def test_list_empty(app): resp = app.get('/characters/character_test') diff --git a/weasyl/test/web/test_journals.py b/weasyl/test/web/test_journals.py index 7345b072b..6860b6232 100644 --- a/weasyl/test/web/test_journals.py +++ b/weasyl/test/web/test_journals.py @@ -74,11 +74,17 @@ def test_list_unicode_username(app): assert titles == [u'Unícode journal 😊'] +def create_journal(app, user, *, rating): + resp = app.post("/submit/journal", {"title": "Created journal", "rating": rating, "content": "A journal"}) + assert resp.status_int == 303 + return resp + + @pytest.mark.usefixtures('db', 'journal_user') def test_create(app, journal_user): - cookie = db_utils.create_session(journal_user) + app.set_cookie(*db_utils.create_session(journal_user).split("=", 1)) - app.post('/submit/journal', {'title': u'Created journal', 'rating': '10', 'content': u'A journal'}, headers={'Cookie': cookie}) + create_journal(app, journal_user, rating="10") resp = app.get('/~journal_test') assert resp.html.find(id='user-journal').h4.string == u'Created journal' diff --git a/weasyl/test/web/test_profile.py b/weasyl/test/web/test_profile.py index 23c48dacd..1fd91e7a8 100644 --- a/weasyl/test/web/test_profile.py +++ b/weasyl/test/web/test_profile.py @@ -3,7 +3,10 @@ import arrow import pytest +from weasyl.errorcode import error_messages from weasyl.test import db_utils +from weasyl.test.web.test_characters import create_character +from weasyl.test.web.test_journals import create_journal @contextmanager @@ -87,3 +90,89 @@ def test_age_set_and_display(app): resp = app.get("/control/editprofile") form = _find_form(resp, action="/control/editprofile") assert (form["show_age"].checked, form["birthdate-month"].value, form["birthdate-year"].value) == (True, str(birthdate.month), str(birthdate.year)), "birthdate can’t be changed once set" + + +@pytest.mark.usefixtures("db", "cache") +def test_age_terms(app): + u13_birthdate = arrow.utcnow().shift(years=-13, months=1) + + user = db_utils.create_user(username="profiletest") + app.set_cookie(*db_utils.create_session(user).split("=", 1)) + + resp = app.get("/control/editprofile") + form = _find_form(resp, action="/control/editprofile") + form["show_age"].checked = True + form["birthdate-month"].value = u13_birthdate.month + form["birthdate-year"].value = u13_birthdate.year + + resp = form.submit(expect_errors=True) + assert resp.status_int == 422, "can’t display age under 13" + assert resp.html.find(id="error_content").p.text.strip() == error_messages["birthdayInconsistentWithTerms"] + + with _guest(app): + resp = app.get("/~profiletest") + assert resp.html.find(id="user-id").text.strip() == "" + + +def _edit_character(app, user): + charid = create_character(app, user, rating="10") + resp = ( + app.get(f"/character/{charid}") + .click("Edit Character Details") + ) + form = _find_form(resp, action="/edit/character") + form["rating"] = "30" + form.submit(status=303) + + +def _edit_journal(app, user): + resp = ( + create_journal(app, user, rating="10") + .follow() + .click("Edit Journal Details") + ) + form = _find_form(resp, action="/edit/journal") + form["rating"] = "30" + form.submit(status=303) + + +@pytest.mark.usefixtures("db", "cache") +@pytest.mark.parametrize(("create_post", "expect_assertion"), [ + (None, False), + (lambda app, user: create_character(app, user, rating="10"), False), + (lambda app, user: create_character(app, user, rating="30"), True), + (_edit_character, True), + (lambda app, user: create_journal(app, user, rating="10"), False), + (lambda app, user: create_journal(app, user, rating="40"), True), + (_edit_journal, True), +]) +def test_assert_adult(app, create_post, expect_assertion): + u18_birthdate = arrow.utcnow().shift(years=-18, months=1) + + forward_user = db_utils.create_user(username="forwarduser") + app.set_cookie(*db_utils.create_session(forward_user).split("=", 1)) + + if create_post is not None: + create_post(app, forward_user) + + resp = app.get("/control/editprofile") + form = _find_form(resp, action="/control/editprofile") + form["show_age"].checked = True + form["birthdate-month"].value = u18_birthdate.month + form["birthdate-year"].value = u18_birthdate.year + + if expect_assertion: + resp = form.submit(expect_errors=True) + assert resp.status_int == 422, "can’t display age under 18 after using age-restricted ratings" + assert resp.html.find(id="error_content").p.text.strip() == error_messages["birthdayInconsistentWithRating"] + + with _guest(app): + resp = app.get("/~forwarduser") + assert resp.html.find(id="user-id").text.strip() == "" + else: + resp = form.submit() + assert resp.status_int == 303, "can display age under 18 after not using age-restricted ratings" + + with _guest(app): + resp = app.get("/~forwarduser") + assert resp.html.find(id="user-id").text.strip() == "17"