Files
MyFastHtml/tests/auth/test_login.py

116 lines
3.1 KiB
Python

import os
from dataclasses import dataclass
import pytest
from fasthtml.fastapp import fast_app
import myfasthtml.auth.utils
from myfasthtml.auth.routes import setup_auth_routes
from myfasthtml.auth.utils import create_auth_beforeware, register_user
from myfasthtml.core.testclient import MyTestClient
@dataclass
class DummyUser:
email: str
username: str
password: str
@pytest.fixture()
def registered_user():
user = DummyUser("user@email.com", "user", "#Passw0rd")
register_user(user.email, user.username, user.password)
return user
@pytest.fixture()
def app():
beforeware = create_auth_beforeware()
test_app, test_rt = fast_app(before=beforeware)
setup_auth_routes(test_app, test_rt, mount_auth_app=True, sqlite_db_path="TestUsers.db")
@test_rt('/')
def index(): return "You are now logged in !"
return test_app
@pytest.fixture()
def rt(app):
return app.route
@pytest.fixture()
def user(app):
user = MyTestClient(app)
previous = myfasthtml.auth.utils.http_client
myfasthtml.auth.utils.http_client = user.client
yield user
myfasthtml.auth.utils.http_client = previous
@pytest.fixture(autouse=True)
def cleanup():
if os.path.exists("TestUsers.db"):
os.remove("TestUsers.db")
def test_i_can_see_login_page(user):
user.open("/login")
user.should_see("Sign In")
user.should_see("Register here")
user.find_form(fields=["Email", "Password"])
def test_i_cannot_login_with_wrong_credentials(user):
user.open("/login")
form = user.find_form(fields=["Email", "Password"])
form.fill(Email="user@email.com", Password="#Passw0rd")
form.submit()
user.should_see("Invalid email or password. Please try again.")
def test_i_can_login_with_correct_credentials(user, registered_user):
user.open("/login")
form = user.find_form(fields=["Email", "Password"])
form.fill(Email=registered_user.email, Password=registered_user.password)
form.submit()
user.should_see("You are now logged in !")
def test_i_can_can_navigate_once_logged_in(user, registered_user):
user.open("/welcome") # not logged in, redirects to login
user.should_see("Sign In")
form = user.find_form(fields=["Email", "Password"])
form.fill(Email=registered_user.email, Password=registered_user.password)
form.submit()
user.open("/welcome") # once logged in, welcome page is accessible
user.should_see("Welcome back, user@email.com!") # welcome page is predefined
def test_i_can_register(user):
user.open("/register")
form = user.find_form(fields=["Email", "Username", "Password"])
form.fill(Email="user@email.com", Username="username", Password="#Passw0rd", confirm_password="#Passw0rd")
form.submit()
user.should_see("You are now logged in !")
def test_i_can_logout(user, registered_user):
user.open("/login")
form = user.find_form(fields=["Email", "Password"])
form.fill(Email=registered_user.email, Password=registered_user.password)
form.submit()
user.open("/logout")
user.should_see("Sign In")
user.open("/welcome")
user.should_see("Sign In")