- Admin user is now automatically added to Global Admins team as owner - Ensures every user belongs to at least one team - Updated unit tests to handle multiple db.add() calls
104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
"""Unit tests for authentication module."""
|
|
|
|
import pytest
|
|
from unittest.mock import patch, MagicMock
|
|
|
|
|
|
class TestCreateDefaultAdmin:
|
|
"""Tests for the create_default_admin function."""
|
|
|
|
def test_create_default_admin_with_env_password(self):
|
|
"""Test that ORCHARD_ADMIN_PASSWORD env var sets admin password."""
|
|
from app.auth import create_default_admin, verify_password
|
|
from app.models import User
|
|
|
|
# Create mock settings with custom password
|
|
mock_settings = MagicMock()
|
|
mock_settings.admin_password = "my-custom-password-123"
|
|
|
|
# Mock database session
|
|
mock_db = MagicMock()
|
|
mock_db.query.return_value.count.return_value = 0 # No existing users
|
|
|
|
# Track all objects that get created
|
|
created_objects = []
|
|
|
|
def capture_object(obj):
|
|
created_objects.append(obj)
|
|
|
|
mock_db.add.side_effect = capture_object
|
|
|
|
with patch("app.auth.get_settings", return_value=mock_settings):
|
|
admin = create_default_admin(mock_db)
|
|
|
|
# Verify objects were created (user, team, membership)
|
|
assert mock_db.add.called
|
|
assert len(created_objects) >= 1
|
|
|
|
# Find the user object
|
|
created_user = next((obj for obj in created_objects if isinstance(obj, User)), None)
|
|
assert created_user is not None
|
|
assert created_user.username == "admin"
|
|
assert created_user.is_admin is True
|
|
# Password should NOT require change when set via env var
|
|
assert created_user.must_change_password is False
|
|
# Verify password was hashed correctly
|
|
assert verify_password("my-custom-password-123", created_user.password_hash)
|
|
|
|
def test_create_default_admin_with_default_password(self):
|
|
"""Test that default password 'changeme123' is used when env var not set."""
|
|
from app.auth import create_default_admin, verify_password
|
|
from app.models import User
|
|
|
|
# Create mock settings with empty password (default)
|
|
mock_settings = MagicMock()
|
|
mock_settings.admin_password = ""
|
|
|
|
# Mock database session
|
|
mock_db = MagicMock()
|
|
mock_db.query.return_value.count.return_value = 0 # No existing users
|
|
|
|
# Track all objects that get created
|
|
created_objects = []
|
|
|
|
def capture_object(obj):
|
|
created_objects.append(obj)
|
|
|
|
mock_db.add.side_effect = capture_object
|
|
|
|
with patch("app.auth.get_settings", return_value=mock_settings):
|
|
admin = create_default_admin(mock_db)
|
|
|
|
# Verify objects were created
|
|
assert mock_db.add.called
|
|
assert len(created_objects) >= 1
|
|
|
|
# Find the user object
|
|
created_user = next((obj for obj in created_objects if isinstance(obj, User)), None)
|
|
assert created_user is not None
|
|
assert created_user.username == "admin"
|
|
assert created_user.is_admin is True
|
|
# Password SHOULD require change when using default
|
|
assert created_user.must_change_password is True
|
|
# Verify default password was used
|
|
assert verify_password("changeme123", created_user.password_hash)
|
|
|
|
def test_create_default_admin_skips_when_users_exist(self):
|
|
"""Test that no admin is created when users already exist."""
|
|
from app.auth import create_default_admin
|
|
|
|
# Create mock settings
|
|
mock_settings = MagicMock()
|
|
mock_settings.admin_password = "some-password"
|
|
|
|
# Mock database session with existing users
|
|
mock_db = MagicMock()
|
|
mock_db.query.return_value.count.return_value = 1 # Users exist
|
|
|
|
with patch("app.auth.get_settings", return_value=mock_settings):
|
|
result = create_default_admin(mock_db)
|
|
|
|
# Should return None and not create any user
|
|
assert result is None
|
|
assert not mock_db.add.called
|