Skip to content

Commit

Permalink
apps/userdashboard: updates tests
Browse files Browse the repository at this point in the history
  • Loading branch information
hklarner committed Aug 8, 2023
1 parent ac2f594 commit a954c14
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 48 deletions.
14 changes: 7 additions & 7 deletions apps/projects/helpers.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from datetime import timedelta

from django.contrib.contenttypes.models import ContentType
from django.db.models import Count
from django.db.models import Q
from django.db.models import Sum
from django.utils import timezone

from adhocracy4.comments.models import Comment
from adhocracy4.reports.models import Report


def get_all_comments_project(project):
Expand All @@ -20,11 +19,12 @@ def get_num_comments_project(project):


def get_num_reports(project):
comment_ids_project = get_all_comments_project(project).values_list("id", flat=True)
comment_ct = ContentType.objects.get_for_model(Comment)
return Report.objects.filter(
content_type=comment_ct, object_pk__in=comment_ids_project
).count()
comments = get_all_comments_project(project)
comments = comments.annotate(
num_reports=Count("reports", distinct=True) + Count("ai_report", distinct=True),
)

return comments.aggregate(Sum("num_reports"))["num_reports__sum"]


def get_num_latest_comments(project, until={"days": 7}):
Expand Down
19 changes: 12 additions & 7 deletions apps/userdashboard/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@ class ModerationCommentFilterSet(DefaultsRestFilterSet):

defaults = {"is_reviewed": "false"}

@property
def qs(self):
queryset = super().qs
reported_by = self.request.query_params.get("reported_by")

if reported_by == "ai":
queryset = queryset.filter(ai_report__isnull=False)
elif reported_by == "users":
queryset = queryset.filter(reports__isnull=False)

return queryset


class ModerationCommentPagination(PageNumberPagination):
page_size_query_param = "num_of_comments"
Expand Down Expand Up @@ -64,13 +76,6 @@ def get_queryset(self):
+ Count("ai_report", distinct=True),
)

reported_by = self.request.query_params.get("reported_by")

if reported_by == "ai":
comments = comments.filter(ai_report__isnull=False)
elif reported_by == "users":
comments = comments.filter(reports__isnull=False)

return comments

def update(self, request, *args, **kwargs):
Expand Down
3 changes: 3 additions & 0 deletions changelog/7538.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
### Added

- new filter category for comments in moderator dashboard: "reported by ai"
Empty file added tests/ai_reports/__init__.py
Empty file.
5 changes: 5 additions & 0 deletions tests/ai_reports/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from pytest_factoryboy import register

from .factories import AiReportFactory

register(AiReportFactory)
16 changes: 16 additions & 0 deletions tests/ai_reports/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import random

import factory

from apps.ai_reports.models import AiReport
from tests.factories import CommentFactory


class AiReportFactory(factory.django.DjangoModelFactory):
class Meta:
model = AiReport

category = factory.Faker("word")
explanation = factory.Faker("sentence", nb_words=6)
confidence = random.random()
comment = factory.SubFactory(CommentFactory)
2 changes: 2 additions & 0 deletions tests/userdashboard/conftest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from pytest_factoryboy import register

from tests.ai_reports.factories import AiReportFactory
from tests.ideas.factories import IdeaFactory
from tests.moderatorfeedback.factories import ModeratorCommentFeedbackFactory

register(IdeaFactory)
register(ModeratorCommentFeedbackFactory)
register(AiReportFactory)
57 changes: 43 additions & 14 deletions tests/userdashboard/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,13 @@ def test_moderator_can_mark_comment_read(apiclient, comment_factory, idea):


@pytest.mark.django_db
def test_queryset_and_filters(apiclient, report_factory, comment_factory, idea_factory):
def test_queryset_and_filters(
apiclient,
report_factory,
ai_report_factory,
comment_factory,
idea_factory,
):
idea = idea_factory(module__project__pk=1)
other_idea = idea_factory(module__project__pk=2)
project = idea.project
Expand All @@ -121,9 +127,10 @@ def test_queryset_and_filters(apiclient, report_factory, comment_factory, idea_f
)
comment_5 = comment_factory(content_object=other_idea)

