forked from Github-Mirrors/canaille

This will help providing the very same user experience for users with and without javascript. We will still be able to re-enable javascript modals in the future, but this should be done from the ground up, HTML first and javascript after.
188 lines
6.5 KiB
Python
188 lines
6.5 KiB
Python
from canaille.app import models
|
|
|
|
|
|
def test_user_creation_edition_and_deletion(
|
|
testclient, logged_moderator, foo_group, bar_group
|
|
):
|
|
# The user does not exist.
|
|
res = testclient.get("/users", status=200)
|
|
assert models.User.get_from_login("george") is None
|
|
res.mustcontain(no="george")
|
|
|
|
# Fill the profile for a new user.
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "george"
|
|
res.form["given_name"] = "George"
|
|
res.form["family_name"] = "Abitbol"
|
|
res.form["emails-0"] = "george@abitbol.com"
|
|
res.form["phone_numbers-0"] = "555-666-888"
|
|
res.form["groups"] = [foo_group.id]
|
|
res.form["password1"] = "totoyolo"
|
|
res.form["password2"] = "totoyolo"
|
|
|
|
# User have been created
|
|
res = res.form.submit(name="action", value="edit", status=302)
|
|
assert ("success", "User account creation succeed.") in res.flashes
|
|
res = res.follow(status=200)
|
|
george = models.User.get_from_login("george")
|
|
foo_group.reload()
|
|
assert "George" == george.given_name[0]
|
|
assert george.groups == [foo_group]
|
|
assert george.check_password("totoyolo")[0]
|
|
|
|
res = testclient.get("/users", status=200)
|
|
res.mustcontain("george")
|
|
|
|
res = testclient.get("/profile/george/settings", status=200)
|
|
assert "readonly" not in res.form["groups"].attrs
|
|
|
|
# User have been edited
|
|
res = testclient.get("/profile/george", status=200)
|
|
res.form["given_name"] = "Georgio"
|
|
res = res.form.submit(name="action", value="edit").follow()
|
|
|
|
res = testclient.get("/profile/george/settings", status=200)
|
|
res.form["groups"] = [foo_group.id, bar_group.id]
|
|
res = res.form.submit(name="action", value="edit").follow()
|
|
|
|
george = models.User.get_from_login("george")
|
|
assert "Georgio" == george.given_name[0]
|
|
assert george.check_password("totoyolo")[0]
|
|
|
|
foo_group.reload()
|
|
bar_group.reload()
|
|
assert george in set(foo_group.members)
|
|
assert george in set(bar_group.members)
|
|
assert set(george.groups) == {foo_group, bar_group}
|
|
res = testclient.get("/users", status=200)
|
|
res.mustcontain("george")
|
|
|
|
# User have been deleted.
|
|
res = testclient.get("/profile/george/settings", status=200)
|
|
res = res.form.submit(name="action", value="confirm-delete", status=200)
|
|
res = res.form.submit(name="action", value="delete", status=302)
|
|
res = res.follow(status=200)
|
|
assert models.User.get_from_login("george") is None
|
|
res.mustcontain(no="george")
|
|
|
|
|
|
def test_profile_creation_dynamic_validation(testclient, logged_admin, user):
|
|
res = testclient.get("/profile")
|
|
res = testclient.post(
|
|
"/profile",
|
|
{
|
|
"csrf_token": res.form["csrf_token"].value,
|
|
"emails-0": "john@doe.com",
|
|
},
|
|
headers={
|
|
"HX-Request": "true",
|
|
"HX-Trigger-Name": "emails-0",
|
|
},
|
|
)
|
|
res.mustcontain("The email 'john@doe.com' is already used")
|
|
|
|
|
|
def test_user_creation_without_password(testclient, logged_moderator):
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "george"
|
|
res.form["family_name"] = "Abitbol"
|
|
res.form["emails-0"] = "george@abitbol.com"
|
|
|
|
res = res.form.submit(name="action", value="edit", status=302)
|
|
assert ("success", "User account creation succeed.") in res.flashes
|
|
res = res.follow(status=200)
|
|
george = models.User.get_from_login("george")
|
|
assert george.user_name[0] == "george"
|
|
assert not george.has_password()
|
|
|
|
george.delete()
|
|
|
|
|
|
def test_user_creation_form_validation_failed(
|
|
testclient, logged_moderator, foo_group, bar_group
|
|
):
|
|
res = testclient.get("/users", status=200)
|
|
assert models.User.get_from_login("george") is None
|
|
res.mustcontain(no="george")
|
|
|
|
res = testclient.get("/profile", status=200)
|
|
res = res.form.submit(name="action", value="edit")
|
|
assert ("error", "User account creation failed.") in res.flashes
|
|
assert models.User.get_from_login("george") is None
|
|
|
|
|
|
def test_username_already_taken(
|
|
testclient, logged_moderator, user, foo_group, bar_group
|
|
):
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "user"
|
|
res.form["family_name"] = "foo"
|
|
res.form["emails-0"] = "any@thing.com"
|
|
res = res.form.submit(name="action", value="edit")
|
|
assert ("error", "User account creation failed.") in res.flashes
|
|
res.mustcontain("The login 'user' already exists")
|
|
|
|
|
|
def test_email_already_taken(testclient, logged_moderator, user, foo_group, bar_group):
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "user2"
|
|
res.form["family_name"] = "foo"
|
|
res.form["emails-0"] = "john@doe.com"
|
|
res = res.form.submit(name="action", value="edit")
|
|
assert ("error", "User account creation failed.") in res.flashes
|
|
res.mustcontain("The email 'john@doe.com' is already used")
|
|
|
|
|
|
def test_cn_setting_with_given_name_and_surname(testclient, logged_moderator):
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "george"
|
|
res.form["given_name"] = "George"
|
|
res.form["family_name"] = "Abitbol"
|
|
res.form["emails-0"] = "george@abitbol.com"
|
|
|
|
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
|
|
|
|
george = models.User.get_from_login("george")
|
|
assert george.formatted_name[0] == "George Abitbol"
|
|
george.delete()
|
|
|
|
|
|
def test_cn_setting_with_surname_only(testclient, logged_moderator):
|
|
res = testclient.get("/profile", status=200)
|
|
res.form["user_name"] = "george"
|
|
res.form["family_name"] = "Abitbol"
|
|
res.form["emails-0"] = "george@abitbol.com"
|
|
|
|
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
|
|
|
|
george = models.User.get_from_login("george")
|
|
assert george.formatted_name[0] == "Abitbol"
|
|
george.delete()
|
|
|
|
|
|
def test_formcontrol(testclient, logged_admin):
|
|
res = testclient.get("/profile")
|
|
assert "emails-1" not in res.form.fields
|
|
|
|
res = res.form.submit(status=200, name="fieldlist_add", value="emails-0")
|
|
assert "emails-1" in res.form.fields
|
|
|
|
|
|
def test_formcontrol_htmx(testclient, logged_admin):
|
|
res = testclient.get("/profile")
|
|
data = {
|
|
field: res.form[field].value
|
|
for field in res.form.fields
|
|
if len(res.form.fields.get(field)) == 1
|
|
}
|
|
data["fieldlist_add"] = "emails-0"
|
|
response = testclient.post(
|
|
"/profile",
|
|
data,
|
|
headers={
|
|
"HX-Request": "true",
|
|
"HX-Trigger-Name": "listfield_add",
|
|
},
|
|
)
|
|
assert "emails-0" in response.text
|
|
assert "emails-1" in response.text
|