wsgi/test/unittest_wsgi.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Wed, 25 Mar 2015 14:20:56 +0100
changeset 10837 b71511460a4f
parent 10748 a704babdc840
child 11017 3dfed980071c
permissions -rw-r--r--
[devtools/testlib] Remove assertions about direct usage of CubicWebTC/AutomaticWebTest The point is to be able to use a test runner other than pytest (e.g. nose2, nosetests or py.test) to run CubicWeb test suite. The issue is that most other test loaders inspects members of all base classes of test case classes to determine test methods and it hits this `config` property (actually executing it), which breaks the assertion. So just return None instead of failing. Closes #7817147.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9946
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
     1
# encoding=utf-8
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
     2
9939
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     3
import webtest.app
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
     4
from io import BytesIO
9939
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     5
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     6
from cubicweb.devtools.webtest import CubicWebTestTC
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     7
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     8
from cubicweb.wsgi.request import CubicWebWsgiRequest
9995
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
     9
from cubicweb.multipart import MultipartError
9939
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    10
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    11
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    12
class WSGIAppTC(CubicWebTestTC):
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    13
    def test_content_type(self):
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    14
        r = webtest.app.TestRequest.blank('/', {'CONTENT_TYPE': 'text/plain'})
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    15
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    16
        req = CubicWebWsgiRequest(r.environ, self.vreg)
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    17
46a8ed48636f [wsgi] Honor the 'CONTENT_TYPE' wsgi variable
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    18
        self.assertEqual('text/plain', req.get_header('Content-Type'))
9940
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    19
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    20
    def test_content_body(self):
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    21
        r = webtest.app.TestRequest.blank('/', {
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    22
            'CONTENT_LENGTH': 12,
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    23
            'CONTENT_TYPE': 'text/plain',
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
    24
            'wsgi.input': BytesIO(b'some content')})
9940
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    25
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    26
        req = CubicWebWsgiRequest(r.environ, self.vreg)
292f786009ba [wsgi] Re-set the request content after calling the inherited constructor.
Christophe de Vienne <christophe@unlish.com>
parents: 9939
diff changeset
    27
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
    28
        self.assertEqual(b'some content', req.content.read())
9941
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    29
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    30
    def test_http_scheme(self):
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    31
        r = webtest.app.TestRequest.blank('/', {
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    32
            'wsgi.url_scheme': 'http'})
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    33
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    34
        req = CubicWebWsgiRequest(r.environ, self.vreg)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    35
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    36
        self.assertFalse(req.https)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    37
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    38
    def test_https_scheme(self):
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    39
        r = webtest.app.TestRequest.blank('/', {
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    40
            'wsgi.url_scheme': 'https'})
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    41
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    42
        req = CubicWebWsgiRequest(r.environ, self.vreg)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    43
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    44
        self.assertTrue(req.https)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    45
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    46
    def test_https_prefix(self):
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    47
        r = webtest.app.TestRequest.blank('/https/', {
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    48
            'wsgi.url_scheme': 'http'})
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    49
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    50
        req = CubicWebWsgiRequest(r.environ, self.vreg)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    51
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    52
        self.assertTrue(req.https)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
    53
9942
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    54
    def test_big_content(self):
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
    55
        content = b'x'*100001
9942
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    56
        r = webtest.app.TestRequest.blank('/', {
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    57
            'CONTENT_LENGTH': len(content),
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    58
            'CONTENT_TYPE': 'text/plain',
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
    59
            'wsgi.input': BytesIO(content)})
9942
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    60
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    61
        req = CubicWebWsgiRequest(r.environ, self.vreg)
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    62
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    63
        self.assertEqual(content, req.content.read())
4b99196102f0 [wsgi] Add missing import
Christophe de Vienne <christophe@unlish.com>
parents: 9941
diff changeset
    64
9943
a4aeee690bff [wsgi] Set self.vreg
Christophe de Vienne <christophe@unlish.com>
parents: 9942
diff changeset
    65
    def test_post(self):
a4aeee690bff [wsgi] Set self.vreg
Christophe de Vienne <christophe@unlish.com>
parents: 9942
diff changeset
    66
        self.webapp.post(
a4aeee690bff [wsgi] Set self.vreg
Christophe de Vienne <christophe@unlish.com>
parents: 9942
diff changeset
    67
            '/',
a4aeee690bff [wsgi] Set self.vreg
Christophe de Vienne <christophe@unlish.com>
parents: 9942
diff changeset
    68
            params={'__login': self.admlogin, '__password': self.admpassword})
