Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
problem-builder
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
problem-builder
Commits
c7fd48a0
Commit
c7fd48a0
authored
Jul 14, 2015
by
Tim Krones
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add integration tests for pagination.
parent
6ee520a0
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
204 additions
and
17 deletions
+204
-17
problem_builder/public/js/student_answers_dashboard.js
+19
-8
problem_builder/tests/integration/test_student_answers_dashboard.py
+185
-9
No files found.
problem_builder/public/js/student_answers_dashboard.js
View file @
c7fd48a0
...
...
@@ -18,9 +18,16 @@ function StudentAnswersDashboardBlock(runtime, element) {
model
:
Result
,
getCurrentPage
:
function
()
{
getCurrentPage
:
function
(
object
)
{
var
currentPage
=
this
.
state
.
currentPage
;
return
this
.
getPage
(
currentPage
);
if
(
object
)
{
return
this
.
getPage
(
currentPage
);
}
return
currentPage
;
},
getTotalPages
:
function
()
{
return
this
.
state
.
totalPages
;
}
});
...
...
@@ -28,9 +35,9 @@ function StudentAnswersDashboardBlock(runtime, element) {
var
ResultsView
=
Backbone
.
View
.
extend
({
render
:
function
()
{
this
.
_insertRecords
(
this
.
collection
.
getCurrentPage
());
this
.
_insertRecords
(
this
.
collection
.
getCurrentPage
(
true
));
this
.
_updateControls
();
this
.
$
(
'#total-pages'
).
text
(
this
.
collection
.
state
.
totalPages
);
this
.
$
(
'#total-pages'
).
text
(
this
.
collection
.
getTotalPages
()
||
0
);
return
this
;
},
...
...
@@ -47,7 +54,11 @@ function StudentAnswersDashboardBlock(runtime, element) {
});
tbody
.
append
(
row
);
},
this
);
this
.
$
(
'#current-page'
).
text
(
this
.
collection
.
state
.
currentPage
);
if
(
this
.
collection
.
getTotalPages
())
{
this
.
$
(
'#current-page'
).
text
(
this
.
collection
.
getCurrentPage
());
}
else
{
this
.
$
(
'#current-page'
).
text
(
0
);
}
},
events
:
{
...
...
@@ -82,8 +93,8 @@ function StudentAnswersDashboardBlock(runtime, element) {
},
_updateControls
:
function
()
{
var
currentPage
=
this
.
collection
.
state
.
currentPage
,
totalPages
=
this
.
collection
.
state
.
totalPages
,
var
currentPage
=
this
.
collection
.
getCurrentPage
()
,
totalPages
=
this
.
collection
.
getTotalPages
()
,
firstPage
=
'#first-page'
,
prevPage
=
'#prev-page'
,
nextPage
=
'#next-page'
,
...
...
@@ -91,7 +102,7 @@ function StudentAnswersDashboardBlock(runtime, element) {
all
=
[
firstPage
,
prevPage
,
nextPage
,
lastPage
],
backward
=
[
firstPage
,
prevPage
],
forward
=
[
nextPage
,
lastPage
];
if
(
totalPages
===
1
)
{
if
(
!
totalPages
||
totalPages
===
1
)
{
this
.
_disable
(
all
);
}
else
{
if
(
currentPage
===
1
)
{
...
...
problem_builder/tests/integration/test_student_answers_dashboard.py
View file @
c7fd48a0
# -*- coding: utf-8 -*-
import
re
import
time
from
mock
import
patch
,
Mock
...
...
@@ -12,7 +13,7 @@ from problem_builder.student_answers_dashboard import StudentAnswersDashboardBlo
class
MockTasksModule
(
object
):
"""Mock for the tasks module, which can only be meaningfully import in the LMS."""
def
__init__
(
self
,
successful
=
True
):
def
__init__
(
self
,
successful
=
True
,
display_data
=
[]
):
self
.
export_data
=
Mock
()
async_result
=
self
.
export_data
.
async_result
async_result
.
ready
.
side_effect
=
[
False
,
False
,
True
,
True
]
...
...
@@ -24,10 +25,7 @@ class MockTasksModule(object):
report_filename
=
'/file/report.csv'
,
start_timestamp
=
time
.
time
(),
generation_time_s
=
23.4
,
display_data
=
[[
'Test section'
,
'Test subsection'
,
'Test unit'
,
'Test type'
,
'Test question'
,
'Test answer'
,
'Test username'
]]
display_data
=
display_data
)
else
:
async_result
.
result
=
'error'
...
...
@@ -58,6 +56,7 @@ class StudentAnswersDashboardTest(SeleniumXBlockTest):
data_export
=
self
.
go_to_view
()
self
.
assertIn
(
'This interface can only be used by course staff.'
,
data_export
.
text
)
@patch.dict
(
'sys.modules'
,
{
'problem_builder.tasks'
:
MockTasksModule
(
successful
=
True
),
'instructor_task'
:
True
,
...
...
@@ -88,14 +87,15 @@ class StudentAnswersDashboardTest(SeleniumXBlockTest):
self
.
wait_until_visible
(
download_button
)
self
.
wait_until_hidden
(
cancel_button
)
self
.
wait_until_visible
(
delete_button
)
for
co
ntents
in
[
'
Test section'
,
'Test subsection'
,
'Test u
nit'
,
'T
est type'
,
'Test question'
,
'Test answer'
,
'Test u
sername'
for
co
lumn
in
[
'
Section'
,
'Subsection'
,
'U
nit'
,
'T
ype'
,
'Question'
,
'Answer'
,
'U
sername'
]:
self
.
assertIn
(
co
ntents
,
result_block
.
text
)
self
.
assertIn
(
co
lumn
,
result_block
.
text
)
self
.
assertIn
(
'Results retrieved on'
,
info_area
.
text
)
self
.
assertEqual
(
''
,
status_area
.
text
)
@patch.dict
(
'sys.modules'
,
{
'problem_builder.tasks'
:
MockTasksModule
(
successful
=
False
),
'instructor_task'
:
True
,
...
...
@@ -128,6 +128,182 @@ class StudentAnswersDashboardTest(SeleniumXBlockTest):
self
.
assertEqual
(
''
,
info_area
.
text
)
self
.
assertIn
(
'Data export failed. Reason:'
,
status_area
.
text
)
@patch.dict
(
'sys.modules'
,
{
'problem_builder.tasks'
:
MockTasksModule
(
successful
=
True
),
'instructor_task'
:
True
,
'instructor_task.models'
:
MockInstructorTaskModelsModule
(),
})
@patch.object
(
StudentAnswersDashboardBlock
,
'user_is_staff'
,
Mock
(
return_value
=
True
))
def
test_pagination_no_results
(
self
):
student_answers_dashboard
=
self
.
go_to_view
()
start_button
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-start'
)
result_block
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-results'
)
first_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'first-page'
)
prev_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'prev-page'
)
next_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'next-page'
)
last_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'last-page'
)
current_page_info
=
student_answers_dashboard
.
find_element_by_id
(
'current-page'
)
total_pages_info
=
student_answers_dashboard
.
find_element_by_id
(
'total-pages'
)
start_button
.
click
()
self
.
wait_until_visible
(
result_block
)
self
.
assertFalse
(
first_page_button
.
is_enabled
())
self
.
assertFalse
(
prev_page_button
.
is_enabled
())
self
.
assertFalse
(
next_page_button
.
is_enabled
())
self
.
assertFalse
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'0'
,
current_page_info
.
text
)
self
.
assertEqual
(
'0'
,
total_pages_info
.
text
)
@patch.dict
(
'sys.modules'
,
{
'problem_builder.tasks'
:
MockTasksModule
(
successful
=
True
,
display_data
=
[[
'Test section'
,
'Test subsection'
,
'Test unit'
,
'Test type'
,
'Test question'
,
'Test answer'
,
'Test username'
]]),
'instructor_task'
:
True
,
'instructor_task.models'
:
MockInstructorTaskModelsModule
(),
})
@patch.object
(
StudentAnswersDashboardBlock
,
'user_is_staff'
,
Mock
(
return_value
=
True
))
def
test_pagination_single_result
(
self
):
student_answers_dashboard
=
self
.
go_to_view
()
start_button
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-start'
)
result_block
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-results'
)
first_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'first-page'
)
prev_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'prev-page'
)
next_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'next-page'
)
last_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'last-page'
)
current_page_info
=
student_answers_dashboard
.
find_element_by_id
(
'current-page'
)
total_pages_info
=
student_answers_dashboard
.
find_element_by_id
(
'total-pages'
)
start_button
.
click
()
self
.
wait_until_visible
(
result_block
)
for
contents
in
[
'Test section'
,
'Test subsection'
,
'Test unit'
,
'Test type'
,
'Test question'
,
'Test answer'
,
'Test username'
]:
self
.
assertIn
(
contents
,
result_block
.
text
)
self
.
assertFalse
(
first_page_button
.
is_enabled
())
self
.
assertFalse
(
prev_page_button
.
is_enabled
())
self
.
assertFalse
(
next_page_button
.
is_enabled
())
self
.
assertFalse
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'1'
,
current_page_info
.
text
)
self
.
assertEqual
(
'1'
,
total_pages_info
.
text
)
@patch.dict
(
'sys.modules'
,
{
'problem_builder.tasks'
:
MockTasksModule
(
successful
=
True
,
display_data
=
[[
'Test section'
,
'Test subsection'
,
'Test unit'
,
'Test type'
,
'Test question'
,
'Test answer'
,
'Test username'
]
for
r
in
range
(
45
)]),
'instructor_task'
:
True
,
'instructor_task.models'
:
MockInstructorTaskModelsModule
(),
})
@patch.object
(
StudentAnswersDashboardBlock
,
'user_is_staff'
,
Mock
(
return_value
=
True
))
def
test_pagination_multiple_results
(
self
):
student_answers_dashboard
=
self
.
go_to_view
()
start_button
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-start'
)
result_block
=
student_answers_dashboard
.
find_element_by_class_name
(
'data-export-results'
)
first_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'first-page'
)
prev_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'prev-page'
)
next_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'next-page'
)
last_page_button
=
student_answers_dashboard
.
find_element_by_id
(
'last-page'
)
current_page_info
=
student_answers_dashboard
.
find_element_by_id
(
'current-page'
)
total_pages_info
=
student_answers_dashboard
.
find_element_by_id
(
'total-pages'
)
start_button
.
click
()
self
.
wait_until_visible
(
result_block
)
for
contents
in
[
'Test section'
,
'Test subsection'
,
'Test unit'
,
'Test type'
,
'Test question'
,
'Test answer'
,
'Test username'
]:
occurrences
=
re
.
findall
(
contents
,
result_block
.
text
)
self
.
assertEqual
(
len
(
occurrences
),
15
)
self
.
assertFalse
(
first_page_button
.
is_enabled
())
self
.
assertFalse
(
prev_page_button
.
is_enabled
())
self
.
assertTrue
(
next_page_button
.
is_enabled
())
self
.
assertTrue
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'1'
,
current_page_info
.
text
)
self
.
assertEqual
(
'3'
,
total_pages_info
.
text
)
# Test behavior of pagination controls
# - "Next" button
next_page_button
.
click
()
# Navigate to second page
self
.
assertTrue
(
first_page_button
.
is_enabled
())
self
.
assertTrue
(
prev_page_button
.
is_enabled
())
self
.
assertTrue
(
next_page_button
.
is_enabled
())
self
.
assertTrue
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'2'
,
current_page_info
.
text
)
next_page_button
.
click
()
# Navigate to third page
self
.
assertTrue
(
first_page_button
.
is_enabled
())
self
.
assertTrue
(
prev_page_button
.
is_enabled
())
self
.
assertFalse
(
next_page_button
.
is_enabled
())
self
.
assertFalse
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'3'
,
current_page_info
.
text
)
# - "Prev" button
prev_page_button
.
click
()
# Navigate to second page
self
.
assertTrue
(
first_page_button
.
is_enabled
())
self
.
assertTrue
(
prev_page_button
.
is_enabled
())
self
.
assertTrue
(
next_page_button
.
is_enabled
())
self
.
assertTrue
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'2'
,
current_page_info
.
text
)
prev_page_button
.
click
()
# Navigate to first page
self
.
assertFalse
(
first_page_button
.
is_enabled
())
self
.
assertFalse
(
prev_page_button
.
is_enabled
())
self
.
assertTrue
(
next_page_button
.
is_enabled
())
self
.
assertTrue
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'1'
,
current_page_info
.
text
)
# - "Last" button
last_page_button
.
click
()
# Navigate to last page
self
.
assertTrue
(
first_page_button
.
is_enabled
())
self
.
assertTrue
(
prev_page_button
.
is_enabled
())
self
.
assertFalse
(
next_page_button
.
is_enabled
())
self
.
assertFalse
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'3'
,
current_page_info
.
text
)
# - "First" button
first_page_button
.
click
()
# Navigate to first page
self
.
assertFalse
(
first_page_button
.
is_enabled
())
self
.
assertFalse
(
prev_page_button
.
is_enabled
())
self
.
assertTrue
(
next_page_button
.
is_enabled
())
self
.
assertTrue
(
last_page_button
.
is_enabled
())
self
.
assertEqual
(
'1'
,
current_page_info
.
text
)
def
test_non_staff_disabled
(
self
):
student_answers_dashboard
=
self
.
go_to_view
()
self
.
assertRaises
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment