MicroFish/backend/tests/test_users_admin.py

99 lines
3.8 KiB
Python

"""Tests per a l'API d'administració d'usuaris."""
import pytest
from unittest.mock import MagicMock, patch
@pytest.fixture
def app(in_memory_db):
import backend.app.db as db_module
saved_engine = db_module._engine
saved_session = db_module._SessionLocal
def _noop(url):
db_module._engine = saved_engine
db_module._SessionLocal = saved_session
with patch('backend.app.db.init_db', side_effect=_noop):
from backend.app import create_app
application = create_app()
application.config['TESTING'] = True
application.extensions['storage'] = MagicMock()
db_module._engine = saved_engine
db_module._SessionLocal = saved_session
return application
@pytest.fixture
def client(app):
with app.test_client() as c:
yield c
def test_list_users_empty(client, in_memory_db):
res = client.get('/api/users/')
assert res.status_code == 200
data = res.get_json()
assert data['success'] is True
assert data['data'] == []
def test_create_user_sends_invitation(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True) as mock_email:
res = client.post('/api/users/', json={
'email': 'newuser@example.com',
'name': 'New User',
'role': 'user'
})
assert res.status_code == 201
data = res.get_json()
assert data['success'] is True
assert data['data']['email'] == 'newuser@example.com'
assert data['data']['status'] == 'pending'
mock_email.assert_called_once()
def test_create_user_duplicate_email(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True):
client.post('/api/users/', json={'email': 'dup@example.com', 'name': 'D', 'role': 'user'})
res = client.post('/api/users/', json={'email': 'dup@example.com', 'name': 'D2', 'role': 'user'})
assert res.status_code == 409
def test_get_user(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True):
create_res = client.post('/api/users/', json={'email': 'get@example.com', 'name': 'Get', 'role': 'user'})
user_id = create_res.get_json()['data']['id']
res = client.get(f'/api/users/{user_id}')
assert res.status_code == 200
assert res.get_json()['data']['email'] == 'get@example.com'
def test_patch_user_role(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True):
create_res = client.post('/api/users/', json={'email': 'patch@example.com', 'name': 'P', 'role': 'user'})
user_id = create_res.get_json()['data']['id']
res = client.patch(f'/api/users/{user_id}', json={'role': 'admin'})
assert res.status_code == 200
assert res.get_json()['data']['role'] == 'admin'
def test_soft_delete_user(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True):
create_res = client.post('/api/users/', json={'email': 'del@example.com', 'name': 'Del', 'role': 'user'})
user_id = create_res.get_json()['data']['id']
res = client.delete(f'/api/users/{user_id}')
assert res.status_code == 200
get_res = client.get(f'/api/users/{user_id}')
assert get_res.get_json()['data']['status'] == 'disabled'
def test_reinvite_pending_user(client, in_memory_db):
with patch('backend.app.api.users.send_invitation_email', return_value=True) as mock_email:
create_res = client.post('/api/users/', json={'email': 'reinv@example.com', 'name': 'R', 'role': 'user'})
user_id = create_res.get_json()['data']['id']
with patch('backend.app.api.users.send_invitation_email', return_value=True) as mock_email2:
res = client.post(f'/api/users/{user_id}/reinvite')
assert res.status_code == 200
mock_email2.assert_called_once()