bgneal@971: """Tests for the core.html module.""" bgneal@971: import unittest bgneal@971: bgneal@1229: from mock import call, patch bgneal@1229: bgneal@1229: from core.html import clean_html, _CLEAN_PROFILES bgneal@971: from core.html import ImageCheckError bgneal@971: from core.html import image_check bgneal@971: bgneal@971: bgneal@971: TEST_HTML = """ bgneal@971:

Posters and Facebook events are starting to come in...

bgneal@971:

image

bgneal@971:

image

bgneal@971: """ bgneal@971: bgneal@971: bgneal@971: class ImageCheckTestCase(unittest.TestCase): bgneal@971: def setUp(self): bgneal@971: self.allowed_hosts = ['example.com'] bgneal@971: bgneal@971: def test_happy_path(self): bgneal@971: url1 = 'https://example.com/1.jpg' bgneal@971: url2 = 'https://example.com/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: result = image_check(html, self.allowed_hosts) bgneal@971: self.assertTrue(result) bgneal@971: bgneal@971: def test_empty_image(self): bgneal@971: url1 = 'https://example.com/1.jpg' bgneal@971: url2 = '' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: self.assertRaises(ImageCheckError, image_check, html, self.allowed_hosts) bgneal@971: bgneal@971: def test_relative_ok(self): bgneal@971: url1 = 'https://example.com/1.jpg' bgneal@971: url2 = '/some/path/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: result = image_check(html, self.allowed_hosts) bgneal@971: self.assertTrue(result) bgneal@971: bgneal@971: def test_non_https(self): bgneal@971: url1 = 'http://example.com/1.jpg' bgneal@971: url2 = 'https://example.com/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: self.assertRaises(ImageCheckError, image_check, html, self.allowed_hosts) bgneal@971: bgneal@971: def test_missing_hostname(self): bgneal@971: url1 = 'http:///1.jpg' bgneal@971: url2 = 'https://example.com/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: self.assertRaises(ImageCheckError, image_check, html, self.allowed_hosts) bgneal@971: bgneal@971: def test_hostname_not_allowed1(self): bgneal@971: url1 = 'https://xxx.example.com/1.jpg' bgneal@971: url2 = 'https://example.com/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: self.assertRaises(ImageCheckError, image_check, html, self.allowed_hosts) bgneal@971: bgneal@971: def test_hostname_not_allowed2(self): bgneal@971: url1 = 'https://xxx.example.com/1.jpg' bgneal@971: url2 = 'https://yyy.example.com/2.jpg' bgneal@971: html = TEST_HTML.format(src1=url1, src2=url2) bgneal@971: bgneal@971: self.assertRaises(ImageCheckError, image_check, html, self.allowed_hosts) bgneal@985: bgneal@985: def test_empty_string(self): bgneal@985: result = image_check('') bgneal@985: self.assertTrue(result) bgneal@985: bgneal@985: def test_whitespace(self): bgneal@985: result = image_check('\r\n\r\n') bgneal@985: self.assertTrue(result) bgneal@1229: bgneal@1229: bgneal@1229: class CleanHtmlTestCase(unittest.TestCase): bgneal@1229: def test_all_whitespace(self): bgneal@1229: text = ' \t \n ' bgneal@1229: result = clean_html(text) bgneal@1229: self.assertEqual(result, '') bgneal@1229: bgneal@1229: @patch('core.html.bleach.clean') bgneal@1229: def test_comments(self, clean_mock): bgneal@1229: text = ' Lorem ipsum ' bgneal@1229: result = clean_html(text) bgneal@1229: self.assertEqual(clean_mock.mock_calls, [ bgneal@1229: call('Lorem ipsum', tags=_CLEAN_PROFILES['comments'][0], bgneal@1229: attributes=_CLEAN_PROFILES['comments'][1], bgneal@1229: styles=_CLEAN_PROFILES['comments'][2], strip=True, bgneal@1229: strip_comments=True), bgneal@1229: ]) bgneal@1229: bgneal@1229: @patch('core.html.bleach.clean') bgneal@1229: def test_comments(self, clean_mock): bgneal@1229: text = ' Lorem ipsum ' bgneal@1229: result = clean_html(text, profile='news') bgneal@1229: self.assertEqual(clean_mock.mock_calls, [ bgneal@1229: call('Lorem ipsum', tags=_CLEAN_PROFILES['news'][0], bgneal@1229: attributes=_CLEAN_PROFILES['news'][1], bgneal@1229: styles=_CLEAN_PROFILES['news'][2], strip=True, bgneal@1229: strip_comments=True), bgneal@1229: ])