Commit 05527093 by Tim Krones

Ensure default theme is used if theme has not been customized.

parent d754b299
...@@ -59,11 +59,6 @@ except ImportError: ...@@ -59,11 +59,6 @@ except ImportError:
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
loader = ResourceLoader(__name__) loader = ResourceLoader(__name__)
_default_theme_config = {
'package': 'problem_builder',
'locations': ['public/themes/lms.css']
}
_default_options_config = { _default_options_config = {
'pb_mcq_hide_previous_answer': False 'pb_mcq_hide_previous_answer': False
} }
...@@ -126,9 +121,13 @@ class BaseMentoringBlock( ...@@ -126,9 +121,13 @@ class BaseMentoringBlock(
icon_class = 'problem' icon_class = 'problem'
block_settings_key = 'mentoring' block_settings_key = 'mentoring'
theme_key = 'theme'
options_key = 'options' options_key = 'options'
default_theme_config = {
'package': 'problem_builder',
'locations': ['public/themes/lms.css']
}
@property @property
def url_name(self): def url_name(self):
""" """
...@@ -170,7 +169,7 @@ class BaseMentoringBlock( ...@@ -170,7 +169,7 @@ class BaseMentoringBlock(
Fall back on default options if xblock settings have not been customized at all Fall back on default options if xblock settings have not been customized at all
or no customizations for options available. or no customizations for options available.
""" """
xblock_settings = self.get_xblock_settings(_default_options_config) xblock_settings = self.get_xblock_settings(default={})
if xblock_settings and self.options_key in xblock_settings: if xblock_settings and self.options_key in xblock_settings:
return xblock_settings[self.options_key] return xblock_settings[self.options_key]
return _default_options_config return _default_options_config
......
...@@ -7,9 +7,7 @@ from random import random ...@@ -7,9 +7,7 @@ from random import random
from xblock.field_data import DictFieldData from xblock.field_data import DictFieldData
from problem_builder.mcq import MCQBlock from problem_builder.mcq import MCQBlock
from problem_builder.mentoring import ( from problem_builder.mentoring import MentoringBlock, MentoringMessageBlock, _default_options_config
MentoringBlock, MentoringMessageBlock, _default_theme_config, _default_options_config
)
@ddt.ddt @ddt.ddt
...@@ -69,6 +67,7 @@ class TestMentoringBlock(unittest.TestCase): ...@@ -69,6 +67,7 @@ class TestMentoringBlock(unittest.TestCase):
self.assertIn('Unable to load child component', fragment.content) self.assertIn('Unable to load child component', fragment.content)
@ddt.ddt
class TestMentoringBlockTheming(unittest.TestCase): class TestMentoringBlockTheming(unittest.TestCase):
def setUp(self): def setUp(self):
self.service_mock = Mock() self.service_mock = Mock()
...@@ -76,6 +75,70 @@ class TestMentoringBlockTheming(unittest.TestCase): ...@@ -76,6 +75,70 @@ class TestMentoringBlockTheming(unittest.TestCase):
self.runtime_mock.service = Mock(return_value=self.service_mock) self.runtime_mock.service = Mock(return_value=self.service_mock)
self.block = MentoringBlock(self.runtime_mock, DictFieldData({}), Mock()) self.block = MentoringBlock(self.runtime_mock, DictFieldData({}), Mock())
def test_get_theme_returns_default_if_settings_service_is_not_available(self):
self.runtime_mock.service = Mock(return_value=None)
theme = self.block.get_theme()
# Ensure MentoringBlock overrides "default_theme_config" from ThemableXBlockMixin with meaningful value:
self.assertIsNotNone(theme)
self.assertEqual(theme, MentoringBlock.default_theme_config)
def test_get_theme_returns_default_if_xblock_settings_not_customized(self):
self.block.get_xblock_settings = Mock(return_value=None)
theme = self.block.get_theme()
# Ensure MentoringBlock overrides "default_theme_config" from ThemableXBlockMixin with meaningful value:
self.assertIsNotNone(theme)
self.assertEqual(theme, MentoringBlock.default_theme_config)
self.block.get_xblock_settings.assert_called_once_with(default={})
@ddt.data(
{}, {'mass': 123}, {'spin': {}}, {'parity': "1"}
)
def test_get_theme_returns_default_if_theme_not_customized(self, xblock_settings):
self.block.get_xblock_settings = Mock(return_value=xblock_settings)
theme = self.block.get_theme()
# Ensure MentoringBlock overrides "default_theme_config" from ThemableXBlockMixin with meaningful value:
self.assertIsNotNone(theme)
self.assertEqual(theme, MentoringBlock.default_theme_config)
self.block.get_xblock_settings.assert_called_once_with(default={})
@ddt.data(
{MentoringBlock.theme_key: 123},
{MentoringBlock.theme_key: [1, 2, 3]},
{MentoringBlock.theme_key: {'package': 'qwerty', 'locations': ['something_else.css']}},
)
def test_get_theme_correctly_returns_customized_theme(self, xblock_settings):
self.block.get_xblock_settings = Mock(return_value=xblock_settings)
theme = self.block.get_theme()
# Ensure MentoringBlock overrides "default_theme_config" from ThemableXBlockMixin with meaningful value:
self.assertIsNotNone(theme)
self.assertEqual(theme, xblock_settings[MentoringBlock.theme_key])
self.block.get_xblock_settings.assert_called_once_with(default={})
def test_theme_files_are_loaded_from_correct_package(self):
fragment = MagicMock()
package_name = 'some_package'
xblock_settings = {MentoringBlock.theme_key: {'package': package_name, 'locations': ['lms.css']}}
self.block.get_xblock_settings = Mock(return_value=xblock_settings)
with patch("xblockutils.settings.ResourceLoader") as patched_resource_loader:
self.block.include_theme_files(fragment)
patched_resource_loader.assert_called_with(package_name)
@ddt.data(
('problem_builder', ['public/themes/lms.css']),
('problem_builder', ['public/themes/lms.css', 'public/themes/lms.part2.css']),
('my_app.my_rules', ['typography.css', 'icons.css']),
)
@ddt.unpack
def test_theme_files_are_added_to_fragment(self, package_name, locations):
fragment = MagicMock()
xblock_settings = {MentoringBlock.theme_key: {'package': package_name, 'locations': locations}}
self.block.get_xblock_settings = Mock(return_value=xblock_settings)
with patch("xblockutils.settings.ResourceLoader.load_unicode") as patched_load_unicode:
self.block.include_theme_files(fragment)
for location in locations:
patched_load_unicode.assert_any_call(location)
self.assertEqual(patched_load_unicode.call_count, len(locations))
def test_student_view_calls_include_theme_files(self): def test_student_view_calls_include_theme_files(self):
self.service_mock.get_settings_bucket = Mock(return_value={}) self.service_mock.get_settings_bucket = Mock(return_value={})
with patch.object(self.block, 'include_theme_files') as patched_include_theme_files: with patch.object(self.block, 'include_theme_files') as patched_include_theme_files:
...@@ -97,10 +160,14 @@ class TestMentoringBlockOptions(unittest.TestCase): ...@@ -97,10 +160,14 @@ class TestMentoringBlockOptions(unittest.TestCase):
self.runtime_mock.service = Mock(return_value=self.service_mock) self.runtime_mock.service = Mock(return_value=self.service_mock)
self.block = MentoringBlock(self.runtime_mock, DictFieldData({}), Mock()) self.block = MentoringBlock(self.runtime_mock, DictFieldData({}), Mock())
def test_get_options_returns_default_if_settings_service_is_not_available(self):
self.runtime_mock.service = Mock(return_value=None)
self.assertEqual(self.block.get_options(), _default_options_config)
def test_get_options_returns_default_if_xblock_settings_not_customized(self): def test_get_options_returns_default_if_xblock_settings_not_customized(self):
self.block.get_xblock_settings = Mock(return_value=None) self.block.get_xblock_settings = Mock(return_value=None)
self.assertEqual(self.block.get_options(), _default_options_config) self.assertEqual(self.block.get_options(), _default_options_config)
self.block.get_xblock_settings.assert_called_once_with(_default_options_config) self.block.get_xblock_settings.assert_called_once_with(default={})
@ddt.data( @ddt.data(
{}, {'mass': 123}, {'spin': {}}, {'parity': "1"} {}, {'mass': 123}, {'spin': {}}, {'parity': "1"}
...@@ -108,7 +175,7 @@ class TestMentoringBlockOptions(unittest.TestCase): ...@@ -108,7 +175,7 @@ class TestMentoringBlockOptions(unittest.TestCase):
def test_get_options_returns_default_if_options_not_customized(self, xblock_settings): def test_get_options_returns_default_if_options_not_customized(self, xblock_settings):
self.block.get_xblock_settings = Mock(return_value=xblock_settings) self.block.get_xblock_settings = Mock(return_value=xblock_settings)
self.assertEqual(self.block.get_options(), _default_options_config) self.assertEqual(self.block.get_options(), _default_options_config)
self.block.get_xblock_settings.assert_called_once_with(_default_options_config) self.block.get_xblock_settings.assert_called_once_with(default={})
@ddt.data( @ddt.data(
{MentoringBlock.options_key: 123}, {MentoringBlock.options_key: 123},
...@@ -118,7 +185,7 @@ class TestMentoringBlockOptions(unittest.TestCase): ...@@ -118,7 +185,7 @@ class TestMentoringBlockOptions(unittest.TestCase):
def test_get_options_correctly_returns_customized_options(self, xblock_settings): def test_get_options_correctly_returns_customized_options(self, xblock_settings):
self.block.get_xblock_settings = Mock(return_value=xblock_settings) self.block.get_xblock_settings = Mock(return_value=xblock_settings)
self.assertEqual(self.block.get_options(), xblock_settings[MentoringBlock.options_key]) self.assertEqual(self.block.get_options(), xblock_settings[MentoringBlock.options_key])
self.block.get_xblock_settings.assert_called_once_with(_default_options_config) self.block.get_xblock_settings.assert_called_once_with(default={})
def test_get_option(self): def test_get_option(self):
random_key, random_value = random(), random() random_key, random_value = random(), random()
......
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