TIF_E41211115_Genso_quiz_ba.../test/service/test_auth_service.py

114 lines
3.6 KiB
Python

import pytest
from unittest.mock import MagicMock, patch
from app.services.auth_service import AuthService
from app.schemas import LoginSchema
from app.exception import AuthException
from werkzeug.security import generate_password_hash
@pytest.fixture
def mock_user_repository():
return MagicMock()
@pytest.fixture
def auth_service(mock_user_repository):
return AuthService(userRepository=mock_user_repository)
@pytest.fixture
def dummy_user():
return MagicMock(
id="user123",
email="user@example.com",
password=generate_password_hash("secret"),
)
# --- verify_google_id_token tests ---
@patch("app.services.auth_service.id_token.verify_oauth2_token")
def test_verify_google_existing_user(
mock_verify, auth_service, mock_user_repository, dummy_user
):
# Simulate valid token
mock_verify.return_value = {"sub": "google-id-123", "email": "user@example.com"}
mock_user_repository.get_by_google_id.return_value = dummy_user
user = auth_service.verify_google_id_token("valid_token")
assert user == dummy_user
mock_user_repository.get_by_google_id.assert_called_once()
@patch("app.services.auth_service.id_token.verify_oauth2_token")
def test_verify_google_new_user(
mock_verify, auth_service, mock_user_repository, dummy_user
):
mock_verify.return_value = {
"sub": "new-google-id",
"email": "newuser@example.com",
"name": "New User",
}
mock_user_repository.get_by_google_id.return_value = None
mock_user_repository.insert_user.return_value = "new-user-id"
mock_user_repository.get_user_by_id.return_value = dummy_user
with patch(
"app.services.auth_service.UserMapper.from_google_payload"
) as mock_mapper:
mock_mapper.return_value = dummy_user
user = auth_service.verify_google_id_token("new_token")
assert user == dummy_user
mock_user_repository.insert_user.assert_called_once()
mock_user_repository.get_user_by_id.assert_called_once_with(user_id="new-user-id")
@patch("app.services.auth_service.id_token.verify_oauth2_token")
def test_verify_google_email_mismatch(
mock_verify, auth_service, mock_user_repository, dummy_user
):
mock_verify.return_value = {"sub": "google-id-123", "email": "wrong@example.com"}
dummy_user.email = "correct@example.com"
mock_user_repository.get_by_google_id.return_value = dummy_user
with pytest.raises(AuthException, match="Email not match"):
auth_service.verify_google_id_token("token")
# @patch("app.services.auth_service.id_token.verify_oauth2_token")
# def test_verify_google_invalid_token(mock_verify, auth_service):
# mock_verify.side_effect = ValueError("Invalid token")
# with pytest.raises(AuthException):
# auth_service.verify_google_id_token("invalid_token")
# --- login tests ---
def test_login_success(auth_service, mock_user_repository, dummy_user):
mock_user_repository.get_user_by_email.return_value = dummy_user
schema = LoginSchema(email="user@example.com", password="secret")
user = auth_service.login(schema)
assert user.email == "user@example.com"
assert user.password is None
def test_login_wrong_password(auth_service, mock_user_repository, dummy_user):
mock_user_repository.get_user_by_email.return_value = dummy_user
schema = LoginSchema(email="user@example.com", password="wrong")
user = auth_service.login(schema)
assert user is None
def test_login_user_not_found(auth_service, mock_user_repository):
mock_user_repository.get_user_by_email.return_value = None
schema = LoginSchema(email="unknown@example.com", password="any")
user = auth_service.login(schema)
assert user is None