Package python-module-logilab-mtconverter-0 :: Package 8 :: Package 4 :: Package test :: Module unittest_engine
[frames] | no frames]

Source Code for Module python-module-logilab-mtconverter-0.8.4.test.unittest_engine

  1  # copyright 2006-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. 
  2  # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr 
  3  # 
  4  # This file is part of logilab-mtconverter. 
  5  # 
  6  # logilab-mtconverter is free software: you can redistribute it and/or modify it 
  7  # under the terms of the GNU Lesser General Public License as published by the 
  8  # Free Software Foundation, either version 2.1 of the License, or (at your 
  9  # option) any later version. 
 10  # 
 11  # logilab-mtconverter is distributed in the hope that it will be useful, but 
 12  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
 13  # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License 
 14  # for more details. 
 15  # 
 16  # You should have received a copy of the GNU Lesser General Public License along 
 17  # with logilab-mtconverter. If not, see <http://www.gnu.org/licenses/>. 
 18  from logilab.common.testlib import TestCase, unittest_main 
 19  import urllib 
 20  import re 
 21  import os.path as osp 
 22   
 23  from logilab.mtconverter import TransformData, TransformError 
 24  from logilab.mtconverter.transforms import text_to_text 
 25  from logilab.mtconverter.transform import Transform, TransformsChain 
 26  from logilab.mtconverter.engine import TransformEngine 
 27   
 28  DATAPATH = osp.dirname(__file__) 
 29   
30 -class HtmlToText(Transform):
31 inputs = ('text/html',) 32 output = 'text/plain' 33
34 - def __call__(self, orig):
35 orig = re.sub('<[^>]*>(?i)(?m)', '', orig) 36 return urllib.unquote(re.sub('\n+', '\n', orig)).strip()
37
38 - def _convert(self, data):
39 return self.__call__(data.data)
40
41 -class HtmlToTextWithEncoding(HtmlToText):
42 output_encoding = 'utf8'
43
44 -class FooToBar(Transform):
45 inputs = ('text/*',) 46 output = 'text/bar' 47
48 - def __call__(self, orig):
49 orig = re.sub('foo', 'bar', orig) 50 return urllib.unquote(re.sub('\n+', '\n', orig)).strip()
51
52 - def _convert(self, data):
53 return self.__call__(data.data)
54
55 -class HtmlIdTransform(Transform):
56 inputs = ('text/html',) 57 output = 'text/html' 58
59 - def _convert(self, data):
60 return data.data + ' transformed'
61
62 -class TransformNoIO(Transform):
63 pass
64
65 -class BadTransformNoInput(Transform):
66 inputs = () 67 output = 'text/plain'
68
69 -class BadTransformBadInput1(Transform):
70 inputs = ('text/bla/bla',) 71 output = 'text/plain'
72
73 -class BadTransformBadInput2(Transform):
74 inputs = ('text/',) 75 output = 'text/plain'
76
77 -class BadTransformBadOutput1(Transform):
78 inputs = ('text/plain',) 79 output = 'text/bla/bla'
80
81 -class BadTransformBadOutput2(Transform):
82 inputs = ('text/plain',) 83 output = 'text/'
84
85 -class BadTransformWildcardOutput(Transform):
86 inputs = ('text/plain',) 87 output = 'text/*'
88 89
90 -def html_data():
91 return TransformData('<b>foo</b>', 'text/html', 'ascii')
92
93 -class EngineTC(TestCase):
94 - def setUp(self):
95 self.engine = TransformEngine()
96
97 - def register(self):
98 #A default set of transforms to prove the interfaces work 99 self.engine.add_transform(HtmlToText()) 100 self.engine.add_transform(FooToBar())
101
102 - def test_register_fail(self):
103 register = self.engine.add_transform 104 self.assertRaises(TransformError, register, TransformNoIO()) 105 self.assertRaises(TransformError, register, BadTransformNoInput()) 106 self.assertRaises(TransformError, register, BadTransformBadInput1()) 107 self.assertRaises(TransformError, register, BadTransformBadInput2()) 108 self.assertRaises(TransformError, register, BadTransformWildcardOutput()) 109 self.assertRaises(TransformError, register, BadTransformBadOutput1()) 110 self.assertRaises(TransformError, register, BadTransformBadOutput2())
111
112 - def test_has_input(self):
113 self.register() 114 self.assertTrue(self.engine.has_input('text/html')) 115 self.assertTrue(self.engine.has_input('text/plain')) 116 self.assertTrue(self.engine.has_input('text/whatever')) 117 self.assertFalse(self.engine.has_input('application/octet-stream'))
118
119 - def test_convert(self):
120 self.register() 121 self.engine.add_transform(text_to_text()) 122 123 data = TransformData("This is a test", 'text/x-diff', 'ascii') 124 out = self.engine.convert(data, 'text/plain') 125 self.assertEqual(out.data, "This is a test") 126 self.assertEqual(out.mimetype, 'text/plain') 127 self.assertEqual(out.encoding, 'ascii') 128 129 # html_to_text transform should take priority over text_to_text 130 data = self.engine.convert(html_data(), "text/plain") 131 self.assertEqual(data.data, "foo") 132 self.assertEqual(data.mimetype, 'text/plain') 133 self.assertEqual(data.encoding, 'ascii') 134 135 self.engine.remove_transform('HtmlToText') 136 self.engine.remove_transform('FooToBar') 137 self.engine.add_transform(HtmlToTextWithEncoding()) 138 data = self.engine.convert(html_data(), "text/plain") 139 self.assertEqual(data.mimetype, 'text/plain') 140 self.assertEqual(data.encoding, 'utf8') 141 142 self.engine.add_transform(FooToBar()) 143 data = self.engine.convert(html_data(), 'text/bar') 144 self.assertEqual(data.data, "<b>bar</b>")
145
146 - def test_chain(self):
147 #self.register() 148 hb = TransformsChain('hbar') 149 hb.append(HtmlToText()) 150 hb.append(FooToBar()) 151 self.engine.add_transform(hb) 152 cache = self.engine.convert(html_data(), 'text/bar') 153 self.assertEqual(cache.data, "bar")
154
155 - def test_same(self):
156 data = TransformData("This is a test", 'text/plain', 'ascii') 157 out = self.engine.convert(data, 'text/plain') 158 self.assertEqual(out.data, "This is a test") 159 self.assertEqual(out.mimetype, 'text/plain') 160 self.assertEqual(out.encoding, 'ascii') 161 162 self.engine.add_transform(HtmlIdTransform()) 163 out = self.engine.convert(html_data(), 'text/html') 164 self.assertEqual(out.data, "<b>foo</b> transformed") 165 self.assertEqual(out.mimetype, 'text/html') 166 self.assertEqual(out.encoding, 'ascii')
167 168
169 - def test_convert_compressed(self):
170 self.register() 171 data = TransformData(open(osp.join(DATAPATH, 'data.txt.gz'), 'rb').read(), 'text/plain', 'gzip') 172 self.assertRaises(TransformError, self.engine.convert, data, 'text/plain') 173 self.engine.add_transform(text_to_text()) 174 self.assertRaises(TransformError, self.engine.convert, data, 'text/plain')
175 176 177 if __name__ == '__main__': 178 unittest_main() 179