Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / utils / testing.py @ 78e1f8da

History | View | Annotate | Download (11.2 kB)

1 f09da76e Kostas Papadimitriou
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 f09da76e Kostas Papadimitriou
#
3 f09da76e Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 f09da76e Kostas Papadimitriou
# without modification, are permitted provided that the following
5 f09da76e Kostas Papadimitriou
# conditions are met:
6 f09da76e Kostas Papadimitriou
#
7 f09da76e Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 f09da76e Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 f09da76e Kostas Papadimitriou
#      disclaimer.
10 f09da76e Kostas Papadimitriou
#
11 f09da76e Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 f09da76e Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 f09da76e Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 f09da76e Kostas Papadimitriou
#      provided with the distribution.
15 f09da76e Kostas Papadimitriou
#
16 f09da76e Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f09da76e Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f09da76e Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f09da76e Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f09da76e Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f09da76e Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f09da76e Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f09da76e Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f09da76e Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f09da76e Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f09da76e Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f09da76e Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 f09da76e Kostas Papadimitriou
#
29 f09da76e Kostas Papadimitriou
# The views and conclusions contained in the software and
30 f09da76e Kostas Papadimitriou
# documentation are those of the authors and should not be
31 f09da76e Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 f09da76e Kostas Papadimitriou
# or implied, of GRNET S.A.
33 f09da76e Kostas Papadimitriou
34 f09da76e Kostas Papadimitriou
35 f09da76e Kostas Papadimitriou
from contextlib import contextmanager
36 d2b8ec7b Christos Stavrakakis
from django.test import TestCase
37 d2b8ec7b Christos Stavrakakis
from django.utils import simplejson as json
38 dcb8545f Christos Stavrakakis
from synnefo.util import text
39 d2b8ec7b Christos Stavrakakis
from mock import patch
40 f09da76e Kostas Papadimitriou
41 f09da76e Kostas Papadimitriou
42 f09da76e Kostas Papadimitriou
@contextmanager
43 f09da76e Kostas Papadimitriou
def override_settings(settings, **kwargs):
44 f09da76e Kostas Papadimitriou
    """
45 f09da76e Kostas Papadimitriou
    Helper context manager to override django settings within the provided
46 f09da76e Kostas Papadimitriou
    context.
47 f09da76e Kostas Papadimitriou

48 f09da76e Kostas Papadimitriou
    All keyword arguments provided are set to the django settings object and
49 f09da76e Kostas Papadimitriou
    get reverted/removed when the manager exits.
50 f09da76e Kostas Papadimitriou

51 f09da76e Kostas Papadimitriou
    >>> from synnefo.util.testing import override_settings
52 f09da76e Kostas Papadimitriou
    >>> from django.conf import settings
53 f09da76e Kostas Papadimitriou
    >>> with override_settings(settings, DEBUG=True):
54 f019f93d Ilias Tsitsimpis
    ...     assert settings.DEBUG == True
55 f09da76e Kostas Papadimitriou

56 f09da76e Kostas Papadimitriou
    The special arguemnt ``prefix`` can be set to prefix all setting keys with
57 f09da76e Kostas Papadimitriou
    the provided value.
58 f09da76e Kostas Papadimitriou

59 f09da76e Kostas Papadimitriou
    >>> from django.conf import settings
60 f09da76e Kostas Papadimitriou
    >>> from django.core import mail
61 f09da76e Kostas Papadimitriou
    >>> with override_settings(settings, CONTACT_EMAILS=['kpap@grnet.gr'],
62 f019f93d Ilias Tsitsimpis
    ...                        prefix='MYAPP_'):
63 f019f93d Ilias Tsitsimpis
    ...     from django.core.mail import send_mail
64 f019f93d Ilias Tsitsimpis
    ...     send_mail("hello", "I love you kpap", settings.DEFAULT_FROM_EMAIL,
65 f019f93d Ilias Tsitsimpis
    ...               settings.MYAPP_CONTACT_EMAILS)
66 f019f93d Ilias Tsitsimpis
    ...     assert 'kpap@grnet.gr' in mail.mailbox[0].recipients()
67 f09da76e Kostas Papadimitriou

68 f09da76e Kostas Papadimitriou
    If you plan to reuse it
69 f09da76e Kostas Papadimitriou

70 f09da76e Kostas Papadimitriou
    >>> import functools
71 f09da76e Kostas Papadimitriou
    >>> from synnefo.util.testing import override_settings
72 f09da76e Kostas Papadimitriou
    >>> from django.conf import settings
73 f09da76e Kostas Papadimitriou
    >>> myapp_settings = functools.partial(override_settings, prefix='MYAPP_')
74 f019f93d Ilias Tsitsimpis
    >>> with myapp_settings(CONTACT_EMAILS=['kpap@grnet.gr']):
75 f019f93d Ilias Tsitsimpis
    ...     assert settings.MYAPP_CONTACT_EMAILS == ['kpap@grnet.gr']
76 f09da76e Kostas Papadimitriou

77 f09da76e Kostas Papadimitriou
    """
