test_cursor_pagination.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import pytest
  2. from ..cursorpagination import CursorPage, EmptyPage, InvalidPage, get_page
  3. @pytest.fixture
  4. def mock_objects(mocker):
  5. return [mocker.Mock(post=i) for i in range(1, 12)]
  6. @pytest.fixture
  7. def mock_queryset(mocker, mock_objects):
  8. return mocker.Mock(filter=mocker.Mock(return_value=mock_objects))
  9. def test_paginator_returns_first_page(mock_objects):
  10. assert get_page(mock_objects, "post", 6)
  11. def test_first_page_has_first_flag(mock_objects):
  12. page = get_page(mock_objects, "post", 6)
  13. assert page.first
  14. def test_first_page_start_is_zero(mock_objects):
  15. page = get_page(mock_objects, "post", 6)
  16. assert page.start == 0
  17. def test_first_page_has_correct_length(mock_objects):
  18. page = get_page(mock_objects, "post", 6)
  19. assert len(page.object_list) == 6
  20. def test_first_page_has_correct_items(mock_objects):
  21. page = get_page(mock_objects, "post", 6)
  22. assert page.object_list == mock_objects[:6]
  23. def test_page_has_next_attr_pointing_to_first_item_of_next_page(mock_objects):
  24. page = get_page(mock_objects, "post", 6)
  25. assert page.next == 7
  26. def test_requesting_next_page_filters_queryset_using_filter_name(mock_queryset):
  27. page = get_page(mock_queryset, "post", 6, 7)
  28. mock_queryset.filter.assert_called_once_with(post__gte=7)
  29. def test_requesting_next_page_for_reversed_order_filters_queryset_with_descending(
  30. mock_queryset,
  31. ):
  32. page = get_page(mock_queryset, "-post", 6, 7)
  33. mock_queryset.filter.assert_called_once_with(post__lte=7)
  34. def test_requesting_next_page_limits_queryset_to_specified_length(mock_queryset):
  35. page = get_page(mock_queryset, "post", 6, 7)
  36. assert len(page.object_list) == 6
  37. def test_paginator_returns_empty_first_page_without_errors():
  38. get_page([], "post", 6)
  39. def test_paginator_raises_empty_page_error_if_nth_page_is_empty(mocker):
  40. queryset = mocker.Mock(filter=lambda **_: [])
  41. with pytest.raises(EmptyPage):
  42. get_page(queryset, "post", 6, 20)
  43. def test_paginator_raises_invalid_page_error_if_starting_position_is_negative():
  44. with pytest.raises(InvalidPage):
  45. get_page(None, None, 0, -1)
  46. def test_page_can_be_tested_to_see_if_next_page_exists(mock_objects):
  47. page = get_page(mock_objects, "post", 6)
  48. assert page.has_next()
  49. def test_last_page_has_no_next(mock_objects):
  50. page = get_page([], "post", 6)
  51. assert not page.next
  52. assert not page.has_next()
  53. def test_cursor_page_is_first_if_start_is_zero():
  54. page = CursorPage(0, [])
  55. assert page.first
  56. def test_cursor_page_is_not_first_if_start_is_not_zero():
  57. page = CursorPage(1, [])
  58. assert not page.first