def test_get_info(self):
        query = Mock()
        query.count.return_value = 100
        query.offset.return_value = query
        query.limit.return_value = query
        query.all.return_value = [1, 2, 3]
        pag = Paginator(limit=10, page=3)

        pag.get_page(query)
        info = pag.get_info()

        assert info['total_pages'] == 10
        assert info['total_number_of_items'] == 100
        assert info['current_page'] == 3
        assert info['previous_page'] == 2
        assert info['next_page'] == 4
    def test_normal_flow(self):
        """ It should return the item page without errors
        """
        query = Mock()
        query.count.return_value = 100
        query.offset.return_value = query
        query.limit.return_value = query
        query.all.return_value = [1, 2, 3]
        pag = Paginator(limit=10, page=1)

        result = pag.get_page(query)

        assert result == [1, 2, 3]
        assert query.count.call_count == 1
        assert call(0) in query.offset.mock_calls
        assert call(10) in query.limit.mock_calls
    def test_invalid_page(self):
        """ It should raise an exception
        """
        query = Mock()
        query.count.return_value = 5
        query.offset.return_value = query
        query.limit.return_value = query
        query.all.return_value = [1, 2, 3]
        pag = Paginator(limit=10, page=2)

        with pytest.raises(InvalidParameterError) as expected:
            _ = pag.get_page(query)

        assert str(expected.value) == 'Invalid page'
        assert query.count.call_count == 1
        assert query.offset.call_count == 0
        assert query.limit.call_count == 0
    def test_none_next_page(self):
        """ Should return None in the next page if current page == total_pages
        """
        query = Mock()
        query.count.return_value = 100
        query.offset.return_value = query
        query.limit.return_value = query
        query.all.return_value = [1, 2, 3]
        pag = Paginator(limit=10, page=10)

        pag.get_page(query)
        info = pag.get_info()

        assert info['total_pages'] == 10
        assert info['total_number_of_items'] == 100
        assert info['current_page'] == 10
        assert info['previous_page'] == 9
        assert info['next_page'] is None
 def test_invalid_page_type(self):
     with pytest.raises(InvalidParameterError) as expected:
         Paginator(limit=10, page='aaa')
     assert str(expected.value) == 'Invalid page'
 def test_invalid_limit(self):
     with pytest.raises(InvalidParameterError) as expected:
         Paginator(limit=-1, page=1)
     assert str(expected.value) == 'Invalid limit'
    def test_init_a_paginator_with_none(self):
        pag = Paginator(limit=None, page=None)

        assert isinstance(pag, Paginator)
        assert pag._current == 1
        assert pag._limit == 20
    def test_init_a_paginator(self):
        pag = Paginator(limit=10, page=1)

        assert isinstance(pag, Paginator)