123 lines
4.0 KiB
Python
123 lines
4.0 KiB
Python
"""Tests unitaris per a AuthService."""
|
|
import pytest
|
|
from datetime import datetime, timezone, timedelta
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _db(in_memory_db):
|
|
pass
|
|
|
|
|
|
def test_hash_and_verify_password():
|
|
from backend.app.services.auth_service import hash_password, verify_password
|
|
h = hash_password("secret123")
|
|
assert h != "secret123"
|
|
assert verify_password("secret123", h) is True
|
|
assert verify_password("wrong", h) is False
|
|
|
|
|
|
def test_verify_wrong_hash_returns_false():
|
|
from backend.app.services.auth_service import verify_password
|
|
assert verify_password("any", "not-a-valid-hash") is False
|
|
|
|
|
|
def test_create_invitation_token(in_memory_db):
|
|
from backend.app.services.auth_service import create_invitation_token
|
|
from backend.app.models.db_models import UserModel
|
|
from backend.app.db import get_session
|
|
|
|
with get_session() as db:
|
|
user = UserModel(email="test@example.com", name="Test", role="user", status="pending")
|
|
db.add(user)
|
|
db.commit()
|
|
user_id = user.id
|
|
|
|
token = create_invitation_token(user_id, ttl_hours=1)
|
|
assert len(token) == 36 # UUID
|
|
|
|
|
|
def test_verify_valid_invitation_token(in_memory_db):
|
|
from backend.app.services.auth_service import create_invitation_token, get_user_by_invitation_token
|
|
from backend.app.models.db_models import UserModel
|
|
from backend.app.db import get_session
|
|
|
|
with get_session() as db:
|
|
user = UserModel(email="invite@example.com", name="Inv", role="user", status="pending")
|
|
db.add(user)
|
|
db.commit()
|
|
user_id = user.id
|
|
|
|
token = create_invitation_token(user_id, ttl_hours=1)
|
|
result = get_user_by_invitation_token(token)
|
|
assert result is not None
|
|
assert result.id == user_id
|
|
|
|
|
|
def test_verify_expired_invitation_token(in_memory_db):
|
|
from backend.app.services.auth_service import get_user_by_invitation_token
|
|
from backend.app.models.db_models import UserModel, InvitationTokenModel
|
|
from backend.app.db import get_session
|
|
import uuid
|
|
|
|
with get_session() as db:
|
|
user = UserModel(email="exp@example.com", name="Exp", role="user", status="pending")
|
|
db.add(user)
|
|
db.commit()
|
|
tok = InvitationTokenModel(
|
|
token=str(uuid.uuid4()),
|
|
user_id=user.id,
|
|
expires_at=datetime.now(timezone.utc) - timedelta(hours=1)
|
|
)
|
|
db.add(tok)
|
|
db.commit()
|
|
token_val = tok.token
|
|
|
|
result = get_user_by_invitation_token(token_val)
|
|
assert result is None
|
|
|
|
|
|
def test_create_and_verify_reset_token(in_memory_db):
|
|
from backend.app.services.auth_service import (
|
|
create_reset_token, get_user_by_reset_token, consume_reset_token
|
|
)
|
|
from backend.app.models.db_models import UserModel
|
|
from backend.app.db import get_session
|
|
|
|
with get_session() as db:
|
|
user = UserModel(email="reset@example.com", name="Reset", role="user", status="active",
|
|
password_hash="x")
|
|
db.add(user)
|
|
db.commit()
|
|
user_id = user.id
|
|
|
|
token = create_reset_token(user_id, ttl_hours=1)
|
|
u = get_user_by_reset_token(token)
|
|
assert u is not None
|
|
assert u.id == user_id
|
|
|
|
consume_reset_token(token, "newpassword123")
|
|
assert get_user_by_reset_token(token) is None
|
|
|
|
|
|
def test_set_password_activates_user(in_memory_db):
|
|
from backend.app.services.auth_service import (
|
|
create_invitation_token, consume_invitation_token
|
|
)
|
|
from backend.app.models.db_models import UserModel
|
|
from backend.app.db import get_session
|
|
|
|
with get_session() as db:
|
|
user = UserModel(email="act@example.com", name="Act", role="user", status="pending")
|
|
db.add(user)
|
|
db.commit()
|
|
user_id = user.id
|
|
|
|
token = create_invitation_token(user_id, ttl_hours=1)
|
|
consume_invitation_token(token, "mypassword")
|
|
|
|
with get_session() as db:
|
|
u = db.get(UserModel, user_id)
|
|
assert u.status == "active"
|
|
from backend.app.services.auth_service import verify_password
|
|
assert verify_password("mypassword", u.password_hash) is True
|