Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tests for the pontoon.insights module (#3015) #3079

Merged
merged 7 commits into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from 2 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
Empty file.
213 changes: 213 additions & 0 deletions pontoon/insights/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
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.shortcuts import render
from django.urls import reverse

from pontoon.actionlog.models import ActionLog
from pontoon.insights import views
from pontoon.test.factories import (
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.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():
potat0 marked this conversation as resolved.
Show resolved Hide resolved
"""Add the system user to the test data."""
return factories.UserFactory(email="pontoon-sync@example.com")


@pytest.fixture
def pretranslation_user():
potat0 marked this conversation as resolved.
Show resolved Hide resolved
return User.objects.get(email="pontoon-tm@example.com")


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