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