Как проверить, что комментарии отображаются в правильном порядке от старых к новым с использованием Pytest?

Как можно убедиться, что все комментарии в объекте новости отсортированы от старых к новым с использованием фикстур, содержащих множество комментариев и объект новости?
  • 26 июня 2024 г. 4:22
Ответы на вопрос 2
Для того чтобы проверить, что комментарии отображаются в правильном порядке от старых к новым, можно использовать библиотеку Pytest для написания тестов. Ниже приведен пример кода теста:

```python
import pytest

def test_comments_order(news_with_comments):
    news = news_with_comments
    comments = news.comments
    
    for i in range(len(comments) - 1):
        assert comments[i]['date'] <= comments[i + 1]['date']
```

В примере выше мы создаем тест `test_comments_order`, который принимает фикстуру `news_with_comments`, содержащую объект новости с комментариями. Мы сравниваем даты комментариев в объекте новости и проверяем, что они идут по возрастанию. Если какой-то комментарий имеет более позднюю дату, то тест упадет.

Чтобы убедиться, что все комментарии в объекте новости отсортированы от старых к новым с использованием фикстур, вам нужно создать фикстуру, которая содержит как минимум один объект новости и несколько комментариев. Например, вы можете использовать фикстуры вот так:

```python
import pytest

@pytest.fixture
def news_with_comments():
    news = {
        'title': 'Breaking News',
        'comments': [
            {'text': 'First comment', 'date': '2022-01-01'},
            {'text': 'Second comment', 'date': '2022-01-02'},
            {'text': 'Third comment', 'date': '2022-01-03'}
        ]
    }
    return news
```

Этот пример фикстуры `news_with_comments` создает объект новости с тремя комментариями, отсортированными по дате. Вы можете использовать эту фикстуру в своем тесте `test_comments_order` для проверки правильного порядка комментариев.
Итак, ответ на мой вопрос. Фикстура и сам тест были неправильными. 
Вот правильный тест:

def test_comments_order(client, a_lot_of_comments, url_detail):
    """Проверка сортировки комментариев от старых к новым."""
    response = client.get(url_detail)
    response.context['news']
    all_comments = [comment.created for comment in Comment.objects.all()]
    sorted_dates = sorted(all_comments, reverse=False)
    assert all_comments == sorted_dates

Но этот тест не будет работать без правильной фикстуры:

@pytest.fixture
def a_lot_of_comments(news, author):
    now = datetime.now()
    for i in range(10):
        comment = Comment.objects.create(
            text=f'Текст комметария {i}',
            author=author,
            news_id=news.id,
        )
        comment.created = now + timedelta(days=i)
        comment.save()

В фикстуре возвращать что либо или добавлять в список каждый комментарий не нужно, достаточно заполнить БД вписав фикстуру в параметры функции.

А затем достать всё объекты из временной БД Comment.objects.all() и перебрав комменты по дате создания, засунуть их в список all_comments . Далее сравниваем этот список с отсортированным как нам надо списком, они должны быть одинаковы.
Похожие вопросы