julen / pootle

Web-based translation and translation management tool

julen (author)
Thu Aug 14 10:47:47 -0700 2008
commit  d6d4ecdb164c4a0251d376483f5f83741d3253fe
tree    cfee77c9f5af877950fe7ca4441e54a604cad69f
parent  297cfa1a6503925db79f4f88f8f367099a5966a4
pootle / test_create.py
100644 169 lines (146 sloc) 6.813 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/usr/bin/env python
 
"""Basic infrastructure for creating an environment for testing webservers
This gets used by test_cmdlineserver / test_service / test_apache (which are for different webservers)
The top-level tests are then in test_client / test_ie / test_mozilla etc
These can then be layered on top of different test servers"""
 
from Pootle import pootle
from Pootle import users
from jToolkit.web import simplewebserver
from jToolkit.web import session
from jToolkit.data import dates
from jToolkit import prefs
import os
 
sessioncache = session.SessionCache()
 
def isclassmethod(cls, method):
    """returns whether the given method (accessed as a class attribute) is a classmethod"""
    return method.im_self == cls
 
class TestCreate(object):
    """a test class to run tests on a test Pootle Server"""
    def setup_class(cls):
        """create the testing environment"""
        print "setup_class called on", cls.__name__
        cls.save_attribs = cls.__dict__.keys()
        cls.setup_testdir()
        # some testing methods find recreating the webserver per test easier
        if isclassmethod(cls, cls.setup_webserver):
            cls.webserver = cls.setup_webserver()
        else:
            cls.webserver = None
        setupprefs = cls.make_prefs()
        open(cls.prefsfile, "w").write(setupprefs.getsource())
        cls.prefs = prefs.PrefsParser(cls.prefsfile)
        cls.prefs.resolveimportmodules()
        if isclassmethod(cls, cls.setup_pootleserver):
            cls.setup_pootleserver()
 
    def setup_testdir(cls):
        """sets up a test directory"""
        cls.testdir = "%s_testdir" % (cls.__name__)
        cls.cleardir(cls.testdir)
        os.mkdir(cls.testdir)
        cls.podir = os.path.join(cls.testdir, "po")
        os.mkdir(cls.podir)
        cls.prefsfile = os.path.join(cls.testdir, "%s.prefs" % (cls.__name__))
    setup_testdir = classmethod(setup_testdir)
 
    def teardown_testdir(cls):
        """makes sure the test directory is clear"""
        cls.cleardir(cls.testdir)
    teardown_testdir = classmethod(teardown_testdir)
 
    def teardown_class(cls):
        """removes the attributes set up by setup_class"""
        if os.path.exists(cls.prefsfile):
            os.remove(cls.prefsfile)
        cls.teardown_testdir()
        cls.teardown_attribs()
 
    def cleardir(cls, dirname):
        """removes the given directory"""
        if os.path.exists(dirname):
            for dirpath, subdirs, filenames in os.walk(dirname, topdown=False):
                for name in filenames:
                    os.remove(os.path.join(dirpath, name))
                for name in subdirs:
                    os.rmdir(os.path.join(dirpath, name))
        if os.path.exists(dirname): os.rmdir(dirname)
        assert not os.path.exists(dirname)
    cleardir = classmethod(cleardir)
 
    def teardown_attribs(cls):
        """removes class attributes that have been set while running"""
        save_attribs = cls.save_attribs
        for attrib in cls.__dict__.keys():
            if attrib not in save_attribs:
                delattr(cls, attrib)
    teardown_attribs = classmethod(teardown_attribs)
 
    def setup_pootleserver(cls):
        """Sets up a Pootle server, and a session on it"""
        cls.server = pootle.PootleServer(cls.prefs.Pootle, cls.webserver)
        cls.server.name = cls.__name__
        cls.instance = cls.server.instance
        cls.session = cls.setup_session()
    setup_pootleserver = classmethod(setup_pootleserver)
 
    def setup_webserver(cls):
        """setup the webserver that will be used for the tests"""
        return simplewebserver.DummyServer()
    setup_webserver = classmethod(setup_webserver)
 
    def setup_session(cls):
        """sets up the session for the test"""
        session = users.PootleSession(sessioncache, cls.server)
        timestamp = dates.formatdate(dates.currentdate(), '%Y%m%d%H%M%S')
        session.create("admin","",timestamp,'en')
        session.remote_ip = "unit tests..."
        return session
    setup_session = classmethod(setup_session)
 
    def make_initial_prefs(cls):
        return prefs.PrefsParser()
    make_initial_prefs = classmethod(make_initial_prefs)
 
    def make_prefs(cls):
        prefs = cls.make_initial_prefs()
        prefs.setvalue('importmodules.pootle', 'Pootle.pootle')
        prefs.setvalue('Pootle.serverclass', 'pootle.PootleServer')
        instance = prefs.Pootle
        instance.sessionkey = 'change'
        instance.errorfile = os.path.join(cls.testdir, "pootle_unittest-%s-errors.log" % cls.__name__)
        instance.tracefile = os.path.join(cls.testdir, "pootle_unittest-%s-trace.log" % cls.__name__)
        prefs.setvalue("Pootle.languages.zxx.fullname", "Test Language")
        prefs.setvalue("Pootle.projects.testproject.fullname", "Pootle Unit Tests")
        prefs.setvalue("Pootle.projects.testproject.description", "Test Project for verifying functionality")
        prefs.setvalue("Pootle.projects.testproject.localfiletype", "po")
        prefs.setvalue("Pootle.users.testuser.activated", 1)
        testuserprefs = instance.users.testuser
        testuserprefs.passwdhash = session.md5hexdigest("")
        instance.podirectory = cls.podir
        return prefs
    make_prefs = classmethod(make_prefs)
 
    def test_created(self):
        """test that the po directory actually exists"""
        print self.podir
        assert os.path.isdir(self.podir)
 
class NoReuse(TestCreate):
    """don't reuse webserver objects between methods"""
    def setup_webserver(self):
        """setup the webserver that will be used for the tests"""
        return simplewebserver.DummyServer()
 
    def setup_pootleserver(self):
        """Sets up a Pootle server, and a session on it"""
        self.server = pootle.PootleServer(self.prefs.Pootle, self.webserver)
        self.server.name = self.__class__.__name__
        self.instance = self.server.instance
        self.session = self.setup_session()
 
    def setup_session(self):
        """sets up the session for the test"""
        session = users.PootleSession(sessioncache, self.server)
        timestamp = dates.formatdate(dates.currentdate(), '%Y%m%d%H%M%S')
        session.create("admin","",timestamp,'en')
        session.remote_ip = "unit tests..."
        return session
 
    def setup_method(self, method):
        """sets up a webserver and jlogbookserver for this method"""
        self.webserver = self.setup_webserver()
        self.setup_testdir()
        self.setup_pootleserver()
 
    def teardown_method(self, method):
        """sets up a webserver and jlogbookserver for this method"""
        self.server = None
        self.instance = None
        self.logtable = None
        self.session = None
        self.webserver = None
        self.teardown_testdir()