diff --git a/src/conftest.py b/src/conftest.py index 6278dd7bc..293b375fe 100644 --- a/src/conftest.py +++ b/src/conftest.py @@ -207,8 +207,9 @@ def accepted_talk_proposal(talk_proposal): @pytest.fixture -def api_client(bare_user: User) -> APIClient: +def api_client(user: User) -> APIClient: + """API client authenticated with a verified user's token.""" api_client = APIClient() - token, _ = Token.objects.get_or_create(user=bare_user) + token, _ = Token.objects.get_or_create(user=user) api_client.credentials(HTTP_AUTHORIZATION=f"Token {token.key}") yield api_client diff --git a/src/users/api/views.py b/src/users/api/views.py index 535ab2de7..c12a2d51c 100644 --- a/src/users/api/views.py +++ b/src/users/api/views.py @@ -15,7 +15,7 @@ def user_list(request): role = request.GET.get('role') if not role or role != "Reviewer": return JsonResponse({'detail': 'role is not given or invalid.'}, status=400) - qs = User.objects.filter(is_active=True,verified=True, groups__name= "Reviewer") + qs = User.objects.get_valid_users_by_role(role).order_by('speaker_name') users = [] for user in qs: users.append({ diff --git a/src/users/models.py b/src/users/models.py index 51a1d4671..9ad8d3a1f 100644 --- a/src/users/models.py +++ b/src/users/models.py @@ -39,6 +39,14 @@ def get_valid_speakers(self): users = users.exclude(speaker_name='').exclude(bio='') return users + def get_valid_users_by_role(self, role): + """Get active and verified users with specific role""" + return self.filter( + is_active=True, + verified=True, + groups__name=role + ) + class UserManager(BaseUserManager.from_queryset(UserQueryset)): """Custom manager for User. diff --git a/src/users/tests/test_api.py b/src/users/tests/test_api.py index ea394714d..225ef0c27 100644 --- a/src/users/tests/test_api.py +++ b/src/users/tests/test_api.py @@ -5,38 +5,39 @@ @pytest.mark.django_db def test_user_list_with_role_filter_exact_match(api_client, django_user_model): - group = Group.objects.create(name='Reviewer') - user = django_user_model.objects.create( + group = Group.objects.create(name="Reviewer") + + reviewer = django_user_model.objects.create( email="reviewer@example.com", speaker_name="Reviewer Name", bio="Some bio", verified=True, is_active=True, ) - user.groups.add(group) + reviewer.groups.add(group) - api_client.force_authenticate(user=user) + django_user_model.objects.create( + email="other@example.com", + speaker_name="Other User", + bio="Other bio", + verified=True, + is_active=True, + ) - url = reverse('user_list') - response = api_client.get(url, {'role': 'Reviewer'}) + url = reverse("user_list") + response = api_client.get(url, {"role": "Reviewer"}) assert response.status_code == 200 data = response.json() - assert data == [ - { - 'full_name': user.get_full_name(), - 'bio': user.bio, - 'photo_url': None, - 'facebook_profile_url': user.facebook_profile_url, - 'twitter_profile_url': user.twitter_profile_url, - 'github_profile_url': user.github_profile_url, - } - ] + assert len(data) == 1 + assert data[0]["full_name"] == reviewer.get_full_name() + assert data[0]["bio"] == reviewer.bio @pytest.mark.django_db def test_user_list_excludes_unverified_users(api_client, django_user_model): - group = Group.objects.create(name='Reviewer') + group = Group.objects.create(name="Reviewer") + unverified_user = django_user_model.objects.create( email="unverified@example.com", speaker_name="Not Verified", @@ -46,18 +47,15 @@ def test_user_list_excludes_unverified_users(api_client, django_user_model): ) unverified_user.groups.add(group) - api_client.force_authenticate(user=unverified_user) - - url = reverse('user_list') - response = api_client.get(url, {'role': 'Reviewer'}) + url = reverse("user_list") + response = api_client.get(url, {"role": "Reviewer"}) assert response.status_code == 200 assert response.json() == [] - @pytest.mark.django_db def test_user_list_with_invalid_role_returns_400(api_client, django_user_model): - user = django_user_model.objects.create( + django_user_model.objects.create( email="someuser@example.com", speaker_name="Some User", bio="Bio text", @@ -65,16 +63,14 @@ def test_user_list_with_invalid_role_returns_400(api_client, django_user_model): is_active=True, ) - api_client.force_authenticate(user=user) - - url = reverse('user_list') - response = api_client.get(url, {'role': 'NotARealRole'}) + url = reverse("user_list") + response = api_client.get(url, {"role": "NotARealRole"}) assert response.status_code == 400 @pytest.mark.django_db def test_user_list_without_role_returns_400(api_client, django_user_model): - user = django_user_model.objects.create( + django_user_model.objects.create( email="someuser@example.com", speaker_name="Some User", bio="Bio text", @@ -82,8 +78,6 @@ def test_user_list_without_role_returns_400(api_client, django_user_model): is_active=True, ) - api_client.force_authenticate(user=user) - - url = reverse('user_list') + url = reverse("user_list") response = api_client.get(url) assert response.status_code == 400