class TestMentoringBlockTheming(unittest.TestCase):
    def setUp(self):
        self.service_mock = Mock()
        self.runtime_mock = Mock()
        self.runtime_mock.service = Mock(return_value=self.service_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):
        self.block.get_xblock_settings = Mock(return_value={})
        with patch.object(
                self.block,
                'include_theme_files') as patched_include_theme_files:
            fragment = self.block.student_view({})
            patched_include_theme_files.assert_called_with(fragment)

    def test_author_preview_view_calls_include_theme_files(self):
        self.block.get_xblock_settings = Mock(return_value={})
        with patch.object(
                self.block,
                'include_theme_files') as patched_include_theme_files:
            fragment = self.block.author_preview_view({})
            patched_include_theme_files.assert_called_with(fragment)
Exemple #2
0
class TestMentoringBlockTheming(unittest.TestCase):
    def setUp(self):
        self.service_mock = Mock()
        self.runtime_mock = Mock()
        self.runtime_mock.service = Mock(return_value=self.service_mock)
        self.block = MentoringBlock(self.runtime_mock, DictFieldData({}), Mock())

    def test_theme_uses_default_theme_if_settings_service_is_not_available(self):
        self.runtime_mock.service = Mock(return_value=None)
        self.assertEqual(self.block.get_theme(), _default_theme_config)

    def test_theme_uses_default_theme_if_no_theme_is_set(self):
        self.service_mock.get_settings_bucket = Mock(return_value=None)
        self.assertEqual(self.block.get_theme(), _default_theme_config)
        self.service_mock.get_settings_bucket.assert_called_once_with(self.block)

    @ddt.data(123, object())
    def test_theme_raises_if_theme_object_is_not_iterable(self, theme_config):
        self.service_mock.get_settings_bucket = Mock(return_value=theme_config)
        with self.assertRaises(TypeError):
            self.block.get_theme()
        self.service_mock.get_settings_bucket.assert_called_once_with(self.block)

    @ddt.data(
        {}, {'mass': 123}, {'spin': {}}, {'parity': "1"}
    )
    def test_theme_uses_default_theme_if_no_mentoring_theme_is_set_up(self, theme_config):
        self.service_mock.get_settings_bucket = Mock(return_value=theme_config)
        self.assertEqual(self.block.get_theme(), _default_theme_config)
        self.service_mock.get_settings_bucket.assert_called_once_with(self.block)

    @ddt.data(
        {MentoringBlock.theme_key: 123},
        {MentoringBlock.theme_key: [1, 2, 3]},
        {MentoringBlock.theme_key: {'package': 'qwerty', 'locations': ['something_else.css']}},
    )
    def test_theme_correctly_returns_configured_theme(self, theme_config):
        self.service_mock.get_settings_bucket = Mock(return_value=theme_config)
        self.assertEqual(self.block.get_theme(), theme_config[MentoringBlock.theme_key])

    def test_theme_files_are_loaded_from_correct_package(self):
        fragment = MagicMock()
        package_name = 'some_package'
        theme_config = {MentoringBlock.theme_key: {'package': package_name, 'locations': ['lms.css']}}
        self.service_mock.get_settings_bucket = Mock(return_value=theme_config)
        with patch("problem_builder.mentoring.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()
        theme_config = {MentoringBlock.theme_key: {'package': package_name, 'locations': locations}}
        self.service_mock.get_settings_bucket = Mock(return_value=theme_config)
        with patch("problem_builder.mentoring.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):
        with patch.object(self.block, 'include_theme_files') as patched_include_theme_files:
            fragment = self.block.student_view({})
            patched_include_theme_files.assert_called_with(fragment)

    def test_author_preview_view_calls_include_theme_files(self):
        with patch.object(self.block, 'include_theme_files') as patched_include_theme_files:
            fragment = self.block.author_preview_view({})
            patched_include_theme_files.assert_called_with(fragment)
class TestMentoringBlockTheming(unittest.TestCase):
    def setUp(self):
        self.service_mock = Mock()
        self.runtime_mock = Mock()
        self.runtime_mock.service = Mock(return_value=self.service_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):
        self.block.get_xblock_settings = Mock(return_value={})
        with patch.object(self.block, 'include_theme_files') as patched_include_theme_files:
            fragment = self.block.student_view({})
            patched_include_theme_files.assert_called_with(fragment)

    def test_author_preview_view_calls_include_theme_files(self):
        self.block.get_xblock_settings = Mock(return_value={})
        with patch.object(self.block, 'include_theme_files') as patched_include_theme_files:
            fragment = self.block.author_preview_view({})
            patched_include_theme_files.assert_called_with(fragment)