コード例 #1
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    ''' Video Annotation Module Test Case '''
    sample_xml = '''
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    '''
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """
        self.mod = VideoAnnotationModule(
            Mock(), get_test_system(),
            DictFieldData({
                'data': self.sample_xml,
                'sourceUrl': self.sample_sourceurl
            }), ScopeIds(None, None, None, None))

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring('<annotatable>foo</annotatable>')
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = 'video/youtube'
        expectednotyoutube = 'video/mp4'
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=W0212
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=W0212
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_get_html(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.get_html()
        for key in [
                'display_name', 'instructions_html', 'sourceUrl', 'typeSource',
                'poster', 'annotation_storage'
        ]:
            self.assertIn(key, context)
コード例 #2
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    ''' Video Annotation Module Test Case '''
    sample_xml = '''
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    '''
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """
        self.mod = VideoAnnotationModule(
            Mock(),
            get_test_system(),
            DictFieldData({'data': self.sample_xml, 'sourceUrl': self.sample_sourceurl}),
            ScopeIds(None, None, None, None)
        )

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring('<annotatable>foo</annotatable>')
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = 'video/youtube'
        expectednotyoutube = 'video/mp4'
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=W0212
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=W0212
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_student_view(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.student_view({}).content
        for key in ['display_name', 'instructions_html', 'sourceUrl', 'typeSource', 'poster', 'annotation_storage']:
            self.assertIn(key, context)
コード例 #3
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    ''' Video Annotation Module Test Case '''
    sample_xml = '''
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    '''
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """
        self.mod = VideoAnnotationModule(
            Mock(), get_test_system(),
            DictFieldData({
                'data': self.sample_xml,
                'sourceUrl': self.sample_sourceurl
            }), ScopeIds(None, None, None, None))

    def test_annotation_class_attr_default(self):
        """
        Makes sure that it can detect annotation values in text-form if user
        decides to add text to the area below video, video functionality is completely
        found in javascript.
        """
        xml = '<annotation title="x" body="y" problem="0">test</annotation>'
        element = etree.fromstring(xml)

        expected_attr = {'class': {'value': 'annotatable-span highlight'}}
        actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

        self.assertIsInstance(actual_attr, dict)
        self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_class_attr_with_valid_highlight(self):
        """
        Same as above but more specific to an area that is highlightable in the appropriate
        color designated.
        """
        xml = '<annotation title="x" body="y" problem="0" highlight="{highlight}">test</annotation>'

        for color in self.mod.highlight_colors:
            element = etree.fromstring(xml.format(highlight=color))
            value = 'annotatable-span highlight highlight-{highlight}'.format(
                highlight=color)

            expected_attr = {'class': {'value': value, '_delete': 'highlight'}}
            actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

            self.assertIsInstance(actual_attr, dict)
            self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_class_attr_with_invalid_highlight(self):
        """
        Same as above, but checked with invalid colors.
        """
        xml = '<annotation title="x" body="y" problem="0" highlight="{highlight}">test</annotation>'

        for invalid_color in ['rainbow', 'blink', 'invisible', '', None]:
            element = etree.fromstring(xml.format(highlight=invalid_color))
            expected_attr = {
                'class': {
                    'value': 'annotatable-span highlight',
                    '_delete': 'highlight'
                }
            }
            actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

            self.assertIsInstance(actual_attr, dict)
            self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_data_attr(self):
        """
        Test that each highlight contains the data information from the annotation itself.
        """
        element = etree.fromstring(
            '<annotation title="bar" body="foo" problem="0">test</annotation>')

        expected_attr = {
            'data-comment-body': {
                'value': 'foo',
                '_delete': 'body'
            },
            'data-comment-title': {
                'value': 'bar',
                '_delete': 'title'
            },
            'data-problem-id': {
                'value': '0',
                '_delete': 'problem'
            }
        }

        actual_attr = self.mod._get_annotation_data_attr(element)  # pylint: disable=W0212

        self.assertIsInstance(actual_attr, dict)
        self.assertDictEqual(expected_attr, actual_attr)

    def test_render_annotation(self):
        """
        Tests to make sure that the spans designating annotations acutally visually render as annotations.
        """
        expected_html = '<span class="annotatable-span highlight highlight-yellow" data-comment-title="x" data-comment-body="y" data-problem-id="0">z</span>'
        expected_el = etree.fromstring(expected_html)

        actual_el = etree.fromstring(
            '<annotation title="x" body="y" problem="0" highlight="yellow">z</annotation>'
        )
        self.mod._render_annotation(actual_el)  # pylint: disable=W0212

        self.assertEqual(expected_el.tag, actual_el.tag)
        self.assertEqual(expected_el.text, actual_el.text)
        self.assertDictEqual(dict(expected_el.attrib), dict(actual_el.attrib))

    def test_render_content(self):
        """
        Like above, but using the entire text, it makes sure that display_name is removed and that there is only one
        div encompassing the annotatable area.
        """
        content = self.mod._render_content()  # pylint: disable=W0212
        element = etree.fromstring(content)
        self.assertIsNotNone(element)
        self.assertEqual('div', element.tag, 'root tag is a div')
        self.assertFalse('display_name' in element.attrib,
                         "Display Name should have been deleted from Content")

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring('<annotatable>foo</annotatable>')
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = 'video/youtube'
        expectednotyoutube = 'video/mp4'
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=W0212
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=W0212
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_get_html(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.get_html()
        for key in [
                'display_name', 'content_html', 'instructions_html',
                'sourceUrl', 'typeSource', 'poster', 'alert',
                'annotation_storage'
        ]:
            self.assertIn(key, context)
コード例 #4
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    ''' Video Annotation Module Test Case '''
    sample_xml = '''
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    '''
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """

        # return anything except None to test LMS
        def test_real_user(useless):
            useless_user = Mock(email='*****@*****.**', id=useless)
            return useless_user

        # test to make sure that role is checked in LMS
        def test_user_role():
            return 'staff'

        self.system = get_test_system()
        self.system.get_real_user = test_real_user
        self.system.get_user_role = test_user_role
        self.system.anonymous_student_id = None

        self.mod = VideoAnnotationModule(
            Mock(), self.system,
            DictFieldData({
                'data': self.sample_xml,
                'sourceUrl': self.sample_sourceurl
            }), ScopeIds(None, None, None, None))

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=protected-access
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring('<annotatable>foo</annotatable>')
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=protected-access
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = 'video/youtube'
        expectednotyoutube = 'video/mp4'
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=protected-access
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=protected-access
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_student_view(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.student_view({}).content
        for key in [
                'display_name', 'instructions_html', 'sourceUrl', 'typeSource',
                'poster', 'annotation_storage', 'default_tab',
                'instructor_email', 'annotation_mode', "is_course_staff"
        ]:
            self.assertIn(key, context)
コード例 #5
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    ''' Video Annotation Module Test Case '''
    sample_xml = '''
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    '''
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """
        self.mod = VideoAnnotationModule(
            Mock(),
            get_test_system(),
            DictFieldData({'data': self.sample_xml, 'sourceUrl': self.sample_sourceurl}),
            ScopeIds(None, None, None, None)
        )

    def test_annotation_class_attr_default(self):
        """
        Makes sure that it can detect annotation values in text-form if user
        decides to add text to the area below video, video functionality is completely
        found in javascript.
        """
        xml = '<annotation title="x" body="y" problem="0">test</annotation>'
        element = etree.fromstring(xml)

        expected_attr = {'class': {'value': 'annotatable-span highlight'}}
        actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

        self.assertIsInstance(actual_attr, dict)
        self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_class_attr_with_valid_highlight(self):
        """
        Same as above but more specific to an area that is highlightable in the appropriate
        color designated.
        """
        xml = '<annotation title="x" body="y" problem="0" highlight="{highlight}">test</annotation>'

        for color in self.mod.highlight_colors:
            element = etree.fromstring(xml.format(highlight=color))
            value = 'annotatable-span highlight highlight-{highlight}'.format(highlight=color)

            expected_attr = {'class': {
                'value': value,
                '_delete': 'highlight'}
            }
            actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

            self.assertIsInstance(actual_attr, dict)
            self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_class_attr_with_invalid_highlight(self):
        """
        Same as above, but checked with invalid colors.
        """
        xml = '<annotation title="x" body="y" problem="0" highlight="{highlight}">test</annotation>'

        for invalid_color in ['rainbow', 'blink', 'invisible', '', None]:
            element = etree.fromstring(xml.format(highlight=invalid_color))
            expected_attr = {'class': {
                'value': 'annotatable-span highlight',
                '_delete': 'highlight'}
            }
            actual_attr = self.mod._get_annotation_class_attr(element)  # pylint: disable=W0212

            self.assertIsInstance(actual_attr, dict)
            self.assertDictEqual(expected_attr, actual_attr)

    def test_annotation_data_attr(self):
        """
        Test that each highlight contains the data information from the annotation itself.
        """
        element = etree.fromstring('<annotation title="bar" body="foo" problem="0">test</annotation>')

        expected_attr = {
            'data-comment-body': {'value': 'foo', '_delete': 'body'},
            'data-comment-title': {'value': 'bar', '_delete': 'title'},
            'data-problem-id': {'value': '0', '_delete': 'problem'}
        }

        actual_attr = self.mod._get_annotation_data_attr(element)  # pylint: disable=W0212

        self.assertIsInstance(actual_attr, dict)
        self.assertDictEqual(expected_attr, actual_attr)

    def test_render_annotation(self):
        """
        Tests to make sure that the spans designating annotations acutally visually render as annotations.
        """
        expected_html = '<span class="annotatable-span highlight highlight-yellow" data-comment-title="x" data-comment-body="y" data-problem-id="0">z</span>'
        expected_el = etree.fromstring(expected_html)

        actual_el = etree.fromstring('<annotation title="x" body="y" problem="0" highlight="yellow">z</annotation>')
        self.mod._render_annotation(actual_el)  # pylint: disable=W0212

        self.assertEqual(expected_el.tag, actual_el.tag)
        self.assertEqual(expected_el.text, actual_el.text)
        self.assertDictEqual(dict(expected_el.attrib), dict(actual_el.attrib))

    def test_render_content(self):
        """
        Like above, but using the entire text, it makes sure that display_name is removed and that there is only one
        div encompassing the annotatable area.
        """
        content = self.mod._render_content()  # pylint: disable=W0212
        element = etree.fromstring(content)
        self.assertIsNotNone(element)
        self.assertEqual('div', element.tag, 'root tag is a div')
        self.assertFalse('display_name' in element.attrib, "Display Name should have been deleted from Content")

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring('<annotatable>foo</annotatable>')
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = 'video/youtube'
        expectednotyoutube = 'video/mp4'
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=W0212
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=W0212
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_get_html(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.get_html()
        for key in ['display_name', 'content_html', 'instructions_html', 'sourceUrl', 'typeSource', 'poster', 'alert', 'annotation_storage']:
            self.assertIn(key, context)
コード例 #6
0
class VideoAnnotationModuleTestCase(unittest.TestCase):
    """ Video Annotation Module Test Case """

    sample_xml = """
        <annotatable>
            <instructions><p>Video Test Instructions.</p></instructions>
        </annotatable>
    """
    sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4"
    sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y"

    def setUp(self):
        """
        Makes sure that the Video Annotation Module is created.
        """
        # return anything except None to test LMS
        def test_real_user(useless):
            useless_user = Mock(email="*****@*****.**", id=useless)
            return useless_user

        # test to make sure that role is checked in LMS
        def test_user_role():
            return "staff"

        self.system = get_test_system()
        self.system.get_real_user = test_real_user
        self.system.get_user_role = test_user_role
        self.system.anonymous_student_id = None

        self.mod = VideoAnnotationModule(
            Mock(),
            self.system,
            DictFieldData({"data": self.sample_xml, "sourceUrl": self.sample_sourceurl}),
            ScopeIds(None, None, None, None),
        )

    def test_extract_instructions(self):
        """
        This test ensures that if an instruction exists it is pulled and
        formatted from the <instructions> tags. Otherwise, it should return nothing.
        """
        xmltree = etree.fromstring(self.sample_xml)

        expected_xml = u"<div><p>Video Test Instructions.</p></div>"
        actual_xml = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNotNone(actual_xml)
        self.assertEqual(expected_xml.strip(), actual_xml.strip())

        xmltree = etree.fromstring("<annotatable>foo</annotatable>")
        actual = self.mod._extract_instructions(xmltree)  # pylint: disable=W0212
        self.assertIsNone(actual)

    def test_get_extension(self):
        """
        Tests the function that returns the appropriate extension depending on whether it is
        a video from youtube, or one uploaded to the EdX server.
        """
        expectedyoutube = "video/youtube"
        expectednotyoutube = "video/mp4"
        result1 = self.mod._get_extension(self.sample_sourceurl)  # pylint: disable=W0212
        result2 = self.mod._get_extension(self.sample_youtubeurl)  # pylint: disable=W0212
        self.assertEqual(expectedyoutube, result2)
        self.assertEqual(expectednotyoutube, result1)

    def test_student_view(self):
        """
        Tests to make sure variables passed in truly exist within the html once it is all rendered.
        """
        context = self.mod.student_view({}).content
        for key in [
            "display_name",
            "instructions_html",
            "sourceUrl",
            "typeSource",
            "poster",
            "annotation_storage",
            "default_tab",
            "instructor_email",
            "annotation_mode",
            "is_course_staff",
        ]:
            self.assertIn(key, context)