diff --git a/short_tracker/api/v1/filters.py b/short_tracker/api/v1/filters.py index 5dbc3e9..4161e84 100644 --- a/short_tracker/api/v1/filters.py +++ b/short_tracker/api/v1/filters.py @@ -1,7 +1,7 @@ +import django_filters from django.db.models import Case, Q, Value, When from django.utils import timezone from django_filters.rest_framework import FilterSet, filters -import django_filters from tasks.models import Task diff --git a/short_tracker/api/v1/tasks/views.py b/short_tracker/api/v1/tasks/views.py index 227a85f..9c2787e 100644 --- a/short_tracker/api/v1/tasks/views.py +++ b/short_tracker/api/v1/tasks/views.py @@ -1,8 +1,8 @@ from django.contrib.auth import get_user_model from django.db.models import F, Q from django_filters.rest_framework import DjangoFilterBackend -from rest_framework.filters import SearchFilter from rest_framework import viewsets +from rest_framework.filters import SearchFilter from rest_framework.permissions import IsAuthenticated from .serializers import ( diff --git a/tests/fixtures/fixture_data.py b/tests/fixtures/fixture_data.py index 401f2ec..75e3316 100644 --- a/tests/fixtures/fixture_data.py +++ b/tests/fixtures/fixture_data.py @@ -5,38 +5,43 @@ from tasks.models import Task -@pytest.fixture(params=[ - {'creator': 'user_1', 'performer': 'user_1', 'deadline': True}, - {'creator': 'team_lead_user', 'performer': 'user_1', 'deadline': True}, - {'creator': 'team_lead_user', 'performer': 'user_1', 'deadline': False}, - {'creator': 'team_lead_user', 'performer': 'user_1', 'deadline': False}, - { - 'creator': 'team_lead_user', - 'performer': 'team_lead_user', 'deadline': False - }, -]) -def task(request, user_1, team_lead_user): - task_params = request.param - deadline = ( - date.today() + timedelta(days=7) - if task_params['deadline'] - else date.today() - timedelta(days=7) - ) - creator_user = ( - user_1 - if task_params['creator'] == 'user' - else team_lead_user) - performer_user = ( - team_lead_user - if task_params['performer'] == 'team_lead' - else user_1) - task = Task.objects.create( - creator=creator_user, - description= ( - f'Task {"with" if task_params["deadline"] else "without"} ' - f'deadline'), - deadline_date=deadline, +@pytest.fixture +def create_task(user_1, team_lead_user): + def _create_task(creator, performers, has_deadline): + create_date = date.today() - timedelta(days=15) + inprogress_date = create_date + timedelta(days=4) + done_date = inprogress_date + timedelta(days=2) + creator_user = user_1 if creator == 'user_1' else team_lead_user + performers_users = [ + team_lead_user + if performer == 'team_lead' + else user_1 for performer in performers] + deadline_date = ( + done_date - timedelta(days=1) + if has_deadline else done_date + timedelta(days=3)) + task_data = Task.objects.create( + creator=creator_user, + link="https://short-tracker.acceleratorpracticum.ru/", + description=( + f'Task {"with" if has_deadline else "without"} deadline'), status=Task.TaskStatus.DONE, - ) - task.performers.set([performer_user]) - return task + create_date=create_date, + inprogress_date=inprogress_date, + done_date=done_date, + deadline_date = deadline_date, + get_medals=True, + ) + task_data.performers.set(performers_users) + return task_data + return _create_task + + +@pytest.fixture +def tasks(create_task): + return [ + create_task('user_1', 'user_1', True), + create_task('team_lead_user', 'user_1', True), + create_task('team_lead_user', 'user_1', False), + create_task('team_lead_user', 'user_1', False), + create_task('team_lead_user', 'user_1', False), + ] diff --git a/tests/test_analytics.py b/tests/test_analytics.py index a71af93..2d721cb 100644 --- a/tests/test_analytics.py +++ b/tests/test_analytics.py @@ -1,3 +1,4 @@ +from datetime import datetime, timedelta from http import HTTPStatus import pytest @@ -9,12 +10,10 @@ class TestTaskAnalytics: base_url = '/api/v1/task-analytics/' periods = [ - ("2024-02-01", "2024-02-15"), - ("2023-02-10", "2023-02-20"), - ("2022-02-01", "2023-02-15"), ("2023-02-10", "2024-02-20"), ("", "2023-05-28"), - ("2023-12-01", "") + ("2023-12-01", ""), + ("", "") ] def build_url(self, start_date=None, end_date=None): @@ -27,7 +26,7 @@ def build_url(self, start_date=None, end_date=None): @pytest.mark.parametrize("start_date, end_date", periods) def test_analytics_endpoint( - self, team_lead_client, task, start_date, end_date + self, team_lead_client, tasks, start_date, end_date ): custom_url = self.build_url( @@ -37,22 +36,13 @@ def test_analytics_endpoint( 'Проверьте, что GET-запрос авторизованного пользователя к ' f'{custom_url}` возвращает статус 200.' ) - - data = response.json() + data =response.json() assert isinstance(data, dict), ( - 'Проверьте, что GET-запрос тимлида к ' - f'`{custom_url}` возвращает список.' + 'Проверьте, что GET-запрос тимлида возвращает словарь.' ) - non_lead_users = CustomUser.objects.filter( - is_team_lead=False) - for performer_id in data.get('performers_analytics', {}): - assert performer_id in map( - str, non_lead_users.values_list('id', flat=True) - ), ( - 'Убедитесь, что в аналитике отсутствуют лиды.') def test_perform_access( - self, performer_client): + self, performer_client, tasks): custom_url = self.build_url() assert_msg = ( 'Проверьте, что GET-запрос пользователю без прав к ' @@ -67,14 +57,9 @@ def test_perform_access( ) ) assert response.status_code == HTTPStatus.FORBIDDEN, assert_msg - response = performer_client.post(custom_url) - assert response.status_code == HTTPStatus.FORBIDDEN, ( - 'Проверьте, что POST-запрос пользователю без прав к ' - f'`{custom_url}` возвращает ответ со статусом 403.' - ) def test_access_not_auth( - self, client): + self, client, tasks): custom_url = self.build_url() assert_msg = ( 'Проверьте, что GET-запрос неавторизованного пользователя к ' @@ -89,8 +74,44 @@ def test_access_not_auth( ) ) assert response.status_code == HTTPStatus.UNAUTHORIZED, assert_msg - response = client.post(custom_url) - assert response.status_code == HTTPStatus.UNAUTHORIZED, ( - 'Проверьте, что POST-запрос неавторизованного пользователя к ' - f'`{custom_url}` возвращает ответ со статусом 401.' + + def test_analytics_data(self, + team_lead_client, + tasks, + performers_analytics=None): + response = team_lead_client.get(self.build_url()) + data = response.json() + expected_fields = ( + 'total_tasks_on_time', + 'total_tasks_with_delay', + 'performers_analytics') + expected_performers_analytics_data = ( + 'performer_name', + 'completed_on_time_count', + 'completed_with_delay_count', + 'avg_time_create_date_to_inprogress_date', + 'avg_time_create_date_to_done_date', + 'avg_time_inprogress_date_to_done_date' ) + for field in expected_fields: + assert field in data, ( + 'Проверьте, что для лида ответ на ' + f' GET-запрос содержит поле `{field}`.' + ) + if performers_analytics: + for field in performers_analytics: + assert field in expected_performers_analytics_data, ( + 'Проверьте, что для лида ответ на ' + f' GET-запрос содержит поле `{field}`.') + performers_analytics_data = data.get('performers_analytics', {}) + for performer_id in performers_analytics_data: + performer = CustomUser.objects.get(id=performer_id) + assert not performer.is_lead, ( + 'Убедитесь, что в аналитике отсутствуют лиды.') + + def test_default_page(self, team_lead_client): + response = team_lead_client.get(self.build_url()) + expected_tasks = team_lead_client.get( + self.build_url( + start_date=datetime.today() - timedelta(days=7))) + assert len(response.data) == len(expected_tasks.data)