78 f09da76e Kostas Papadimitriou
79 f09da76e Kostas Papadimitriou
    _prefix = kwargs.get('prefix', '')
80 f09da76e Kostas Papadimitriou
    prefix = lambda key: '%s%s' % (_prefix, key)
81 f09da76e Kostas Papadimitriou
82 f09da76e Kostas Papadimitriou
    oldkeys = [k for k in dir(settings) if k.upper() == k]
83 f09da76e Kostas Papadimitriou
    oldsettings = dict([(k, getattr(settings, k)) for k in oldkeys])
84 f09da76e Kostas Papadimitriou
85 f09da76e Kostas Papadimitriou
    toremove = []
86 f09da76e Kostas Papadimitriou
    for key, value in kwargs.iteritems():
87 f09da76e Kostas Papadimitriou
        key = prefix(key)
88 f09da76e Kostas Papadimitriou
        if not hasattr(settings, key):
89 f09da76e Kostas Papadimitriou
            toremove.append(key)
90 f09da76e Kostas Papadimitriou
        setattr(settings, key, value)
91 f09da76e Kostas Papadimitriou
92 f09da76e Kostas Papadimitriou
    yield
93 f09da76e Kostas Papadimitriou
94 f09da76e Kostas Papadimitriou
    # Remove keys that didn't exist
95 f09da76e Kostas Papadimitriou
    for key in toremove:
96 f09da76e Kostas Papadimitriou
        delattr(settings, key)
97 f09da76e Kostas Papadimitriou
98 f09da76e Kostas Papadimitriou
    # Remove keys that added during the execution of the context
99 f09da76e Kostas Papadimitriou
    if kwargs.get('reset_changes', True):
100 f09da76e Kostas Papadimitriou
        newkeys = [k for k in dir(settings) if k.upper() == k]
101 f09da76e Kostas Papadimitriou
        for key in newkeys:
102 f09da76e Kostas Papadimitriou
            if not key in oldkeys:
103 f09da76e Kostas Papadimitriou
                delattr(settings, key)
104 f09da76e Kostas Papadimitriou
105 f09da76e Kostas Papadimitriou
    # Revert old keys
106 f09da76e Kostas Papadimitriou
    for key in oldkeys:
107 f09da76e Kostas Papadimitriou
        if key == key.upper():
108 f09da76e Kostas Papadimitriou
            setattr(settings, key, oldsettings.get(key))
109 f09da76e Kostas Papadimitriou
110 f09da76e Kostas Papadimitriou
111 f09da76e Kostas Papadimitriou
def with_settings(settings, prefix='', **override):
112 f09da76e Kostas Papadimitriou
    def wrapper(func):
113 f09da76e Kostas Papadimitriou
        def inner(*args, **kwargs):
114 f09da76e Kostas Papadimitriou
            with override_settings(settings, prefix=prefix, **override):
115 f09da76e Kostas Papadimitriou
                ret = func(*args, **kwargs)
116 f09da76e Kostas Papadimitriou
            return ret
117 f09da76e Kostas Papadimitriou
        return inner
118 f09da76e Kostas Papadimitriou
    return wrapper
