app/tests/api/test_auth.py

273 lines
6.8 KiB
Python
Raw Normal View History

import pytest
import unicodedata
2020-01-20 21:36:39 +08:00
from flask import url_for
from app import config
from app.db import Session
from app.models import User, AccountActivation
from tests.utils import random_email
2020-01-20 21:36:39 +08:00
PASSWORD_1 = "Aurélie"
2021-06-03 00:48:35 +08:00
PASSWORD_2 = unicodedata.normalize("NFKD", PASSWORD_1)
assert PASSWORD_1 != PASSWORD_2
2020-01-20 21:36:39 +08:00
def setup_module():
config.SKIP_MX_LOOKUP_ON_CHECK = True
def teardown_module():
config.SKIP_MX_LOOKUP_ON_CHECK = False
@pytest.mark.parametrize("mfa", (True, False), ids=("MFA", "no MFA"))
def test_auth_login_success(flask_client, mfa: bool):
email = random_email()
2020-01-20 21:36:39 +08:00
User.create(
email=email,
password=PASSWORD_1,
2020-01-20 21:36:39 +08:00
name="Test User",
activated=True,
enable_otp=mfa,
2020-01-20 21:36:39 +08:00
)
Session.commit()
2020-01-20 21:36:39 +08:00
r = flask_client.post(
2022-02-23 05:12:36 +08:00
"/api/auth/login",
2020-04-28 05:15:30 +08:00
json={
"email": email,
"password": PASSWORD_2,
2020-04-28 05:15:30 +08:00
"device": "Test Device",
},
2020-01-20 21:36:39 +08:00
)
assert r.status_code == 200
assert r.json["name"] == "Test User"
assert r.json["email"]
if mfa:
assert r.json["api_key"] is None
assert r.json["mfa_enabled"]
assert r.json["mfa_key"]
else:
assert r.json["api_key"]
assert not r.json["mfa_enabled"]
assert r.json["mfa_key"] is None
2020-02-05 19:05:26 +08:00
def test_auth_login_device_exist(flask_client):
email = random_email()
User.create(email=email, password="password", name="Test User", activated=True)
Session.commit()
2020-02-05 19:05:26 +08:00
r = flask_client.post(
url_for("api.auth_login"),
2020-04-28 05:15:30 +08:00
json={
"email": email,
2020-04-28 05:15:30 +08:00
"password": "password",
"device": "Test Device",
},
2020-02-05 19:05:26 +08:00
)
assert r.status_code == 200
api_key = r.json["api_key"]
2020-12-07 00:54:54 +08:00
assert not r.json["mfa_enabled"]
2020-02-05 19:05:26 +08:00
assert r.json["mfa_key"] is None
assert r.json["name"] == "Test User"
# same device, should return same api_key
r = flask_client.post(
url_for("api.auth_login"),
2020-04-28 05:15:30 +08:00
json={
"email": email,
2020-04-28 05:15:30 +08:00
"password": "password",
"device": "Test Device",
},
2020-02-05 19:05:26 +08:00
)
assert r.json["api_key"] == api_key
def test_auth_register_success(flask_client):
email = random_email()
2021-08-06 01:44:56 +08:00
assert AccountActivation.first() is None
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_register"),
json={"email": email, "password": "password"},
)
assert r.status_code == 200
assert r.json["msg"]
# make sure an activation code is created
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code
assert len(act_code.code) == 6
assert act_code.tries == 3
def test_auth_register_too_short_password(flask_client):
email = random_email()
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_register"),
json={"email": email, "password": "short"},
)
assert r.status_code == 400
assert r.json["error"] == "password too short"
def test_auth_register_too_long_password(flask_client):
email = random_email()
r = flask_client.post(
url_for("api.auth_register"),
json={"email": email, "password": "0123456789" * 11},
)
assert r.status_code == 400
assert r.json["error"] == "password too long"
def test_auth_activate_success(flask_client):
email = random_email()
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_register"),
json={"email": email, "password": "password"},
)
assert r.status_code == 200
assert r.json["msg"]
# get the activation code
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code
assert len(act_code.code) == 6
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_activate"),
json={"email": email, "code": act_code.code},
)
assert r.status_code == 200
def test_auth_activate_wrong_email(flask_client):
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_activate"), json={"email": "abcd@gmail.com", "code": "123456"}
)
assert r.status_code == 400
def test_auth_activate_user_already_activated(flask_client):
email = random_email()
User.create(email=email, password="password", name="Test User", activated=True)
Session.commit()
r = flask_client.post(
url_for("api.auth_activate"), json={"email": email, "code": "123456"}
)
assert r.status_code == 400
def test_auth_activate_wrong_code(flask_client):
email = random_email()
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_register"),
json={"email": email, "password": "password"},
)
assert r.status_code == 200
assert r.json["msg"]
# get the activation code
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code
assert len(act_code.code) == 6
assert act_code.tries == 3
# make sure to create a wrong code
wrong_code = act_code.code + "123"
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_activate"),
json={"email": email, "code": wrong_code},
)
assert r.status_code == 400
# make sure the nb tries decrements
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code.tries == 2
def test_auth_activate_too_many_wrong_code(flask_client):
email = random_email()
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_register"),
json={"email": email, "password": "password"},
)
assert r.status_code == 200
assert r.json["msg"]
# get the activation code
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code
assert len(act_code.code) == 6
assert act_code.tries == 3
# make sure to create a wrong code
wrong_code = act_code.code + "123"
for _ in range(2):
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_activate"),
json={"email": email, "code": wrong_code},
)
assert r.status_code == 400
# the activation code is deleted
r = flask_client.post(
2020-04-28 05:15:30 +08:00
url_for("api.auth_activate"),
json={"email": email, "code": wrong_code},
)
assert r.status_code == 410
# make sure the nb tries decrements
2021-08-06 01:44:56 +08:00
assert AccountActivation.first() is None
def test_auth_reactivate_success(flask_client):
email = random_email()
User.create(email=email, password="password", name="Test User")
Session.commit()
r = flask_client.post(url_for("api.auth_reactivate"), json={"email": email})
assert r.status_code == 200
# make sure an activation code is created
2021-08-06 01:44:56 +08:00
act_code = AccountActivation.first()
assert act_code
assert len(act_code.code) == 6
assert act_code.tries == 3
2020-03-19 01:43:04 +08:00
def test_auth_login_forgot_password(flask_client):
email = random_email()
User.create(email=email, password="password", name="Test User", activated=True)
Session.commit()
2020-03-19 01:43:04 +08:00
2020-04-28 05:15:30 +08:00
r = flask_client.post(
2020-08-27 16:20:48 +08:00
url_for("api.forgot_password"),
json={"email": email},
2020-04-28 05:15:30 +08:00
)
2020-03-19 01:43:04 +08:00
assert r.status_code == 200
2020-03-19 04:55:50 +08:00
# No such email, still return 200
2020-03-19 01:43:04 +08:00
r = flask_client.post(
2020-08-27 16:20:48 +08:00
url_for("api.forgot_password"),
json={"email": random_email()},
2020-03-19 01:43:04 +08:00
)
2020-03-19 04:55:50 +08:00
assert r.status_code == 200