Example #1
0
    def map(item):
        if item.deleted:
            return
        err_dict = {}

        try:
            exploration = exp_services.get_exploration_from_model(item)
        except Exception as e:
            yield ('Error %s when loading exploration' % str(e), [item.id])
            return

        html_list = exploration.get_all_html_content_strings()
        try:
            err_dict = html_validation_service.validate_customization_args(
                html_list)
        except Exception as e:
            yield (
                'Error in validating customization args for exploration %s' % (
                    item.id),
                [traceback.format_exc()])
            return

        for key in err_dict:
            if err_dict[key]:
                yield (key, err_dict[key])
Example #2
0
    def map(item):
        if item.deleted:
            return
        err_dict = {}

        try:
            exploration = exp_fetchers.get_exploration_from_model(item)
        except Exception as e:
            yield ('Error %s when loading exploration' % str(e), [item.id])
            return

        html_list = exploration.get_all_html_content_strings()
        err_dict = html_validation_service.validate_customization_args(
            html_list)

        for key in err_dict:
            if err_dict[key]:
                yield ('%s Exp Id: %s' % (key, item.id), err_dict[key])
Example #3
0
    def map(item):
        if item.deleted:
            return
        err_dict = {}

        try:
            exploration = exp_fetchers.get_exploration_from_model(item)
        except Exception as e:
            yield ('Error %s when loading exploration' %
                   python_utils.UNICODE(e), [item.id])
            return

        html_list = exploration.get_all_html_content_strings()
        err_dict = html_validation_service.validate_customization_args(
            html_list)
        for key in err_dict:
            err_value_with_exp_id = err_dict[key]
            err_value_with_exp_id.append('Exp ID: %s' % item.id)
            yield (key, err_value_with_exp_id)
    def test_validate_customization_args(self):
        test_cases = [
            ('<p><oppia-noninteractive-link text-with-value="&amp;quot;What is '
             'a link?&amp;quot;" url-with-value="&amp;quot;htt://link.com&amp'
             ';quot;"></oppia-noninteractive-link></p>'),
            ('<p><oppia-noninteractive-link text-with-value="3456" '
             'url-with-value="&amp;quot;http://google.com&amp'
             ';quot;"></oppia-noninteractive-link></p>'),
            ('<p><oppia-noninteractive-link text-with-value="&amp;quot;What is '
             'a link?&amp;quot;" url-with-value="&amp;quot;https://link.com&amp'
             ';quot;"></oppia-noninteractive-link></p>'),
            ('<oppia-noninteractive-collapsible content-with-value="'
             '&amp;quot;&amp;lt;p&amp;gt;&amp;lt;oppia-noninteractive-link '
             'url-with-value=\\&amp;quot;&amp;amp;amp;quot;'
             'https://www.example.com&amp;amp;amp;quot;\\&amp;quot;&amp;gt;'
             '&amp;lt;/oppia-noninteractive-link&amp;gt;&amp;lt;/p&amp;gt;'
             '&amp;quot;" heading-with-value="&amp;quot;Hello&amp;quot;">'
             '</oppia-noninteractive-collapsible>'),
            ('<oppia-noninteractive-image caption-with-value="&amp;quot;'
             'abc&amp;quot;" filepath-with-value="&amp;quot;'
             'random.png&amp;quot;"></oppia-noninteractive-image>'),
            ('<p><oppia-noninteractive-math raw_latex-with-value="&amp;quot;'
             'abc&amp;quot;"></oppia-noninteractive-math></p>'),
            ('<p><oppia-noninteractive-math url-with-value="&amp;quot;'
             'http://link.com&amp;quot;></oppia-noninteractive-math></p>'),
            ('<oppia-noninteractive-collapsible content-with-value='
             '"&amp;quot;&amp;lt;p&amp;gt;lorem ipsum&amp;lt;/p&amp;gt;&amp;'
             'quot;" heading-with-value="&amp;quot;lorem ipsum&amp;quot;">'
             '</oppia-noninteractive-collapsible>'),
            ('<oppia-noninteractive-collapsible content-with-value='
             '"34454" heading-with-value="&amp;quot;lorem ipsum&amp;quot;">'
             '</oppia-noninteractive-collapsible>'),
            ('<oppia-noninteractive-collapsible content-with-value="'
             '&amp;quot;&amp;lt;oppia-noninteractive-tabs tab_contents'
             '-with-value=\\&amp;quot;[{&amp;amp;amp;quot;title&amp;amp;amp;'
             'quot;:&amp;amp;amp;quot;Tab&amp;amp;amp;quot;,&amp;amp;amp;quot;'
             'content&amp;amp;amp;quot;:&amp;amp;amp;quot;&amp;amp;amp;lt;p&amp'
             ';amp;amp;gt;Hello&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;'
             'amp;quot;}]\\&amp;quot;&amp;gt;&amp;lt;/oppia-noninteractive-tabs'
             '&amp;gt;&amp;lt;p&amp;gt;You have opened the collapsible block.'
             '&amp;lt;/p&amp;gt;&amp;quot;" heading-with-value="&amp;quot;'
             'Hello&amp;quot;"></oppia-noninteractive-collapsible>'),
            ('<oppia-noninteractive-collapsible content-with-value='
             '"&amp;quot;&amp;lt;oppia-noninteractive-collapsible '
             'content-with-value=\\&amp;quot;&amp;amp;amp;quot;&amp;'
             'amp;amp;lt;p&amp;amp;amp;gt;Hello&amp;amp;amp;lt;/p'
             '&amp;amp;amp;gt;&amp;amp;amp;quot;\\&amp;quot; '
             'heading-with-value=\\&amp;quot;&amp;amp;amp;quot;'
             'SubCollapsible&amp;amp;amp;quot;\\&amp;quot;&amp;'
             'gt;&amp;lt;/oppia-noninteractive-collapsible&amp;'
             'gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;'
             '&amp;quot;" heading-with-value="&amp;quot;Collapsible'
             '&amp;quot;"></oppia-noninteractive-collapsible>'),
            ('<oppia-noninteractive-tabs tab_contents-with-value="'
             '[{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;lorem '
             'ipsum&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;title&amp;quot;: '
             '&amp;quot;hello&amp;quot;}, {&amp;quot;content&amp;quot;: &amp;'
             'quot;&amp;lt;p&amp;gt;oppia&amp;lt;/p&amp;gt;&amp;quot;, &amp;'
             'quot;title&amp;quot;: &amp;quot;Savjet 1&amp;quot;}]">'
             '</oppia-noninteractive-tabs>'),
            ('<oppia-noninteractive-tabs tab_contents-with-value="'
             '[{&amp;quot;content&amp;quot;: 1234, '
             '&amp;quot;title&amp;quot;: &amp;quot;hello&amp;quot;}, '
             '{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;'
             'oppia&amp;lt;/p&amp;gt;&amp;quot;, &amp;'
             'quot;title&amp;quot;: &amp;quot;Savjet 1&amp;quot;}]">'
             '</oppia-noninteractive-tabs>'),
            ('<oppia-noninteractive-tabs tab_contents-with-value="'
             '[{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;lorem '
             'ipsum&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;url&amp;quot;: '
             '&amp;quot;hello&amp;quot;}, {&amp;quot;content&amp;quot;: &amp;'
             'quot;&amp;lt;p&amp;gt;oppia&amp;lt;/p&amp;gt;&amp;quot;, &amp;'
             'quot;title&amp;quot;: &amp;quot;Savjet 1&amp;quot;}]">'
             '</oppia-noninteractive-tabs>'),
            ('<oppia-noninteractive-tabs tab_contents-with-value="'
             '[{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;lorem '
             'ipsum&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;title&amp;quot;: '
             '&amp;quot;hello&amp;quot;}, [1,2,3]]">'
             '</oppia-noninteractive-tabs>'),
            ('<oppia-noninteractive-tabs tab_contents-with-value="[{&amp;quot;'
             'title&amp;quot;:&amp;quot;Tab&amp;quot;,&amp;quot;content&amp;'
             'quot;:&amp;quot;&amp;lt;oppia-noninteractive-tabs '
             'tab_contents-with-value=\\&amp;quot;[{&amp;amp;amp;quot;title'
             '&amp;amp;amp;quot;:&amp;amp;amp;quot;Subtab&amp;amp;amp;quot;'
             ',&amp;amp;amp;quot;content&amp;amp;amp;quot;:&amp;amp;amp;quot;'
             '&amp;amp;amp;lt;p&amp;amp;amp;gt;Hello&amp;amp;amp;lt;/p&amp;'
             'amp;amp;gt;&amp;amp;amp;quot;}]\\&amp;quot;&amp;gt;&amp;lt;'
             '/oppia-noninteractive-tabs&amp;gt;&amp;lt;p&amp;gt;&amp;amp;'
             'nbsp;&amp;lt;/p&amp;gt;&amp;quot;}]">'
             '</oppia-noninteractive-tabs>'),
            ('<oppia-noninteractive-video autoplay-with-value="false" '
             'end-with-value="0" start-with-value="0">'
             '</oppia-noninteractive-video>'),
            ('<oppia-noninteractive-video autoplay-with-value="&amp;quot;hello'
             '&amp;quot;" end-with-value="0" start-with-value="0" '
             'video_id-with-value="&amp;quot;loremipsum&amp;quot;">'
             '</oppia-noninteractive-video>'),
            ('<oppia-noninteractive-video autoplay-with-value="false" '
             'end-with-value="0" start-with-value="&amp;quot;Hello&amp;quot;" '
             'video_id-with-value="&amp;quot;loremipsum&amp;quot;">'
             '</oppia-noninteractive-video>'),
            ('<oppia-noninteractive-video autoplay-with-value="false" '
             'end-with-value="0" start-with-value="0" '
             'video_id-with-value="&amp;quot;lorem&amp;quot;">'
             '</oppia-noninteractive-video>'),
            ('<oppia-noninteractive-video autoplay-with-value="false" '
             'end-with-value="0" start-with-value="0" '
             'video_id-with-value="&amp;quot;12345678901&amp;quot;">'
             '</oppia-noninteractive-video>'),
            ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
             'circle divided into equal fifths.&amp;quot;" '
             'caption-with-value="&amp;quot;&amp;quot;" '
             'filepath-with-value="&amp;quot;xyz.png&amp;quot;">'
             '</oppia-noninteractive-image>'),
            ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
             'circle divided into equal fifths.&amp;quot;" '
             'caption-with-value="&amp;quot;Hello&amp;quot;" '
             'filepath-with-value="&amp;quot;xy.z.png&amp;quot;">'
             '</oppia-noninteractive-image>'),
            ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
             'circle divided into equal fifths.&amp;quot;" '
             'caption-with-value="34454" '
             'filepath-with-value="&amp;quot;xyz.png&amp;quot;">'
             '</oppia-noninteractive-image>'),
            ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
             'circle divided into equal fifths.&amp;quot;" '
             'caption-with-value="&amp;quot;5454&amp;quot;" '
             'filepath-with-value="&amp;quot;xyz.jpg&amp;quot;">'
             '</oppia-noninteractive-image>'),
            ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
             'circle divided into equal fifths.&amp;quot;" '
             'caption-with-value="&amp;quot;Hello&amp;quot;" '
             'filepath-with-value="&amp;quot;46503*.jpg&amp;quot;">'
             '</oppia-noninteractive-image>')
        ]

        actual_output = html_validation_service.validate_customization_args(
            test_cases)

        expected_output = {
            'Invalid filepath':
            [('<oppia-noninteractive-image alt-with-value="&amp;quot;'
              'A circle divided into equal fifths.&amp;quot;" caption-'
              'with-value="&amp;quot;Hello&amp;quot;" filepath-with-value'
              '="&amp;quot;46503*.jpg&amp;quot;">'
              '</oppia-noninteractive-image>'),
             ('<oppia-noninteractive-image alt-with-value="&amp;quot;A '
              'circle divided into equal fifths.&amp;quot;" caption-'
              'with-value="&amp;quot;Hello&amp;quot;" filepath-with-value'
              '="&amp;quot;xy.z.png&amp;quot;"></oppia-noninteractive-image>')
             ],
            'Expected dict, received [1, 2, 3]': [
                ('<oppia-noninteractive-tabs tab_contents-with-value='
                 '"[{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;'
                 'gt;lorem ipsum&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;'
                 'title&amp;quot;: &amp;quot;hello&amp;quot;}, [1,2,3]]">'
                 '</oppia-noninteractive-tabs>')
            ],
            'Nested tabs and collapsible':
            [('<oppia-noninteractive-collapsible content-with-value="&amp;'
              'quot;&amp;lt;oppia-noninteractive-collapsible content-with-'
              'value=\\&amp;quot;&amp;amp;amp;quot;&amp;amp;amp;lt;p&amp;'
              'amp;amp;gt;Hello&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;'
              'amp;quot;\\&amp;quot; heading-with-value=\\&amp;quot;&amp;'
              'amp;amp;quot;SubCollapsible&amp;amp;amp;quot;\\&amp;quot;&amp;'
              'gt;&amp;lt;/oppia-noninteractive-collapsible&amp;gt;&amp;lt;p'
              '&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&amp;quot;" '
              'heading-with-value="&amp;quot;Collapsible&amp;quot;">'
              '</oppia-noninteractive-collapsible>'),
             ('<oppia-noninteractive-collapsible content-with-value='
              '"&amp;quot;&amp;lt;oppia-noninteractive-tabs tab_contents-'
              'with-value=\\&amp;quot;[{&amp;amp;amp;quot;title&amp;amp;'
              'amp;quot;:&amp;amp;amp;quot;Tab&amp;amp;amp;quot;,&amp;'
              'amp;amp;quot;content&amp;amp;amp;quot;:&amp;amp;amp;quot;'
              '&amp;amp;amp;lt;p&amp;amp;amp;gt;Hello&amp;amp;amp;lt;/p'
              '&amp;amp;amp;gt;&amp;amp;amp;quot;}]\\&amp;quot;&amp;gt;&amp;'
              'lt;/oppia-noninteractive-tabs&amp;gt;&amp;lt;p&amp;gt;You '
              'have opened the collapsible block.&amp;lt;/p&amp;gt;'
              '&amp;quot;" heading-with-value="&amp;quot;Hello&amp;quot;">'
              '</oppia-noninteractive-collapsible>'),
             ('<oppia-noninteractive-tabs tab_contents-with-value'
              '="[{&amp;quot;title&amp;quot;:&amp;quot;Tab&amp;quot;,'
              '&amp;quot;content&amp;quot;:&amp;quot;&amp;lt;oppia-'
              'noninteractive-tabs tab_contents-with-value=\\&amp;quot;'
              '[{&amp;amp;amp;quot;title&amp;amp;amp;quot;:&amp;amp;amp;'
              'quot;Subtab&amp;amp;amp;quot;,&amp;amp;amp;quot;content&amp;'
              'amp;amp;quot;:&amp;amp;amp;quot;&amp;amp;amp;lt;p&amp;amp;'
              'amp;gt;Hello&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;'
              'amp;quot;}]\\&amp;quot;&amp;gt;&amp;lt;/oppia-noninteractive'
              '-tabs&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;'
              'gt;&amp;quot;}]"></oppia-noninteractive-tabs>')],
            'Expected unicode HTML string, received 34454':
            [('<oppia-noninteractive-collapsible content-with-value="34454" '
              'heading-with-value="&amp;quot;lorem ipsum&amp;quot;">'
              '</oppia-noninteractive-collapsible>')],
            "Missing attributes: [u'text-with-value'], Extra attributes: []":
            [('<oppia-noninteractive-collapsible content-with-value'
              '="&amp;quot;&amp;lt;p&amp;gt;&amp;lt;oppia-noninteractive-'
              'link url-with-value=\\&amp;quot;&amp;amp;amp;quot;https://'
              'www.example.com&amp;amp;amp;quot;\\&amp;quot;&amp;gt;&amp;lt;'
              '/oppia-noninteractive-link&amp;gt;&amp;lt;/p&amp;gt;&amp;'
              'quot;" heading-with-value="&amp;quot;Hello&amp;quot;">'
              '</oppia-noninteractive-collapsible>')],
            'Expected bool, received hello': [
                ('<oppia-noninteractive-video autoplay-with-value="&amp;quot;'
                 'hello&amp;quot;" end-with-value="0" start-with-value="0" '
                 'video_id-with-value="&amp;quot;loremipsum&amp;quot;">'
                 '</oppia-noninteractive-video>')
            ],
            ("Invalid URL: Sanitized URL should start with 'http://' or "
             "'https://'; received htt://link.com"): [
                ('<p><oppia-noninteractive-link text-with-value="&amp;quot;'
                 'What is a link?&amp;quot;" url-with-value="&amp;quot;htt://'
                 'link.com&amp;quot;"></oppia-noninteractive-link></p>')
            ],
            ("Missing attributes: [u'video_id-with-value'], "
             "Extra attributes: []"): [
                ('<oppia-noninteractive-video autoplay-with-value="false" '
                 'end-with-value="0" start-with-value="0">'
                 '</oppia-noninteractive-video>')
            ],
            'Expected unicode string, received 34454': [
                ('<oppia-noninteractive-image alt-with-value="&amp;quot;'
                 'A circle divided into equal fifths.&amp;quot;" '
                 'caption-with-value="34454" filepath-with-value="&amp;quot;'
                 'xyz.png&amp;quot;"></oppia-noninteractive-image>')
            ],
            'Expected unicode string, received 3456': [
                ('<p><oppia-noninteractive-link text-with-value="3456" '
                 'url-with-value="&amp;quot;http://google.com&amp;quot;">'
                 '</oppia-noninteractive-link></p>')
            ],
            "Missing keys: ['title'], Extra keys: [u'url']":
            [('<oppia-noninteractive-tabs tab_contents-with-value="'
              '[{&amp;quot;content&amp;quot;: &amp;quot;&amp;lt;p&amp;'
              'gt;lorem ipsum&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;url'
              '&amp;quot;: &amp;quot;hello&amp;quot;}, {&amp;quot;'
              'content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;oppia'
              '&amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;title&amp;quot;: '
              '&amp;quot;Savjet 1&amp;quot;}]"></oppia-noninteractive-tabs>')],
            "invalid literal for int() with base 10: 'Hello'": [
                ('<oppia-noninteractive-video autoplay-with-value="false" '
                 'end-with-value="0" start-with-value="&amp;quot;Hello&amp;'
                 'quot;" video_id-with-value="&amp;quot;loremipsum&amp;quot;">'
                 '</oppia-noninteractive-video>')
            ],
            'Expected unicode HTML string, received 1234':
            [('<oppia-noninteractive-tabs tab_contents-with-value='
              '"[{&amp;quot;content&amp;quot;: 1234, &amp;quot;title'
              '&amp;quot;: &amp;quot;hello&amp;quot;}, {&amp;quot;'
              'content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;oppia&'
              'amp;lt;/p&amp;gt;&amp;quot;, &amp;quot;title&amp;quot;: '
              '&amp;quot;Savjet 1&amp;quot;}]"></oppia-noninteractive-tabs>')],
            "Missing attributes: [u'alt-with-value'], Extra attributes: []":
            [('<oppia-noninteractive-image caption-with-value="&amp;quot;abc'
              '&amp;quot;" filepath-with-value="&amp;quot;random.png&amp;'
              'quot;"></oppia-noninteractive-image>')],
            'Video id length is not 11':
            [('<oppia-noninteractive-video autoplay-with-value="false" '
              'end-with-value="0" start-with-value="0" video_id-with-value="'
              '&amp;quot;lorem&amp;quot;"></oppia-noninteractive-video>')]
        }

        self.assertEqual(set(actual_output.keys()),
                         set(expected_output.keys()))
        for key in expected_output:
            self.assertEqual(set(actual_output[key]),
                             set(expected_output[key]))