119 d2b8ec7b Christos Stavrakakis
120 f3787696 Sofia Papagiannaki
serial = 0
121 f3787696 Sofia Papagiannaki
122 d2b8ec7b Christos Stavrakakis
123 d2b8ec7b Christos Stavrakakis
@contextmanager
124 d2b8ec7b Christos Stavrakakis
def astakos_user(user):
125 d2b8ec7b Christos Stavrakakis
    """
126 d2b8ec7b Christos Stavrakakis
    Context manager to mock astakos response.
127 d2b8ec7b Christos Stavrakakis

128 d2b8ec7b Christos Stavrakakis
    usage:
129 d2b8ec7b Christos Stavrakakis
    with astakos_user("user@user.com"):
130 d2b8ec7b Christos Stavrakakis
        .... make api calls ....
131 d2b8ec7b Christos Stavrakakis

132 d2b8ec7b Christos Stavrakakis
    """
133 d2b8ec7b Christos Stavrakakis
    with patch("snf_django.lib.api.get_token") as get_token:
134 d2b8ec7b Christos Stavrakakis
        get_token.return_value = "DummyToken"
135 b4b82ec4 Giorgos Korfiatis
        with patch('astakosclient.AstakosClient.authenticate') as m2:
136 b4b82ec4 Giorgos Korfiatis
            m2.return_value = {"access": {
137 f019f93d Ilias Tsitsimpis
                "token": {
138 f019f93d Ilias Tsitsimpis
                    "expires": "2013-06-19T15:23:59.975572+00:00",
139 f019f93d Ilias Tsitsimpis
                    "id": "DummyToken",
140 f019f93d Ilias Tsitsimpis
                    "tenant": {
141 b4b82ec4 Giorgos Korfiatis
                        "id": text.udec(user, 'utf8'),
142 f019f93d Ilias Tsitsimpis
                        "name": "Firstname Lastname"
143 f019f93d Ilias Tsitsimpis
                        }
144 f019f93d Ilias Tsitsimpis
                    },
145 f019f93d Ilias Tsitsimpis
                "serviceCatalog": [],
146 f019f93d Ilias Tsitsimpis
                "user": {
147 f019f93d Ilias Tsitsimpis
                    "roles_links": [],
148 f019f93d Ilias Tsitsimpis
                    "id": text.udec(user, 'utf8'),
149 f019f93d Ilias Tsitsimpis
                    "roles": [{"id": 1, "name": "default"}],
150 f019f93d Ilias Tsitsimpis
                    "name": "Firstname Lastname"}}
151 f019f93d Ilias Tsitsimpis
                }
152 b4b82ec4 Giorgos Korfiatis
153 78e1f8da Sofia Papagiannaki
            with patch('astakosclient.AstakosClient.service_get_quotas') as m2:
154 78e1f8da Sofia Papagiannaki
                m2.return_value = {user: {
155 45c0bcf8 Giorgos Korfiatis
                    "system": {
156 45c0bcf8 Giorgos Korfiatis
                        "pithos.diskspace": {
157 45c0bcf8 Giorgos Korfiatis
                            "usage": 0,
158 45c0bcf8 Giorgos Korfiatis
                            "limit": 1073741824,  # 1GB
159 45c0bcf8 Giorgos Korfiatis
                            "pending": 0
160 78e1f8da Sofia Papagiannaki
                            }
161 ef57e622 Ilias Tsitsimpis
                        }
162 ef57e622 Ilias Tsitsimpis
                    }
163 45c0bcf8 Giorgos Korfiatis
                }
164 45c0bcf8 Giorgos Korfiatis
                issue_fun = \
165 45c0bcf8 Giorgos Korfiatis
                    "astakosclient.AstakosClient.issue_one_commission"
166 45c0bcf8 Giorgos Korfiatis
                with patch(issue_fun) as m3:
167 45c0bcf8 Giorgos Korfiatis
                    serials = []
168 45c0bcf8 Giorgos Korfiatis
                    append = serials.append
169 45c0bcf8 Giorgos Korfiatis
170 45c0bcf8 Giorgos Korfiatis
                    def get_serial(*args, **kwargs):