# comment_1 with 2 reports
# comment_1 with 2 reports and 1 ai report
report_factory(content_object=comment_1)
report_factory(content_object=comment_1)
ai_report_factory(comment=comment_1)
# comment_2 with 1 report, is read
report_factory(content_object=comment_2)
# comment_3 with 1 report
Expand All @@ -141,35 +148,57 @@ def test_queryset_and_filters(apiclient, report_factory, comment_factory, idea_f
response = apiclient.get(url)
assert response.status_code == 200
assert len(response.data) == 2
comment_pks = [comment["pk"] for comment in response.data]
assert comment_pks == [comment_1.pk, comment_3.pk]
assert [comment["pk"] for comment in response.data] == [comment_1.pk, comment_3.pk]

# test default sorting is most reported (second sorting -created)
filter_string = "?is_reviewed=all"
response = apiclient.get(url + filter_string)
assert response.status_code == 200
assert len(response.data) == 4
comment_pks = [comment["pk"] for comment in response.data]
assert comment_pks == [comment_1.pk, comment_3.pk, comment_2.pk, comment_4.pk]

filter_string = "?is_reviewed=all&has_reports=False"
assert [comment["pk"] for comment in response.data] == [
comment_1.pk,
comment_3.pk,
comment_2.pk,
comment_4.pk,
]

filter_string = "?is_reviewed=all&reported_by=users"
response = apiclient.get(url + filter_string)
assert response.status_code == 200
assert len(response.data) == 3
assert [comment["pk"] for comment in response.data] == [
comment_1.pk,
comment_3.pk,
comment_2.pk,
]

filter_string = "?is_reviewed=all&reported_by=ai"
response = apiclient.get(url + filter_string)
assert response.status_code == 200
assert len(response.data) == 1
comment_pks = [comment["pk"] for comment in response.data]
assert comment_pks == [comment_4.pk]
assert [comment["pk"] for comment in response.data] == [comment_1.pk]

filter_string = "?has_reports=False"
filter_string = "?is_reviewed=all&reported_by=off"
response = apiclient.get(url + filter_string)
assert response.status_code == 200
assert len(response.data) == 0
assert len(response.data) == 4
assert [comment["pk"] for comment in response.data] == [
comment_1.pk,
comment_3.pk,
comment_2.pk,
comment_4.pk,
]

filter_string = "?is_reviewed=all&ordering=created"
response = apiclient.get(url + filter_string)
assert response.status_code == 200
assert len(response.data) == 4
comment_pks = [comment["pk"] for comment in response.data]
assert comment_pks == [comment_2.pk, comment_1.pk, comment_3.pk, comment_4.pk]
assert [comment["pk"] for comment in response.data] == [
comment_2.pk,
comment_1.pk,
comment_3.pk,
comment_4.pk,
]


@pytest.mark.django_db
Expand Down
51 changes: 31 additions & 20 deletions tests/userdashboard/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,46 @@


@pytest.mark.django_db
def test_num_reports(apiclient, report_factory, comment_factory, idea):
comment_1 = comment_factory(content_object=idea)
report_factory(content_object=comment_1)
def test_num_reports(
apiclient,
report_factory,
ai_report_factory,
comment_factory,
idea,
):
comments = comment_factory.create_batch(size=4, content_object=idea)
comments = {comment.pk: comment for comment in comments}
pks = list(comments)

comment_2 = comment_factory(content_object=idea)
report_factory(content_object=comment_2)
report_factory(content_object=comment_2)
n_user_reports = [1, 3, 0, 0]
num_user_reports_created = dict(zip(pks, n_user_reports))
for pk, size in num_user_reports_created.items():
report_factory.create_batch(size=size, content_object=comments[pk])

comment_3 = comment_factory(content_object=idea)
has_ai_report = [True, False, True, False]
ai_reports_created = dict(zip(comments, has_ai_report))
for pk, has_ai_report in ai_reports_created.items():
if has_ai_report:
ai_report_factory(comment=comments[pk])

num_reports_created = {
i: num_user_reports_created[i] + int(ai_reports_created[i]) for i in pks
}

project = idea.project
moderator = project.moderators.first()
apiclient.login(username=moderator.email, password="password")
url = reverse("moderationcomments-list", kwargs={"project_pk": project.pk})
response = apiclient.get(url)

assert response.status_code == 200
assert len(response.data) == 3
comment_1_data = [
comment for comment in response.data if comment["pk"] == comment_1.pk
][0]
comment_2_data = [
comment for comment in response.data if comment["pk"] == comment_2.pk
][0]
comment_3_data = [
comment for comment in response.data if comment["pk"] == comment_3.pk
][0]
assert comment_1_data["num_reports"] == 1
assert comment_2_data["num_reports"] == 2
assert comment_3_data["num_reports"] == 0
assert len(response.data) == 4

num_reports_received = {
comment["pk"]: comment["num_reports"] for comment in response.data
}

assert num_reports_created == num_reports_received


@pytest.mark.django_db
Expand Down

0 comments on commit a954c14

Please sign in to comment.