Spaces:
Build error
Build error
import json | |
import time | |
import base64 | |
import pytest | |
import requests | |
from core.config import settings | |
from fastapi.testclient import TestClient | |
import email | |
from cruds import crud_user | |
import re | |
import os | |
MAILHOG_URL = f"http://{settings.SMTP_HOST}:8025/api" | |
headers = { | |
"accept": "application/json", | |
"Content-Type": "application/json", | |
} | |
def test_signup(client: TestClient) -> None: | |
mailhog_history_clear = requests.delete(f"{MAILHOG_URL}/v1/messages") | |
assert mailhog_history_clear.status_code == 200, "Mailhog email delete failed" | |
data = { | |
"email": "[email protected]", | |
"full_name": "Test User", | |
"address": "Testland", | |
"group_id": 1, | |
"contact_number": "9841111111", | |
"dob": "2000-01-01", | |
"join_year": 2015, | |
"password": "testold", | |
} | |
response = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/signup/", | |
headers=headers, | |
json=data, | |
) | |
assert response.status_code == 200 | |
def test_verification_email(client: TestClient) -> None: | |
mailhog_email_req = requests.get(f"{MAILHOG_URL}/v2/messages") | |
assert mailhog_email_req.status_code == 200, "Mailhog email request failed" | |
emails = mailhog_email_req.json() | |
assert emails.get("total") == 1, f'Received {emails.get("total")} emails! Expected 1!' | |
verification_email = emails.get("items")[0] | |
content = email.message_from_string(verification_email["Raw"]["Data"]) | |
decoded_email_content = None | |
for part in content.walk(): | |
payload = part.get_payload(decode=True) | |
if payload: | |
decoded_email_content = payload.decode() | |
link = re.findall( | |
settings.FRONTEND_URL_BASE+"/verify\?token=.{40}", decoded_email_content | |
)[0] | |
token = link[-40:] | |
assert token, "Token of length 40 not found in the email" | |
params = {"token": token} | |
verify_req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/verify/", | |
params=params, | |
) | |
assert verify_req.status_code == 200 | |
def test_web_session_authentication( | |
client: TestClient, username=None, password=None, remember_me=None | |
) -> None: | |
data = { | |
"username": username or "[email protected]", | |
"password": password or "testold", | |
"remember_me": remember_me or True, | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/web/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code == 200 | |
assert req.cookies.get("session"), "Cookie not returned!" | |
def test_web_session_authentication_fail(client: TestClient) -> None: | |
data = { | |
"username": "[email protected]", | |
"password": "test123", | |
"remember_me": True, | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/web/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code == 401 | |
assert not req.cookies.get("session"), "Cookie returned on login fail!" | |
def test_send_reset_email(client: TestClient) -> None: | |
data = { | |
"email": "[email protected]", | |
} | |
response = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/password-recovery/", | |
headers=headers, | |
params=data, | |
) | |
assert response.status_code == 200 | |
def test_reset_password(client: TestClient) -> None: | |
mailhog_email_req = requests.get(f"{MAILHOG_URL}/v2/messages") | |
assert mailhog_email_req.status_code == 200, "Mailhog email request failed" | |
emails = mailhog_email_req.json() | |
reset_email = emails.get("items")[0] | |
content = email.message_from_string(reset_email["Raw"]["Data"]) | |
decoded_email_content = None | |
for part in content.walk(): | |
payload = part.get_payload(decode=True) | |
if payload: | |
decoded_email_content = payload.decode() | |
link = re.findall( | |
settings.FRONTEND_URL_BASE+"/reset\?token=.{40}", decoded_email_content | |
)[0] | |
token = link[-40:] | |
assert token, "Token of length 40 not found in the email" | |
data = {"token": token, "new_password": "test"} | |
reset_response = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/reset-password/", | |
headers=headers, | |
json=data, | |
) | |
assert reset_response.status_code == 200 | |
def test_login_with_old_password(client: TestClient): | |
data = { | |
"username": "[email protected]", | |
"password": "testold", | |
"remember_me": True, | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/web/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code != 200, "Logged in with old password after reset" | |
assert not req.cookies.get("session"), "Cookie returned with old password" | |
def test_login_with_new_password(client: TestClient): | |
data = { | |
"username": "[email protected]", | |
"password": "test", | |
"remember_me": True, | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/web/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code == 200, "Couldn't login with new password" | |
assert req.cookies.get("session"), "Cookie not returned with new password" | |
def test_change_password(client: TestClient): | |
wrong_data = { | |
"current_password": "testwrong", | |
"new_password": "newtest", | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/change-password/", | |
json=wrong_data, | |
headers=headers, | |
) | |
assert req.status_code != 200 | |
data = { | |
"current_password": "test", | |
"new_password": "newtest", | |
} | |
req = client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/change-password/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code == 200 | |
test_web_session_authentication( | |
client=client, | |
username="[email protected]", | |
password="newtest", | |
remember_me=True, | |
) | |
def test_logout(client: TestClient) -> None: | |
response = client.get( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/logout/", | |
headers=headers, | |
) | |
assert response.status_code == 200 | |
def test_delete_user(db, super_user_client: TestClient): | |
data = { | |
"username": "[email protected]", | |
"password": "test", | |
"remember_me": False, | |
} | |
req = super_user_client.post( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/auth/web/", | |
json=data, | |
headers=headers, | |
) | |
assert req.status_code == 200, "Superadmin login failed" | |
assert req.cookies.get("session"), "Superadmin cookie not returned!" | |
user = crud_user.get_by_email(db, email="[email protected]") | |
delete_req = super_user_client.delete( | |
f"{settings.BACKEND_URL_BASE}{settings.API_V1_STR}/users/{user.id}/", | |
) | |
assert delete_req.status_code == 200 | |