171 45c0bcf8 Giorgos Korfiatis
                        global serial
172 45c0bcf8 Giorgos Korfiatis
                        serial += 1
173 45c0bcf8 Giorgos Korfiatis
                        append(serial)
174 45c0bcf8 Giorgos Korfiatis
                        return serial
175 45c0bcf8 Giorgos Korfiatis
176 45c0bcf8 Giorgos Korfiatis
                    m3.side_effect = get_serial
177 45c0bcf8 Giorgos Korfiatis
                    resolv_fun = \
178 45c0bcf8 Giorgos Korfiatis
                        'astakosclient.AstakosClient.resolve_commissions'
179 45c0bcf8 Giorgos Korfiatis
                    with patch(resolv_fun) as m4:
180 45c0bcf8 Giorgos Korfiatis
                        m4.return_value = {'accepted': serials,
181 45c0bcf8 Giorgos Korfiatis
                                           'rejected': [],
182 45c0bcf8 Giorgos Korfiatis
                                           'failed': []}
183 45c0bcf8 Giorgos Korfiatis
                        users_fun = \
184 45c0bcf8 Giorgos Korfiatis
                            'astakosclient.AstakosClient.get_usernames'
185 45c0bcf8 Giorgos Korfiatis
                        with patch(users_fun) as m5:
186 45c0bcf8 Giorgos Korfiatis
187 45c0bcf8 Giorgos Korfiatis
                            def get_usernames(*args, **kwargs):
188 45c0bcf8 Giorgos Korfiatis
                                uuids = args[-1]
189 45c0bcf8 Giorgos Korfiatis
                                return dict((uuid, uuid) for uuid in uuids)
190 45c0bcf8 Giorgos Korfiatis
191 45c0bcf8 Giorgos Korfiatis
                            m5.side_effect = get_usernames
192 45c0bcf8 Giorgos Korfiatis
                            yield
193 184a2a8c Christos Stavrakakis
194 184a2a8c Christos Stavrakakis
195 2c6ac437 Christos Stavrakakis
serial = 0
196 2c6ac437 Christos Stavrakakis
197 2c6ac437 Christos Stavrakakis
198 184a2a8c Christos Stavrakakis
@contextmanager
199 184a2a8c Christos Stavrakakis
def mocked_quotaholder(success=True):
200 27899d6f Christos Stavrakakis
    with patch("synnefo.quotas.Quotaholder.get") as astakos:
201 184a2a8c Christos Stavrakakis
        global serial
202 f2080d16 Christos Stavrakakis
        serial += 10
203 f2080d16 Christos Stavrakakis
204 f2080d16 Christos Stavrakakis
        def foo(*args, **kwargs):
205 f2080d16 Christos Stavrakakis
            return (len(astakos.return_value.issue_one_commission.mock_calls) +
206 f2080d16 Christos Stavrakakis
                    serial)
207 f2080d16 Christos Stavrakakis
        astakos.return_value.issue_one_commission.side_effect = foo
208 ba777b02 Giorgos Korfiatis
        def resolve_mock(*args, **kwargs):
209 ba777b02 Giorgos Korfiatis
            return {"failed": [],
210 ba777b02 Giorgos Korfiatis
                    "accepted": args[0],
211 ba777b02 Giorgos Korfiatis
                    "rejected": args[1],
212 ba777b02 Giorgos Korfiatis
                    }
213 ba777b02 Giorgos Korfiatis
        astakos.return_value.resolve_commissions.side_effect = resolve_mock
214 41a7fae7 Christos Stavrakakis
        yield astakos.return_value
215 184a2a8c Christos Stavrakakis
216 d2b8ec7b Christos Stavrakakis
217 d2b8ec7b Christos Stavrakakis
class BaseAPITest(TestCase):
218 d2b8ec7b Christos Stavrakakis
    def get(self, url, user='user', *args, **kwargs):
219 d2b8ec7b Christos Stavrakakis
        with astakos_user(user):
220 e5a47968 Christos Stavrakakis
            with mocked_quotaholder():
