Skip to content

Commit

Permalink
Добавил проверку полей и дефолтной страницы
Browse files Browse the repository at this point in the history
  • Loading branch information
ErendzhenovBair committed Feb 6, 2024
1 parent 0975aaf commit 0825145
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 63 deletions.
2 changes: 1 addition & 1 deletion short_tracker/api/v1/filters.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down
2 changes: 1 addition & 1 deletion short_tracker/api/v1/tasks/views.py
Original file line number Diff line number Diff line change
@@ -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 (
Expand Down
73 changes: 39 additions & 34 deletions tests/fixtures/fixture_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
]
75 changes: 48 additions & 27 deletions tests/test_analytics.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from datetime import datetime, timedelta
from http import HTTPStatus

import pytest
Expand All @@ -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):
Expand All @@ -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(
Expand All @@ -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-запрос пользователю без прав к '
Expand All @@ -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-запрос неавторизованного пользователя к '
Expand All @@ -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)

0 comments on commit 0825145

Please sign in to comment.