From e8f00edc2f44c554ea52210a29b4d5b12fdf7811 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 7 Oct 2022 11:42:27 +0200 Subject: [PATCH 5/6] tests: simplify user synchronization API tests (#67901) --- tests/api/test_user_synchronization.py | 120 +++++++++++++------------ 1 file changed, 65 insertions(+), 55 deletions(-) diff --git a/tests/api/test_user_synchronization.py b/tests/api/test_user_synchronization.py index 85dacc2e..fe5364c2 100644 --- a/tests/api/test_user_synchronization.py +++ b/tests/api/test_user_synchronization.py @@ -18,63 +18,88 @@ 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 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 django_rbac.models import SEARCH_OP -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', @@ -88,24 +113,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( [ @@ -129,7 +139,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'] @@ -143,7 +153,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'] @@ -155,7 +165,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: @@ -164,7 +174,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 -- 2.37.2