221 e5a47968 Christos Stavrakakis
                response = self.client.get(url, *args, **kwargs)
222 d2b8ec7b Christos Stavrakakis
        return response
223 d2b8ec7b Christos Stavrakakis
224 d2b8ec7b Christos Stavrakakis
    def delete(self, url, user='user'):
225 d2b8ec7b Christos Stavrakakis
        with astakos_user(user):
226 5b8a9240 Christos Stavrakakis
            with mocked_quotaholder() as m:
227 5b8a9240 Christos Stavrakakis
                self.mocked_quotaholder = m
228 e5a47968 Christos Stavrakakis
                response = self.client.delete(url)
229 d2b8ec7b Christos Stavrakakis
        return response
230 d2b8ec7b Christos Stavrakakis
231 d2b8ec7b Christos Stavrakakis
    def post(self, url, user='user', params={}, ctype='json', *args, **kwargs):
232 d2b8ec7b Christos Stavrakakis
        if ctype == 'json':
233 d2b8ec7b Christos Stavrakakis
            content_type = 'application/json'
234 d2b8ec7b Christos Stavrakakis
        with astakos_user(user):
235 5b8a9240 Christos Stavrakakis
            with mocked_quotaholder() as m:
236 5b8a9240 Christos Stavrakakis
                self.mocked_quotaholder = m
237 e5a47968 Christos Stavrakakis
                response = self.client.post(url, params,
238 e5a47968 Christos Stavrakakis
                                            content_type=content_type,
239 e5a47968 Christos Stavrakakis
                                            *args, **kwargs)
240 d2b8ec7b Christos Stavrakakis
        return response
241 d2b8ec7b Christos Stavrakakis
242 d2b8ec7b Christos Stavrakakis
    def put(self, url, user='user', params={}, ctype='json', *args, **kwargs):
243 d2b8ec7b Christos Stavrakakis
        if ctype == 'json':
244 d2b8ec7b Christos Stavrakakis
            content_type = 'application/json'
245 d2b8ec7b Christos Stavrakakis
        with astakos_user(user):
246 5b8a9240 Christos Stavrakakis
            with mocked_quotaholder() as m:
247 5b8a9240 Christos Stavrakakis
                self.mocked_quotaholder = m
248 e5a47968 Christos Stavrakakis
                response = self.client.put(url, params,
249 e5a47968 Christos Stavrakakis
                                           content_type=content_type,
250 e5a47968 Christos Stavrakakis
                                           *args, **kwargs)
251 d2b8ec7b Christos Stavrakakis
        return response
252 d2b8ec7b Christos Stavrakakis
253 d2b8ec7b Christos Stavrakakis
    def assertSuccess(self, response):
254 14402edc Christos Stavrakakis
        self.assertTrue(response.status_code in [200, 202, 203, 204],
255 14402edc Christos Stavrakakis
                        msg=response.content)
256 d2b8ec7b Christos Stavrakakis
257 83157287 Dionysis Grigoropoulos
    def assertSuccess201(self, response):
258 14402edc Christos Stavrakakis
        self.assertEqual(response.status_code, 201, msg=response.content)
259 83157287 Dionysis Grigoropoulos
260 14402edc Christos Stavrakakis
    def assertFault(self, response, status_code, name, msg=''):
261 14402edc Christos Stavrakakis
        self.assertEqual(response.status_code, status_code,
262 14402edc Christos Stavrakakis
                         msg=msg)
263 d2b8ec7b Christos Stavrakakis
        fault = json.loads(response.content)
264 d2b8ec7b Christos Stavrakakis
        self.assertEqual(fault.keys(), [name])
265 d2b8ec7b Christos Stavrakakis
266 d2b8ec7b Christos Stavrakakis
    def assertBadRequest(self, response):
267 14402edc Christos Stavrakakis
        self.assertFault(response, 400, 'badRequest', msg=response.content)
268 d2b8ec7b Christos Stavrakakis
269 fde2c1f7 Christos Stavrakakis
    def assertConflict(self, response):
