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

Source Code for Module python-module-logilab-mtconverter-0.8.2.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   
 22  from logilab.mtconverter import TransformData, TransformError 
 23  from logilab.mtconverter.transforms import text_to_text 
 24  from logilab.mtconverter.transform import Transform, TransformsChain 
 25  from logilab.mtconverter.engine import TransformEngine 
 26   
 27   
28 -class HtmlToText(Transform):
29 inputs = ('text/html',) 30 output = 'text/plain' 31
32 - def __call__(self, orig):
33 orig = re.sub('<[^>]*>(?i)(?m)', '', orig) 34 return urllib.unquote(re.sub('\n+', '\n', orig)).strip()
35
36 - def _convert(self, data):
37 return self.__call__(data.data)
38
39 -class HtmlToTextWithEncoding(HtmlToText):
40 output_encoding = 'utf8'
41
42 -class FooToBar(Transform):
43 inputs = ('text/*',) 44 output = 'text/bar' 45
46 - def __call__(self, orig):
47 orig = re.sub('foo', 'bar', orig) 48 return urllib.unquote(re.sub('\n+', '\n', orig)).strip()
49
50 - def _convert(self, data):
51 return self.__call__(data.data)
52
53 -class HtmlIdTransform(Transform):
54 inputs = ('text/html',) 55 output = 'text/html' 56
57 - def _convert(self, data):
58 return data.data + ' transformed'
59
60 -class TransformNoIO(Transform):
61 pass
62
63 -class BadTransformNoInput(Transform):
64 inputs = () 65 output = 'text/plain'
66
67 -class BadTransformBadInput1(Transform):
68 inputs = ('text/bla/bla',) 69 output = 'text/plain'
70
71 -class BadTransformBadInput2(Transform):
72 inputs = ('text/',) 73 output = 'text/plain'
74
75 -class BadTransformBadOutput1(Transform):
76 inputs = ('text/plain',) 77 output = 'text/bla/bla'
78
79 -class BadTransformBadOutput2(Transform):
80 inputs = ('text/plain',) 81 output = 'text/'
82
83 -class BadTransformWildcardOutput(Transform):
84 inputs = ('text/plain',) 85 output = 'text/*'
86 87
88 -def html_data():
89 return TransformData('<b>foo</b>', 'text/html', 'ascii')
90
91 -class EngineTC(TestCase):
92 - def setUp(self):
93 self.engine = TransformEngine()
94
95 - def register(self):
96 #A default set of transforms to prove the interfaces work 97 self.engine.add_transform(HtmlToText()) 98 self.engine.add_transform(FooToBar())
99
100 - def test_register_fail(self):
101 register = self.engine.add_transform 102 self.assertRaises(TransformError, register, TransformNoIO()) 103 self.assertRaises(TransformError, register, BadTransformNoInput()) 104 self.assertRaises(TransformError, register, BadTransformBadInput1()) 105 self.assertRaises(TransformError, register, BadTransformBadInput2()) 106 self.assertRaises(TransformError, register, BadTransformWildcardOutput()) 107 self.assertRaises(TransformError, register, BadTransformBadOutput1()) 108 self.assertRaises(TransformError, register, BadTransformBadOutput2())
109
110 - def test_has_input(self):
111 self.register() 112 self.failUnless(self.engine.has_input('text/html')) 113 self.failUnless(self.engine.has_input('text/plain')) 114 self.failUnless(self.engine.has_input('text/whatever')) 115 self.failIf(self.engine.has_input('application/octet-stream'))
116
117 - def test_convert(self):
118 self.register() 119 self.engine.add_transform(text_to_text()) 120 121 data = TransformData("This is a test", 'text/x-diff', 'ascii') 122 out = self.engine.convert(data, 'text/plain') 123 self.failUnlessEqual(out.data, "This is a test") 124 self.failUnlessEqual(out.mimetype, 'text/plain') 125 self.failUnlessEqual(out.encoding, 'ascii') 126 127 # html_to_text transform should take priority over text_to_text 128 data = self.engine.convert(html_data(), "text/plain") 129 self.failUnlessEqual(data.data, "foo") 130 self.failUnlessEqual(data.mimetype, 'text/plain') 131 self.failUnlessEqual(data.encoding, 'ascii') 132 133 self.engine.remove_transform('HtmlToText') 134 self.engine.remove_transform('FooToBar') 135 self.engine.add_transform(HtmlToTextWithEncoding()) 136 data = self.engine.convert(html_data(), "text/plain") 137 self.failUnlessEqual(data.mimetype, 'text/plain') 138 self.failUnlessEqual(data.encoding, 'utf8') 139 140 self.engine.add_transform(FooToBar()) 141 data = self.engine.convert(html_data(), 'text/bar') 142 self.failUnlessEqual(data.data, "<b>bar</b>")
143
144 - def test_chain(self):
145 #self.register() 146 hb = TransformsChain('hbar') 147 hb.append(HtmlToText()) 148 hb.append(FooToBar()) 149 self.engine.add_transform(hb) 150 cache = self.engine.convert(html_data(), 'text/bar') 151 self.failUnlessEqual(cache.data, "bar")
152
153 - def test_same(self):
154 data = TransformData("This is a test", 'text/plain', 'ascii') 155 out = self.engine.convert(data, 'text/plain') 156 self.failUnlessEqual(out.data, "This is a test") 157 self.failUnlessEqual(out.mimetype, 'text/plain') 158 self.failUnlessEqual(out.encoding, 'ascii') 159 160 self.engine.add_transform(HtmlIdTransform()) 161 out = self.engine.convert(html_data(), 'text/html') 162 self.failUnlessEqual(out.data, "<b>foo</b> transformed") 163 self.failUnlessEqual(out.mimetype, 'text/html') 164 self.failUnlessEqual(out.encoding, 'ascii')
165 166
167 - def test_convert_compressed(self):
168 self.register() 169 data = TransformData(open('data.txt.gz', 'rb').read(), 'text/plain', 'gzip') 170 self.assertRaises(TransformError, self.engine.convert, data, 'text/plain') 171 self.engine.add_transform(text_to_text()) 172 self.assertRaises(TransformError, self.engine.convert, data, 'text/plain')
173 174 175 if __name__ == '__main__': 176 unittest_main() 177