tests: simplify user synchronization API tests (#67901)

This commit is contained in:
Benjamin Dauvergne 2022-10-07 11:42:27 +02:00
parent 5a592baf31
commit 23956e98dd
1 changed files with 65 additions and 55 deletions

View File

@ -18,62 +18,87 @@ import datetime
import random
import uuid
import pytest
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from authentic2.a2_rbac.models import SEARCH_OP, Role
from authentic2.a2_rbac.utils import get_default_ou
from authentic2.apps.journal.models import Event, EventType
from authentic2.custom_user.models import User
from ..utils import basic_authorization_header
URL = '/api/users/synchronization/'
def test_basic(app, simple_user):
headers = basic_authorization_header(simple_user)
uuids = []
for _ in range(100):
user = User.objects.create(first_name='ben', last_name='dauve')
uuids.append(user.uuid)
unknown_uuids = [uuid.uuid4().hex for i in range(100)]
url = reverse('a2-api-users-synchronization')
@pytest.fixture
def user(simple_user):
role = Role.objects.get_admin_role(
ContentType.objects.get_for_model(User), name='role', slug='role', operation=SEARCH_OP
)
role.members.add(simple_user)
return simple_user
@pytest.fixture
def app(app, user):
app.set_authorization(('Basic', (user.username, user.username)))
return app
@pytest.fixture
def users(db):
return [User.objects.create(first_name='john', last_name='doe') for _ in range(10)]
@pytest.fixture
def uuids(users):
return [user.uuid for user in users]
def test_url(app, simple_user):
# URL is publikc api, check it
assert URL == reverse('a2-api-users-synchronization')
def test_authentication_required(app):
app.set_authorization(None)
app.post_json(URL, status=401)
def test_permission_required(app, user):
user.roles.clear()
app.post_json(URL, status=403)
@pytest.fixture(scope='session')
def unknown_uuids():
return [uuid.uuid4().hex for i in range(10)]
@pytest.fixture
def payload(uuids, unknown_uuids):
content = {
'known_uuids': uuids + unknown_uuids,
}
random.shuffle(content['known_uuids'])
return content
# test permission check
response = app.post_json(url, params=content, headers=headers, status=403)
r = Role.objects.get_admin_role(
ContentType.objects.get_for_model(User), name='role', slug='role', operation=SEARCH_OP
)
r.members.add(simple_user)
response = app.post_json(url, params=content, headers=headers)
def test_basic(app, payload, unknown_uuids):
response = app.post_json(URL, params=payload)
assert response.json['result'] == 1
assert set(response.json['unknown_uuids']) == set(unknown_uuids)
def test_full_known_users(app, admin):
headers = basic_authorization_header(admin)
uuids = []
for _ in range(100):
user = User.objects.create(first_name='jim', last_name='jam')
uuids.append(user.uuid)
unknown_uuids = [uuid.uuid4().hex for i in range(100)]
url = reverse('a2-api-users-synchronization')
content = {
'known_uuids': uuids + unknown_uuids,
'full_known_users': 1,
}
random.shuffle(content['known_uuids'])
response = app.post_json(url, params=content, headers=headers)
def test_full_known_users(app, payload):
payload['full_known_users'] = 1
response = app.post_json(URL, params=payload)
assert response.json['result'] == 1
# known users returned as part of api's full mode:
assert len(response.json['known_users']) == 100
assert len(response.json['known_users']) == 10
for user_dict in response.json['known_users']:
assert user_dict['first_name'] == 'jim'
assert user_dict['last_name'] == 'jam'
assert user_dict['first_name'] == 'john'
assert user_dict['last_name'] == 'doe'
assert {
'uuid',
'email',
@ -87,24 +112,9 @@ def test_full_known_users(app, admin):
}.issubset(set(user_dict.keys()))
def test_timestamp(app, admin):
headers = basic_authorization_header(admin)
url = reverse('a2-api-users-synchronization')
def test_timestamp(app, users):
now = datetime.datetime.now()
ou = get_default_ou()
users = []
for i in range(6):
users.append(
User.objects.create(
first_name='john%s' % i,
last_name='doe',
username='user%s' % i,
email='user%s' % i,
ou=ou,
)
)
users = users[:6]
for i, event_name in enumerate(
[
@ -128,7 +138,7 @@ def test_timestamp(app, admin):
'timestamp': (now - datetime.timedelta(days=3)).isoformat(),
}
response = app.post(url, params=content, headers=headers)
response = app.post(URL, params=content)
for user in users[:3]:
assert user.uuid in response.json['modified_users_uuids']
@ -142,7 +152,7 @@ def test_timestamp(app, admin):
content['timestamp'] = (now - datetime.timedelta(days=7)).isoformat()
response = app.post(url, params=content, headers=headers)
response = app.post(URL, params=content)
for user in users[:3]:
assert user.uuid not in response.json['modified_users_uuids']
@ -154,7 +164,7 @@ def test_timestamp(app, admin):
for user in users[3:]:
user.delete()
response = app.post(url, params=content, headers=headers)
response = app.post(URL, params=content)
assert not response.json['modified_users_uuids']
for user in users:
@ -163,7 +173,7 @@ def test_timestamp(app, admin):
for user in users[:3]:
content['known_uuids'].remove(user.uuid)
response = app.post(url, params=content, headers=headers)
response = app.post(URL, params=content)
assert not response.json['modified_users_uuids']
assert len(response.json['unknown_uuids']) == 3