270 14402edc Christos Stavrakakis
        self.assertFault(response, 409, 'conflict', msg=response.content)
271 fde2c1f7 Christos Stavrakakis
272 d2b8ec7b Christos Stavrakakis
    def assertItemNotFound(self, response):
273 14402edc Christos Stavrakakis
        self.assertFault(response, 404, 'itemNotFound', msg=response.content)
274 2ef199c9 Dionysis Grigoropoulos
275 2ad4eb80 Kostas Papadimitriou
    def assertMethodNotAllowed(self, response):
276 14402edc Christos Stavrakakis
        self.assertFault(response, 405, 'notAllowed', msg=response.content)
277 2aba7764 Sofia Papagiannaki
        self.assertTrue('Allow' in response)
278 2ad4eb80 Kostas Papadimitriou
        try:
279 2ad4eb80 Kostas Papadimitriou
            error = json.loads(response.content)
280 2ad4eb80 Kostas Papadimitriou
        except ValueError:
281 2ad4eb80 Kostas Papadimitriou
            self.assertTrue(False)
282 2aba7764 Sofia Papagiannaki
        self.assertEqual(error['notAllowed']['message'], 'Method not allowed')
283 2ad4eb80 Kostas Papadimitriou
284 aba462a2 Giorgos Korfiatis
285 aba462a2 Giorgos Korfiatis
# Imitate unittest assertions new in Python 2.7
286 aba462a2 Giorgos Korfiatis
287 aba462a2 Giorgos Korfiatis
class _AssertRaisesContext(object):
288 aba462a2 Giorgos Korfiatis
    """
289 aba462a2 Giorgos Korfiatis
    A context manager used to implement TestCase.assertRaises* methods.
290 aba462a2 Giorgos Korfiatis
    Adapted from unittest2.
291 aba462a2 Giorgos Korfiatis
    """
292 aba462a2 Giorgos Korfiatis
293 aba462a2 Giorgos Korfiatis
    def __init__(self, expected):
294 aba462a2 Giorgos Korfiatis
        self.expected = expected
295 aba462a2 Giorgos Korfiatis
296 aba462a2 Giorgos Korfiatis
    def __enter__(self):
297 aba462a2 Giorgos Korfiatis
        return self
298 aba462a2 Giorgos Korfiatis
299 aba462a2 Giorgos Korfiatis
    def __exit__(self, exc_type, exc_value, tb):
300 aba462a2 Giorgos Korfiatis
        if exc_type is None:
301 aba462a2 Giorgos Korfiatis
            try:
302 aba462a2 Giorgos Korfiatis
                exc_name = self.expected.__name__
303 aba462a2 Giorgos Korfiatis
            except AttributeError:
304 aba462a2 Giorgos Korfiatis
                exc_name = str(self.expected)
305 aba462a2 Giorgos Korfiatis
            raise AssertionError(
306 aba462a2 Giorgos Korfiatis
                "%s not raised" % (exc_name,))
307 aba462a2 Giorgos Korfiatis
        if not issubclass(exc_type, self.expected):
308 aba462a2 Giorgos Korfiatis
            # let unexpected exceptions pass through
309 aba462a2 Giorgos Korfiatis
            return False
310 aba462a2 Giorgos Korfiatis
        self.exception = exc_value  # store for later retrieval
311 aba462a2 Giorgos Korfiatis
        return True
312 aba462a2 Giorgos Korfiatis
313 aba462a2 Giorgos Korfiatis
314 aba462a2 Giorgos Korfiatis
def assertRaises(excClass):
315 aba462a2 Giorgos Korfiatis
    return _AssertRaisesContext(excClass)
316 aba462a2 Giorgos Korfiatis
317 aba462a2 Giorgos Korfiatis
318 aba462a2 Giorgos Korfiatis
def assertGreater(x, y):
319 aba462a2 Giorgos Korfiatis
    assert x > y
320 aba462a2 Giorgos Korfiatis
321 aba462a2 Giorgos Korfiatis
322 aba462a2 Giorgos Korfiatis
def assertIn(x, y):
323 aba462a2 Giorgos Korfiatis
    assert x in y