Commit e889b9b8 by E. Kolpakov

Fixed tests and improved floaitng format output

parent e2f8c7ad
......@@ -30,6 +30,7 @@ import ast
import json
import logging
import operator as op
from django.template.defaultfilters import floatformat
from .dashboard_visual import DashboardVisualData
from .mcq import MCQBlock
......@@ -414,7 +415,9 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
average_value = sum(numeric_values) / len(numeric_values)
block['average'] = average_value
# average block is shown only if average value exists, so accessible text for no data is not required
block['accessible_average'] = _("Score: {average_value:.2f}").format(average_value=average_value)
block['accessible_average'] = _("Score: {average_value}").format(
average_value=floatformat(average_value)
)
block['average_label'] = self.average_labels.get(mentoring_block.url_name, _("Average"))
block['has_average'] = True
block['average_color'] = self.color_for_value(average_value)
......
......@@ -18,7 +18,9 @@
# "AGPLv3". If not, see <http://www.gnu.org/licenses/>.
#
from textwrap import dedent
from django.template.defaultfilters import floatformat
from mock import Mock, patch
from selenium.common.exceptions import NoSuchElementException
from xblockutils.base_test import SeleniumXBlockTest
from xblockutils.resources import ResourceLoader
......@@ -112,6 +114,22 @@ class TestDashboardBlock(SeleniumXBlockTest):
self.go_to_view("student_view")
self.vertical = self.load_root_xblock()
def _get_cell_contents(self, cell):
try:
visible_text = cell.find_element_by_css_selector('span:not(.sr)').text
except NoSuchElementException:
visible_text = ""
screen_reader_text = cell.find_element_by_css_selector('span.sr')
return visible_text, screen_reader_text.text
def _assert_cell_contents(self, cell, expected_visible_text, expected_screen_reader_text):
visible_text, screen_reader_text = self._get_cell_contents(cell)
self.assertEqual(visible_text, expected_visible_text)
self.assertEqual(screen_reader_text, expected_screen_reader_text)
def _format_sr_text(self, visible_text):
return "Score: {value}".format(value=visible_text)
def test_empty_dashboard(self):
"""
Test that when the student has not submitted any question answers, we still see
......@@ -129,8 +147,8 @@ class TestDashboardBlock(SeleniumXBlockTest):
mcq_rows = step.find_elements_by_css_selector('tr')
self.assertTrue(2 <= len(mcq_rows) <= 3)
for mcq in mcq_rows:
value = mcq.find_element_by_css_selector('td:last-child')
self.assertEqual(value.text, '')
cell = mcq.find_element_by_css_selector('td:last-child')
self._assert_cell_contents(cell, '', 'No value yet')
def _set_mentoring_values(self):
pbs = self.browser.find_elements_by_css_selector('.mentoring')
......@@ -155,20 +173,23 @@ class TestDashboardBlock(SeleniumXBlockTest):
dashboard = self.browser.find_element_by_css_selector('.pb-dashboard')
steps = dashboard.find_elements_by_css_selector('tbody')
self.assertEqual(len(steps), 3)
expected_values = ('1', '2', '3', '4', 'B')
for step_num, step in enumerate(steps):
mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)')
self.assertTrue(2 <= len(mcq_rows) <= 3)
for mcq in mcq_rows:
value = mcq.find_element_by_css_selector('td.value')
self.assertIn(value.text, ('1', '2', '3', '4', 'B'))
cell = mcq.find_element_by_css_selector('td.value')
visible_text, screen_reader_text = self._get_cell_contents(cell)
self.assertIn(visible_text, expected_values)
self.assertIn(screen_reader_text, map(self._format_sr_text, expected_values))
# Check the average:
avg_row = step.find_element_by_css_selector('tr.avg-row')
left_col = avg_row.find_element_by_css_selector('.desc')
self.assertEqual(left_col.text, "Average")
right_col = avg_row.find_element_by_css_selector('.value')
expected_average = {0: "2", 1: "3", 2: "1"}[step_num]
self.assertEqual(right_col.text, expected_average)
self._assert_cell_contents(right_col, expected_average, self._format_sr_text(expected_average))
def test_dashboard_alternative(self):
"""
......@@ -189,18 +210,25 @@ class TestDashboardBlock(SeleniumXBlockTest):
average_labels = ["Avg.", "Mean", "Second Quartile"]
expected_values = ('1', '2', '3', '4', 'B')
for step_num, step in enumerate(steps):
mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)')
self.assertTrue(2 <= len(mcq_rows) <= 3)
for mcq in mcq_rows:
value = mcq.find_element_by_css_selector('td.value')
self.assertEqual(value.text, '')
cell = mcq.find_element_by_css_selector('td.value')
visible_text, screen_reader_text = self._get_cell_contents(cell)
# this dashboard configured to not show numbers
self.assertEqual(visible_text, '')
# but screen reader content still added
self.assertIn(screen_reader_text, map(self._format_sr_text, expected_values))
# Check the average:
avg_row = step.find_element_by_css_selector('tr.avg-row')
left_col = avg_row.find_element_by_css_selector('.desc')
self.assertEqual(left_col.text, average_labels[step_num])
right_col = avg_row.find_element_by_css_selector('.value')
self.assertEqual(right_col.text, "")
expected_average = {0: "2", 1: "3", 2: "1"}[step_num]
self._assert_cell_contents(right_col, '', self._format_sr_text(expected_average))
def test_dashboard_exclude_questions(self):
"""
......@@ -214,6 +242,7 @@ class TestDashboardBlock(SeleniumXBlockTest):
dashboard = self.browser.find_element_by_css_selector('.pb-dashboard')
steps = dashboard.find_elements_by_css_selector('tbody')
self.assertEqual(len(steps), 3)
expected_values = ('1', '2', '3', '4')
lengths = [1, 2, 1]
......@@ -221,15 +250,17 @@ class TestDashboardBlock(SeleniumXBlockTest):
mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)')
self.assertEqual(len(mcq_rows), lengths[step_num])
for mcq in mcq_rows:
value = mcq.find_element_by_css_selector('td.value')
self.assertIn(value.text, ('1', '2', '3', '4'))
cell = mcq.find_element_by_css_selector('td.value')
visible_text, screen_reader_text = self._get_cell_contents(cell)
self.assertIn(visible_text, expected_values)
self.assertIn(screen_reader_text, map(self._format_sr_text, expected_values))
# Check the average:
avg_row = step.find_element_by_css_selector('tr.avg-row')
left_col = avg_row.find_element_by_css_selector('.desc')
self.assertEqual(left_col.text, "Average")
right_col = avg_row.find_element_by_css_selector('.value')
expected_average = {0: "1", 1: "3", 2: "1"}[step_num]
self.assertEqual(right_col.text, expected_average)
self._assert_cell_contents(right_col, expected_average, self._format_sr_text(expected_average))
def test_dashboard_malformed_exclude_questions(self):
"""
......@@ -244,18 +275,22 @@ class TestDashboardBlock(SeleniumXBlockTest):
steps = dashboard.find_elements_by_css_selector('tbody')
self.assertEqual(len(steps), 3)
expected_values = ('1', '2', '3', '4')
lengths = [3, 2, 1]
for step_num, step in enumerate(steps):
mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)')
self.assertEqual(len(mcq_rows), lengths[step_num])
for mcq in mcq_rows:
value = mcq.find_element_by_css_selector('td.value')
self.assertIn(value.text, ('1', '2', '3', '4'))
cell = mcq.find_element_by_css_selector('td.value')
visible_text, screen_reader_text = self._get_cell_contents(cell)
self.assertIn(visible_text, expected_values)
self.assertIn(screen_reader_text, map(self._format_sr_text, expected_values))
# Check the average:
avg_row = step.find_element_by_css_selector('tr.avg-row')
left_col = avg_row.find_element_by_css_selector('.desc')
self.assertEqual(left_col.text, "Average")
right_col = avg_row.find_element_by_css_selector('.value')
expected_average = {0: "2", 1: "3", 2: "1"}[step_num]
self.assertEqual(right_col.text, expected_average)
self._assert_cell_contents(right_col, expected_average, self._format_sr_text(expected_average))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment