open-law/tests/test_users.py

154 lines
4.1 KiB
Python

from flask import current_app as app
from flask.testing import FlaskClient, FlaskCliRunner
from click.testing import Result
from werkzeug.datastructures import FileStorage
from app import models as m, db
from tests.utils import login
def test_list(populate: FlaskClient):
login(populate)
DEFAULT_PAGE_SIZE = app.config["DEFAULT_PAGE_SIZE"]
response = populate.get("/user/")
assert response
assert response.status_code == 200
html = response.data.decode()
users = m.User.query.order_by(m.User.id).limit(11).all()
assert len(users) == 11
for user in users[:DEFAULT_PAGE_SIZE]:
assert user.username in html
assert users[10].username not in html
populate.application.config["PAGE_LINKS_NUMBER"] = 6
response = populate.get("/user/?page=6")
assert response
assert response.status_code == 200
html = response.data.decode()
assert "/user/?page=6" in html
assert "/user/?page=3" in html
assert "/user/?page=8" in html
assert "/user/?page=10" not in html
assert "/user/?page=2" not in html
def test_create_admin(runner: FlaskCliRunner):
res: Result = runner.invoke(args=["create-admin"])
assert "admin created" in res.output
assert m.User.query.filter_by(username=app.config["ADMIN_USERNAME"]).first()
def test_delete_user(populate: FlaskClient):
login(populate)
users = m.User.query.all()
uc = len(users)
response = populate.delete("/user/delete/1")
assert m.User.query.count() < uc
assert response.status_code == 200
def test_search_user(populate: FlaskClient, runner: FlaskCliRunner):
_, current_user = login(populate)
MAX_SEARCH_RESULTS = populate.application.config["MAX_SEARCH_RESULTS"]
response = populate.get("/user/search")
assert response.status_code == 422
assert response.json["message"] == "q parameter is required"
q = current_user.username
response = populate.get(f"/user/search?q={q}")
assert response.json
users = response.json.get("users")
assert users
assert len(users) <= MAX_SEARCH_RESULTS
for user in users:
assert q in user["username"]
assert user["username"] != current_user
q = "user"
response = populate.get(f"/user/search?q={q}")
assert response.json
users = response.json.get("users")
assert users
assert len(users) <= MAX_SEARCH_RESULTS
for user in users:
assert q in user["username"]
q = "user1"
response = populate.get(f"/user/search?q={q}")
assert response.json
users = response.json.get("users")
assert users
assert len(users) <= MAX_SEARCH_RESULTS
user = users[0]
assert user["username"] == q
q = "booboo"
response = populate.get(f"/user/search?q={q}")
assert response.json
users = response.json.get("users")
assert not users
# add dummmy data
runner.invoke(args=["db-populate"])
response = populate.get("/user/search?q=dummy&book_id=1")
assert response.json
book_1 = db.session.get(m.Book, 1)
contributors_ids = [contributor.user_id for contributor in book_1.contributors]
users = response.json.get("users")
assert users
for user in users:
user_id = user.get("id")
assert user_id not in contributors_ids
def test_profile(client):
user: m.User = m.User(
wallet_id="nsagqklfhqwef84r23hr34r35jfn", password="password"
).save()
assert user
# assert default values
assert user.username
assert not user.is_activated
assert not user.avatar_img
avatar_img = FileStorage(
stream=open("tests/testing_data/1.jpg", "rb"),
filename="1.jpg",
content_type="img/jpg",
)
login(client, username=user.username, password="password")
res = client.post(
"/user/profile",
data={
"name": "Some other name",
"avatar_img": avatar_img,
},
follow_redirects=True,
)
assert res.status_code == 200
assert user.username == "Some other name"
assert user.is_activated
assert user.avatar_img
res2 = client.post(
"/user/profile",
follow_redirects=True,
)
assert b"This field is required." in res2.data