fix git support for v1.5.3 (or higher) by setting "--work-tree"
[translate_toolkit.git] / storage / test_factory.py
bloba47627433430a1bb30e1d32cf435797724ab1d68
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
4 from translate.storage import factory
5 from translate.storage.directory import Directory
6 from translate.misc import wStringIO
8 from gzip import GzipFile
9 try:
10 # bz2 is not available on python 2.3
11 from bz2 import BZ2File
12 except ImportError:
13 BZ2File = None
14 import os
16 def classname(filename):
17 """returns the classname to ease testing"""
18 classinstance = factory.getclass(filename)
19 return str(classinstance.__name__).lower()
21 def givefile(filename, content):
22 """returns a file dummy object with the given content"""
23 file = wStringIO.StringIO(content)
24 file.name = filename
25 return file
27 class BaseTestFactory:
28 def setup_method(self, method):
29 """sets up a test directory"""
30 self.testdir = "%s_testdir" % (self.__class__.__name__)
31 self.cleardir(self.testdir)
32 os.mkdir(self.testdir)
34 def teardown_method(self, method):
35 """removes the attributes set up by setup_method"""
36 self.cleardir(self.testdir)
38 def cleardir(self, dirname):
39 """removes the given directory"""
40 if os.path.exists(dirname):
41 for dirpath, subdirs, filenames in os.walk(dirname, topdown=False):
42 for name in filenames:
43 os.remove(os.path.join(dirpath, name))
44 for name in subdirs:
45 os.rmdir(os.path.join(dirpath, name))
46 if os.path.exists(dirname): os.rmdir(dirname)
47 assert not os.path.exists(dirname)
48 cleardir = classmethod(cleardir)
50 def test_getclass(self):
51 assert classname("file.po") == "pofile"
52 assert classname("file.pot") == "pofile"
53 assert classname("file.dtd.po") == "pofile"
55 assert classname("file.tmx") == "tmxfile"
56 assert classname("file.af.tmx") == "tmxfile"
57 assert classname("file.tbx") == "tbxfile"
58 assert classname("file.po.xliff") == "xlifffile"
60 assert not classname("file.po") == "tmxfile"
61 assert not classname("file.po") == "xlifffile"
63 assert classname("file.po.gz") == "pofile"
64 assert classname("file.pot.gz") == "pofile"
65 assert classname("file.dtd.po.gz") == "pofile"
67 assert classname("file.tmx.gz") == "tmxfile"
68 assert classname("file.af.tmx.gz") == "tmxfile"
69 assert classname("file.tbx.gz") == "tbxfile"
70 assert classname("file.po.xliff.gz") == "xlifffile"
72 assert not classname("file.po.gz") == "tmxfile"
73 assert not classname("file.po.gz") == "xlifffile"
75 assert classname("file.po.bz2") == "pofile"
76 assert classname("file.pot.bz2") == "pofile"
77 assert classname("file.dtd.po.bz2") == "pofile"
79 assert classname("file.tmx.bz2") == "tmxfile"
80 assert classname("file.af.tmx.bz2") == "tmxfile"
81 assert classname("file.tbx.bz2") == "tbxfile"
82 assert classname("file.po.xliff.bz2") == "xlifffile"
84 assert not classname("file.po.bz2") == "tmxfile"
85 assert not classname("file.po.bz2") == "xlifffile"
87 def test_getobject(self):
88 """Tests that we get a valid object."""
89 fileobj = givefile(self.filename, self.file_content)
90 store = factory.getobject(fileobj)
91 assert isinstance(store, self.expected_instance)
93 def test_get_noname_object(self):
94 """Tests that we get a valid object from a file object without a name."""
95 fileobj = wStringIO.StringIO(self.file_content)
96 assert not hasattr(fileobj, 'name')
97 store = factory.getobject(fileobj)
98 assert isinstance(store, self.expected_instance)
100 def test_gzfile(self):
101 """Test that we can open a gzip file correctly."""
102 filename = os.path.join(self.testdir, self.filename + '.gz')
103 gzfile = GzipFile(filename, mode="wb")
104 gzfile.write(self.file_content)
105 gzfile.close()
106 store = factory.getobject(filename)
107 assert isinstance(store, self.expected_instance)
109 def test_bz2file(self):
110 """Test that we can open a gzip file correctly."""
111 if not BZ2File:
112 return
113 filename = os.path.join(self.testdir, self.filename + '.bz2')
114 bz2file = BZ2File(filename, mode="wb")
115 bz2file.write(self.file_content)
116 bz2file.close()
117 store = factory.getobject(filename)
118 assert isinstance(store, self.expected_instance)
120 def test_directory(self):
121 """Test that a directory is correctly detected."""
122 object = factory.getobject(self.testdir)
123 assert isinstance(object, Directory)
125 class TestPOFactory(BaseTestFactory):
126 expected_instance = factory.po.pofile
127 filename = 'dummy.po'
128 file_content = '''#: test.c\nmsgid "test"\nmsgstr "rest"\n'''
130 class TestXliffFactory(BaseTestFactory):
131 expected_instance = factory.xliff.xlifffile
132 filename = 'dummy.xliff'
133 file_content = '''<?xml version="1.0" encoding="utf-8"?>
134 <xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
135 <file>
136 <body>
137 <trans-unit>
138 <source>test</source>
139 <target>rest</target>
140 </trans-unit>
141 </body>
142 </file>
143 </xliff>'''
145 class TestPOXliffFactory(BaseTestFactory):
146 expected_instance = factory.poxliff.PoXliffFile
147 filename = 'dummy.xliff'
148 file_content = '''<?xml version="1.0" encoding="utf-8"?>
149 <xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
150 <file datatype="po" original="file.po" source-language="en-US"><body><trans-unit approved="no" id="1" restype="x-gettext-domain-header" xml:space="preserve">
151 <source>MIME-Version: 1.0
152 Content-Type: text/plain; charset=UTF-8
153 Content-Transfer-Encoding: 8bit
154 </source>
155 <target>MIME-Version: 1.0
156 Content-Type: text/plain; charset=UTF-8
157 Content-Transfer-Encoding: 8bit
158 </target>
159 </trans-unit></body></file></xliff>'''
161 class TestWordfastFactory(BaseTestFactory):
162 expected_instance = factory.wordfast.WordfastTMFile
163 filename = 'dummy.txt'
164 file_content = '''%20070801~103212 %User ID,S,S SMURRAY,SMS Samuel Murray-Smit,SM Samuel Murray-Smit,MW Mary White,DS Deepak Shota,MT! Machine translation (15),AL! Alignment (10),SM Samuel Murray, %TU=00000075 %AF-ZA %Wordfast TM v.5.51r/00 %EN-ZA %---80597535 Subject (5),EL,EL Electronics,AC Accounting,LE Legal,ME Mechanics,MD Medical,LT Literary,AG Agriculture,CO Commercial Client (5),LS,LS LionSoft Corp,ST SuperTron Inc,CA CompArt Ltd
165 20070801~103248 SM 0 AF-ZA Langeraad en duimpie EN-ZA Big Ben and Little John EL LS'''