114 lines
3.6 KiB
Python
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
|