a4aeee690bff [wsgi] Set self.vreg
Christophe de Vienne <christophe@unlish.com>
parents: 9942
diff changeset
    69
9995
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    70
    def test_post_bad_form(self):
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    71
        with self.assertRaises(MultipartError):
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    72
            self.webapp.post(
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    73
                '/',
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    74
                params='badcontent',
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    75
                headers={'Content-Type': 'multipart/form-data'})
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    76
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    77
    def test_post_non_form(self):
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    78
        self.webapp.post(
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    79
            '/',
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    80
            params='{}',
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    81
            headers={'Content-Type': 'application/json'})
c9f1111e0ee8 [wsgi] If multipart cannot parse the POST content, let it pass.
Christophe de Vienne <christophe@unlish.com>
parents: 9988
diff changeset
    82
9944
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    83
    def test_get_multiple_variables(self):
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    84
        r = webtest.app.TestRequest.blank('/?arg=1&arg=2')
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    85
        req = CubicWebWsgiRequest(r.environ, self.vreg)
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    86
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    87
        self.assertEqual([u'1', u'2'], req.form['arg'])
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    88
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    89
    def test_post_multiple_variables(self):
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    90
        r = webtest.app.TestRequest.blank('/', POST='arg=1&arg=2')
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    91
        req = CubicWebWsgiRequest(r.environ, self.vreg)
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    92
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    93
        self.assertEqual([u'1', u'2'], req.form['arg'])
9b3b21b7ff3e [wsgi] Fix multiple variables reading in params
Christophe de Vienne <christophe@unlish.com>
parents: 9943
diff changeset
    94
9988
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
    95
    def test_post_files(self):
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
    96
        content_type, params = self.webapp.encode_multipart(
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
    97
            (), (('filefield', 'aname', b'acontent'),))
9988
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
    98
        r = webtest.app.TestRequest.blank(
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
    99
            '/', POST=params, content_type=content_type)
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
   100
        req = CubicWebWsgiRequest(r.environ, self.vreg)
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
   101
        self.assertIn('filefield', req.form)
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
   102
        fieldvalue = req.form['filefield']
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
   103
        self.assertEqual(u'aname', fieldvalue[0])
10748
a704babdc840 [wsgi/test] use bytes instead of str for POST body
Julien Cristau <julien.cristau@logilab.fr>
parents: 10670
diff changeset
   104
        self.assertEqual(b'acontent', fieldvalue[1].read())
9988
623707a0c404 [wsgi] Fix posted files filename reading
Christophe de Vienne <christophe@unlish.com>
parents: 9946
diff changeset
   105
9946
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   106
    def test_post_unicode_urlencoded(self):
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   107
        params = 'arg=%C3%A9'
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   108
        r = webtest.app.TestRequest.blank(
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   109
            '/', POST=params, content_type='application/x-www-form-urlencoded')
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   110
        req = CubicWebWsgiRequest(r.environ, self.vreg)
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   111
        self.assertEqual(u"é", req.form['arg'])
ec88c1a1904a [wsgi] Fix unicode decoding in POST
Christophe de Vienne <christophe@unlish.com>
parents: 9944
diff changeset
   112
9941
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
   113
    @classmethod
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
   114
    def init_config(cls, config):
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
   115
        super(WSGIAppTC, cls).init_config(config)
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
   116
        config.https_uiprops = None
8dc1c96d29f1 [wsgi] Fix https detection
Christophe de Vienne <christophe@unlish.com>
parents: 9940
diff changeset
   117
        config.https_datadir_url = None
10670
96380c1524b0 [wsgi/test] add __main__ section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9995
diff changeset
   118
96380c1524b0 [wsgi/test] add __main__ section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9995
diff changeset
   119
96380c1524b0 [wsgi/test] add __main__ section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9995
diff changeset
   120
if __name__ == '__main__':
96380c1524b0 [wsgi/test] add __main__ section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9995
diff changeset
   121
    import unittest
96380c1524b0 [wsgi/test] add __main__ section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9995
diff changeset
   122
    unittest.main()