Skip to content

Commit

Permalink
Add tests for the pontoon.insights module (#3015)
Browse files Browse the repository at this point in the history
  • Loading branch information
potat0 committed Feb 3, 2024
1 parent c63b0c5 commit 872b9ce
Show file tree
Hide file tree
Showing 3 changed files with 238 additions and 0 deletions.
Empty file.
226 changes: 226 additions & 0 deletions pontoon/insights/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
import json
from dataclasses import dataclass
from datetime import datetime, timezone
from http import HTTPStatus
from unittest.mock import patch

import pytest
from dateutil.relativedelta import relativedelta
from django.contrib.auth.models import User
from django.shortcuts import render
from django.urls import reverse

from pontoon.actionlog.models import ActionLog
from pontoon.insights import views
from pontoon.test.factories import (
UserFactory,
ResourceFactory,
TranslationFactory,
)


def perform_action(action_type, translation, user, timestamp):
action = ActionLog.objects.create(
action_type=action_type,
performed_by=user,
translation=translation,
)
action.created_at = timestamp
action.save()
return action


@dataclass
class MonthlyQualityEntry:
months_ago: int
approved: int
rejected: int


@pytest.fixture
def system_user():
# Test data doesn't contain the system user, so we create them here.
return UserFactory(email="pontoon-sync@example.com")


@pytest.fixture
def pretranslation_user():
return User.objects.get(email="pontoon-tm@example.com")


@pytest.mark.django_db
def test_default_empty(
client, system_user, pretranslation_user, locale_a, project_a, user_a
):
url = reverse("pontoon.insights")
with patch.object(views, "render", wraps=render) as mock_render:
response = client.get(url)
assert response.status_code == HTTPStatus.OK

response_context = mock_render.call_args[0][2]
start_date = response_context["start_date"]
end_date = response_context["end_date"]
assert start_date < end_date <= datetime.now(timezone.utc)
team_pretranslation_quality = response_context["team_pretranslation_quality"]
assert json.loads(team_pretranslation_quality["dataset"]) == [
{
"name": "All",
"approval_rate": [
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
],
}
]
project_pretranslation_quality = response_context["project_pretranslation_quality"]
assert json.loads(project_pretranslation_quality["dataset"]) == [
{
"name": "All",
"approval_rate": [
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
],
}
]


@pytest.mark.django_db
def test_default_with_data(
client, system_user, pretranslation_user, locale_a, project_a, user_a
):
entries = [
MonthlyQualityEntry(months_ago=0, approved=1, rejected=0),
MonthlyQualityEntry(months_ago=1, approved=0, rejected=1),
MonthlyQualityEntry(months_ago=2, approved=1, rejected=1),
MonthlyQualityEntry(months_ago=3, approved=3, rejected=0),
MonthlyQualityEntry(months_ago=4, approved=0, rejected=3),
MonthlyQualityEntry(months_ago=5, approved=3, rejected=1),
]
resource = ResourceFactory.create(project=project_a, path="has/stats.po")

now = datetime.now(timezone.utc)
for entry in entries:
timestamp = now - relativedelta(now, months=entry.months_ago)
for approval_index in range(entry.approved):
translation = TranslationFactory.create(
entity__resource=resource, locale=locale_a, user=pretranslation_user
)
perform_action(
ActionLog.ActionType.TRANSLATION_APPROVED,
translation,
user_a,
timestamp,
)
for rejected_index in range(entry.rejected):
translation = TranslationFactory.create(
entity__resource=resource, locale=locale_a, user=pretranslation_user
)
perform_action(
ActionLog.ActionType.TRANSLATION_REJECTED,
translation,
user_a,
timestamp,
)

url = reverse("pontoon.insights")
with patch.object(views, "render", wraps=render) as mock_render:
response = client.get(url)
assert response.status_code == HTTPStatus.OK

response_context = mock_render.call_args[0][2]
start_date = response_context["start_date"]
end_date = response_context["end_date"]
assert start_date < end_date <= datetime.now(timezone.utc)
team_pretranslation_quality = response_context["team_pretranslation_quality"]
assert json.loads(team_pretranslation_quality["dataset"]) == [
{
"name": "All",
"approval_rate": [
None,
None,
None,
None,
None,
None,
75.0,
0.0,
100.0,
50.0,
0.0,
100.0,
],
},
{
"name": f"{locale_a.name} · {locale_a.code}",
"approval_rate": [
None,
None,
None,
None,
None,
None,
75.0,
0.0,
100.0,
50.0,
0.0,
100.0,
],
},
]
project_pretranslation_quality = response_context["project_pretranslation_quality"]
assert json.loads(project_pretranslation_quality["dataset"]) == [
{
"name": "All",
"approval_rate": [
None,
None,
None,
None,
None,
None,
75.0,
0.0,
100.0,
50.0,
0.0,
100.0,
],
},
{
"name": project_a.name,
"approval_rate": [
None,
None,
None,
None,
None,
None,
75.0,
0.0,
100.0,
50.0,
0.0,
100.0,
],
},
]
12 changes: 12 additions & 0 deletions pontoon/test/fixtures/base.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
from django.contrib.auth.models import User

from pontoon.test import factories

Expand All @@ -19,6 +20,17 @@ def client_superuser(client, admin):
return client


@pytest.fixture
def system_user():
"""Add the system user to the test data."""
return factories.UserFactory(email="pontoon-sync@example.com")


@pytest.fixture
def pretranslation_user():
return User.objects.get(email="pontoon-tm@example.com")


@pytest.fixture
def user_a():
return factories.UserFactory(username="user_a")
Expand Down

0 comments on commit 872b9ce

Please sign in to comment.