Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion src/users/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
8 changes: 8 additions & 0 deletions src/users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
56 changes: 25 additions & 31 deletions src/users/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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="[email protected]",
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="[email protected]",
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="[email protected]",
speaker_name="Not Verified",
Expand All @@ -46,44 +47,37 @@ 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="[email protected]",
speaker_name="Some User",
bio="Bio text",
verified=True,
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="[email protected]",
speaker_name="Some User",
bio="Bio text",
verified=True,
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