Bookmarks List Pagination
TNL-2490
This commit is contained in:
committed by
muzaffaryousaf
parent
4304c66c54
commit
fcbe595c8a
@@ -1,4 +1,4 @@
|
||||
<nav class="pagination pagination-full bottom" aria-label="Teams Pagination">
|
||||
<nav class="pagination pagination-full bottom" aria-label="Pagination">
|
||||
<div class="nav-item previous"><button class="nav-link previous-page-link"><i class="icon fa fa-angle-left" aria-hidden="true"></i> <span class="nav-label"><%= gettext("Previous") %></span></button></div>
|
||||
<div class="nav-item page">
|
||||
<div class="pagination-form">
|
||||
|
||||
@@ -15,6 +15,7 @@ class PaginatedUIMixin(object):
|
||||
PREVIOUS_PAGE_BUTTON_CSS = 'button.previous-page-link'
|
||||
PAGINATION_HEADER_TEXT_CSS = 'div.search-tools'
|
||||
CURRENT_PAGE_NUMBER_CSS = 'span.current-page'
|
||||
TOTAL_PAGES_CSS = 'span.total-pages'
|
||||
|
||||
def get_pagination_header_text(self):
|
||||
"""Return the text showing which items the user is currently viewing."""
|
||||
@@ -31,6 +32,11 @@ class PaginatedUIMixin(object):
|
||||
"""Return the the current page number."""
|
||||
return int(self.q(css=self.CURRENT_PAGE_NUMBER_CSS).text[0])
|
||||
|
||||
@property
|
||||
def get_total_pages(self):
|
||||
"""Returns the total page value"""
|
||||
return int(self.q(css=self.TOTAL_PAGES_CSS).text[0])
|
||||
|
||||
def go_to_page(self, page_number):
|
||||
"""Go to the given page_number in the paginated list results."""
|
||||
self.q(css=self.PAGE_NUMBER_INPUT_CSS).results[0].send_keys(unicode(page_number), Keys.ENTER)
|
||||
|
||||
@@ -3,9 +3,10 @@ Courseware Boomarks
|
||||
"""
|
||||
from bok_choy.promise import EmptyPromise
|
||||
from .course_page import CoursePage
|
||||
from ..common.paging import PaginatedUIMixin
|
||||
|
||||
|
||||
class BookmarksPage(CoursePage):
|
||||
class BookmarksPage(CoursePage, PaginatedUIMixin):
|
||||
"""
|
||||
Courseware Bookmarks Page.
|
||||
"""
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
"""
|
||||
End-to-end tests for the courseware unit bookmarks.
|
||||
"""
|
||||
|
||||
from ...pages.studio.auto_auth import AutoAuthPage
|
||||
import json
|
||||
import requests
|
||||
from ...pages.studio.auto_auth import AutoAuthPage as StudioAutoAuthPage
|
||||
from ...pages.lms.auto_auth import AutoAuthPage as LmsAutoAuthPage
|
||||
from ...pages.lms.bookmarks import BookmarksPage
|
||||
from ...pages.lms.courseware import CoursewarePage
|
||||
from ...pages.lms.course_nav import CourseNavPage
|
||||
from ...pages.studio.overview import CourseOutlinePage
|
||||
from ...pages.common.logout import LogoutPage
|
||||
from ...pages.common import BASE_URL
|
||||
|
||||
from ...fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
from ..helpers import EventsTestMixin, UniqueCourseTest, is_404_page
|
||||
@@ -78,6 +81,12 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
self.bookmarks_page = BookmarksPage(self.browser, self.course_id)
|
||||
self.course_nav = CourseNavPage(self.browser)
|
||||
|
||||
# Get session to be used for bookmarking units
|
||||
self.session = requests.Session()
|
||||
params = {'username': self.USERNAME, 'email': self.EMAIL, 'course_id': self.course_id}
|
||||
response = self.session.get(BASE_URL + "/auto_auth", params=params)
|
||||
self.assertTrue(response.ok, "Failed to get session")
|
||||
|
||||
def _test_setup(self, num_chapters=2):
|
||||
"""
|
||||
Setup test settings.
|
||||
@@ -88,29 +97,41 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
self.create_course_fixture(num_chapters)
|
||||
|
||||
# Auto-auth register for the course.
|
||||
AutoAuthPage(self.browser, username=self.USERNAME, email=self.EMAIL, course_id=self.course_id).visit()
|
||||
LmsAutoAuthPage(self.browser, username=self.USERNAME, email=self.EMAIL, course_id=self.course_id).visit()
|
||||
|
||||
self.courseware_page.visit()
|
||||
|
||||
def _bookmark_unit(self, index):
|
||||
def _bookmark_unit(self, location):
|
||||
"""
|
||||
Bookmark a unit
|
||||
|
||||
Arguments:
|
||||
index: unit index to bookmark
|
||||
location (str): unit location
|
||||
"""
|
||||
self.course_nav.go_to_section('TestSection{}'.format(index), 'TestSubsection{}'.format(index))
|
||||
self.courseware_page.click_bookmark_unit_button()
|
||||
_headers = {
|
||||
'Content-type': 'application/json',
|
||||
'X-CSRFToken': self.session.cookies['csrftoken'],
|
||||
}
|
||||
params = {'course_id': self.course_id}
|
||||
data = json.dumps({'usage_id': location})
|
||||
response = self.session.post(
|
||||
BASE_URL + '/api/bookmarks/v1/bookmarks/',
|
||||
data=data,
|
||||
params=params,
|
||||
headers=_headers
|
||||
)
|
||||
self.assertTrue(response.ok, "Failed to bookmark unit")
|
||||
|
||||
def _bookmark_units(self, num_units):
|
||||
"""
|
||||
Bookmark first `num_units` units by visiting them
|
||||
Bookmark first `num_units` units
|
||||
|
||||
Arguments:
|
||||
num_units(int): Number of units to bookmarks
|
||||
"""
|
||||
xblocks = self.course_fixture.get_nested_xblocks(category="vertical")
|
||||
for index in range(num_units):
|
||||
self._bookmark_unit(index)
|
||||
self._bookmark_unit(xblocks[index].locator)
|
||||
|
||||
def _breadcrumb(self, num_units):
|
||||
"""
|
||||
@@ -138,7 +159,7 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
|
||||
# Logout and login as staff
|
||||
LogoutPage(self.browser).visit()
|
||||
AutoAuthPage(
|
||||
StudioAutoAuthPage(
|
||||
self.browser, username=self.USERNAME, email=self.EMAIL, course_id=self.course_id, staff=True
|
||||
).visit()
|
||||
|
||||
@@ -150,7 +171,7 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
|
||||
# Logout and login as a student.
|
||||
LogoutPage(self.browser).visit()
|
||||
AutoAuthPage(self.browser, username=self.USERNAME, email=self.EMAIL, course_id=self.course_id).visit()
|
||||
LmsAutoAuthPage(self.browser, username=self.USERNAME, email=self.EMAIL, course_id=self.course_id).visit()
|
||||
|
||||
# Visit courseware as a student.
|
||||
self.courseware_page.visit()
|
||||
@@ -167,6 +188,25 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertEqual(self.bookmarks_page.count(), bookmarked_count)
|
||||
|
||||
def _verify_pagination_info(
|
||||
self,
|
||||
bookmark_count_on_current_page,
|
||||
header_text,
|
||||
previous_button_enabled,
|
||||
next_button_enabled,
|
||||
current_page_number,
|
||||
total_pages
|
||||
):
|
||||
"""
|
||||
Verify pagination info
|
||||
"""
|
||||
self.assertEqual(self.bookmarks_page.count(), bookmark_count_on_current_page)
|
||||
self.assertEqual(self.bookmarks_page.get_pagination_header_text(), header_text)
|
||||
self.assertEqual(self.bookmarks_page.is_previous_page_button_enabled(), previous_button_enabled)
|
||||
self.assertEqual(self.bookmarks_page.is_next_page_button_enabled(), next_button_enabled)
|
||||
self.assertEqual(self.bookmarks_page.get_current_page_number(), current_page_number)
|
||||
self.assertEqual(self.bookmarks_page.get_total_pages, total_pages)
|
||||
|
||||
def test_bookmark_button(self):
|
||||
"""
|
||||
Scenario: Bookmark unit button toggles correctly
|
||||
@@ -232,12 +272,18 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
self.assertEqual(self.bookmarks_page.results_header_text(), 'MY BOOKMARKS')
|
||||
self.assertEqual(self.bookmarks_page.count(), 2)
|
||||
|
||||
bookmarked_breadcrumbs = self.bookmarks_page.breadcrumbs()
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=2,
|
||||
header_text='Showing 1-2 out of 2 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=False,
|
||||
current_page_number=1,
|
||||
total_pages=1
|
||||
)
|
||||
|
||||
# Verify bookmarked breadcrumbs and bookmarks order (most recently bookmarked unit should come first)
|
||||
bookmarked_breadcrumbs = self.bookmarks_page.breadcrumbs()
|
||||
breadcrumbs = self._breadcrumb(2)
|
||||
breadcrumbs.reverse()
|
||||
self.assertEqual(bookmarked_breadcrumbs, breadcrumbs)
|
||||
self.assertItemsEqual(bookmarked_breadcrumbs, breadcrumbs)
|
||||
|
||||
# get usage ids for units
|
||||
xblocks = self.course_fixture.get_nested_xblocks(category="vertical")
|
||||
@@ -271,29 +317,216 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
self.assertEqual(self.bookmarks_page.count(), 2)
|
||||
|
||||
self.bookmarks_page.click_bookmarked_block(1)
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=2,
|
||||
header_text='Showing 1-2 out of 2 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=False,
|
||||
current_page_number=1,
|
||||
total_pages=1
|
||||
)
|
||||
|
||||
self.bookmarks_page.click_bookmarked_block(0)
|
||||
self.assertTrue(is_404_page(self.browser))
|
||||
|
||||
def test_page_size_limit(self):
|
||||
"""
|
||||
Scenario: We can get more bookmarks if page size is greater than default page size.
|
||||
Note:
|
||||
* Current Bookmarks API page_size value is 10.
|
||||
* page_size value in bookmarks client side is set to 500.
|
||||
Scenario: We can't get bookmarks more than default page size.
|
||||
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the units available
|
||||
And I have bookmarked all the 11 units available
|
||||
Then I click on Bookmarks button
|
||||
And I should see a bookmarked list
|
||||
And bookmark list contains 11 bookmarked items
|
||||
And bookmark list contains 10 bookmarked items
|
||||
"""
|
||||
self._test_setup(11)
|
||||
self._bookmark_units(11)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
self.assertEqual(self.bookmarks_page.count(), 11)
|
||||
self.assertEqual(self.bookmarks_page.count(), 10)
|
||||
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=10,
|
||||
header_text='Showing 1-10 out of 11 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=True,
|
||||
current_page_number=1,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
def test_pagination_with_single_page(self):
|
||||
"""
|
||||
Scenario: Bookmarks list pagination is working as expected for single page
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the 2 units available
|
||||
Then I click on Bookmarks button
|
||||
And I should see a bookmarked list with 2 bookmarked items
|
||||
And I should see paging header and footer with correct data
|
||||
And previous and next buttons are disabled
|
||||
"""
|
||||
self._test_setup(num_chapters=2)
|
||||
self._bookmark_units(num_units=2)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=2,
|
||||
header_text='Showing 1-2 out of 2 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=False,
|
||||
current_page_number=1,
|
||||
total_pages=1
|
||||
)
|
||||
|
||||
def test_next_page_button(self):
|
||||
"""
|
||||
Scenario: Next button is working as expected for bookmarks list pagination
|
||||
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the 12 units available
|
||||
|
||||
Then I click on Bookmarks button
|
||||
And I should see a bookmarked list of 10 items
|
||||
And I should see paging header and footer with correct info
|
||||
|
||||
Then I click on next page button in footer
|
||||
And I should be navigated to second page
|
||||
And I should see a bookmarked list with 2 items
|
||||
And I should see paging header and footer with correct info
|
||||
"""
|
||||
self._test_setup(num_chapters=12)
|
||||
self._bookmark_units(num_units=12)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=10,
|
||||
header_text='Showing 1-10 out of 12 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=True,
|
||||
current_page_number=1,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
self.bookmarks_page.press_next_page_button()
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=2,
|
||||
header_text='Showing 11-12 out of 12 total',
|
||||
previous_button_enabled=True,
|
||||
next_button_enabled=False,
|
||||
current_page_number=2,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
def test_previous_page_button(self):
|
||||
"""
|
||||
Scenario: Previous button is working as expected for bookmarks list pagination
|
||||
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the 12 units available
|
||||
And I click on Bookmarks button
|
||||
|
||||
Then I click on next page button in footer
|
||||
And I should be navigated to second page
|
||||
And I should see a bookmarked list with 2 items
|
||||
And I should see paging header and footer with correct info
|
||||
|
||||
Then I click on previous page button
|
||||
And I should be navigated to first page
|
||||
And I should see paging header and footer with correct info
|
||||
"""
|
||||
self._test_setup(num_chapters=12)
|
||||
self._bookmark_units(num_units=12)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
|
||||
self.bookmarks_page.press_next_page_button()
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=2,
|
||||
header_text='Showing 11-12 out of 12 total',
|
||||
previous_button_enabled=True,
|
||||
next_button_enabled=False,
|
||||
current_page_number=2,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
self.bookmarks_page.press_previous_page_button()
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=10,
|
||||
header_text='Showing 1-10 out of 12 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=True,
|
||||
current_page_number=1,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
def test_pagination_with_valid_page_number(self):
|
||||
"""
|
||||
Scenario: Bookmarks list pagination works as expected for valid page number
|
||||
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the 12 units available
|
||||
|
||||
Then I click on Bookmarks button
|
||||
And I should see a bookmarked list
|
||||
And I should see total page value is 2
|
||||
Then I enter 2 in the page number input
|
||||
And I should be navigated to page 2
|
||||
"""
|
||||
self._test_setup(num_chapters=11)
|
||||
self._bookmark_units(num_units=11)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
self.assertEqual(self.bookmarks_page.get_total_pages, 2)
|
||||
|
||||
self.bookmarks_page.go_to_page(2)
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=1,
|
||||
header_text='Showing 11-11 out of 11 total',
|
||||
previous_button_enabled=True,
|
||||
next_button_enabled=False,
|
||||
current_page_number=2,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
def test_pagination_with_invalid_page_number(self):
|
||||
"""
|
||||
Scenario: Bookmarks list pagination works as expected for invalid page number
|
||||
|
||||
Given that I am a registered user
|
||||
And I visit my courseware page
|
||||
And I have bookmarked all the 11 units available
|
||||
Then I click on Bookmarks button
|
||||
And I should see a bookmarked list
|
||||
And I should see total page value is 2
|
||||
Then I enter 3 in the page number input
|
||||
And I should stay at page 1
|
||||
"""
|
||||
self._test_setup(num_chapters=11)
|
||||
self._bookmark_units(num_units=11)
|
||||
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
self.assertTrue(self.bookmarks_page.results_present())
|
||||
self.assertEqual(self.bookmarks_page.get_total_pages, 2)
|
||||
|
||||
self.bookmarks_page.go_to_page(3)
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=10,
|
||||
header_text='Showing 1-10 out of 11 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=True,
|
||||
current_page_number=1,
|
||||
total_pages=2
|
||||
)
|
||||
|
||||
def test_bookmarked_unit_accessed_event(self):
|
||||
"""
|
||||
@@ -319,7 +552,17 @@ class BookmarksTest(BookmarksTestMixin):
|
||||
}
|
||||
}
|
||||
]
|
||||
self._bookmark_unit(0)
|
||||
self._bookmark_units(num_units=1)
|
||||
self.bookmarks_page.click_bookmarks_button()
|
||||
|
||||
self._verify_pagination_info(
|
||||
bookmark_count_on_current_page=1,
|
||||
header_text='Showing 1 out of 1 total',
|
||||
previous_button_enabled=False,
|
||||
next_button_enabled=False,
|
||||
current_page_number=1,
|
||||
total_pages=1
|
||||
)
|
||||
|
||||
self.bookmarks_page.click_bookmarked_block(0)
|
||||
self.verify_event_data('edx.bookmark.accessed', event_data)
|
||||
|
||||
Reference in New Issue
Block a user