wsgi/test/unittest_wsgi.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 20 Nov 2015 14:17:46 +0100
changeset 10900 d666c9386b58
parent 10748 a704babdc840
child 11017 3dfed980071c
permissions -rw-r--r--
[test/tox] Enforce installation of modified yapps 580a6821713d is not enough for tox apparently... The thing is that it will first install dependencies (the `deps` option from tox.ini), actually pulling yapps from Logilab github but then, it will install the project (that is, CubicWeb) from the sdist *along with its dependencies*, which will pull yapps again and override the previously installed version for some mysterious reason. So add a `pip install` command in tox.ini, so that the modified yapps is the last one installed.

# encoding=utf-8

import webtest.app
from io import BytesIO

from cubicweb.devtools.webtest import CubicWebTestTC

from cubicweb.wsgi.request import CubicWebWsgiRequest
from cubicweb.multipart import MultipartError


class WSGIAppTC(CubicWebTestTC):
    def test_content_type(self):
        r = webtest.app.TestRequest.blank('/', {'CONTENT_TYPE': 'text/plain'})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertEqual('text/plain', req.get_header('Content-Type'))

    def test_content_body(self):
        r = webtest.app.TestRequest.blank('/', {
            'CONTENT_LENGTH': 12,
            'CONTENT_TYPE': 'text/plain',
            'wsgi.input': BytesIO(b'some content')})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertEqual(b'some content', req.content.read())

    def test_http_scheme(self):
        r = webtest.app.TestRequest.blank('/', {
            'wsgi.url_scheme': 'http'})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertFalse(req.https)

    def test_https_scheme(self):
        r = webtest.app.TestRequest.blank('/', {
            'wsgi.url_scheme': 'https'})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertTrue(req.https)

    def test_https_prefix(self):
        r = webtest.app.TestRequest.blank('/https/', {
            'wsgi.url_scheme': 'http'})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertTrue(req.https)

    def test_big_content(self):
        content = b'x'*100001
        r = webtest.app.TestRequest.blank('/', {
            'CONTENT_LENGTH': len(content),
            'CONTENT_TYPE': 'text/plain',
            'wsgi.input': BytesIO(content)})

        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertEqual(content, req.content.read())

    def test_post(self):
        self.webapp.post(
            '/',
            params={'__login': self.admlogin, '__password': self.admpassword})

    def test_post_bad_form(self):
        with self.assertRaises(MultipartError):
            self.webapp.post(
                '/',
                params='badcontent',
                headers={'Content-Type': 'multipart/form-data'})

    def test_post_non_form(self):
        self.webapp.post(
            '/',
            params='{}',
            headers={'Content-Type': 'application/json'})

    def test_get_multiple_variables(self):
        r = webtest.app.TestRequest.blank('/?arg=1&arg=2')
        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertEqual([u'1', u'2'], req.form['arg'])

    def test_post_multiple_variables(self):
        r = webtest.app.TestRequest.blank('/', POST='arg=1&arg=2')
        req = CubicWebWsgiRequest(r.environ, self.vreg)

        self.assertEqual([u'1', u'2'], req.form['arg'])

    def test_post_files(self):
        content_type, params = self.webapp.encode_multipart(
            (), (('filefield', 'aname', b'acontent'),))
        r = webtest.app.TestRequest.blank(
            '/', POST=params, content_type=content_type)
        req = CubicWebWsgiRequest(r.environ, self.vreg)
        self.assertIn('filefield', req.form)
        fieldvalue = req.form['filefield']
        self.assertEqual(u'aname', fieldvalue[0])
        self.assertEqual(b'acontent', fieldvalue[1].read())

    def test_post_unicode_urlencoded(self):
        params = 'arg=%C3%A9'
        r = webtest.app.TestRequest.blank(
            '/', POST=params, content_type='application/x-www-form-urlencoded')
        req = CubicWebWsgiRequest(r.environ, self.vreg)
        self.assertEqual(u"é", req.form['arg'])

    @classmethod
    def init_config(cls, config):
        super(WSGIAppTC, cls).init_config(config)
        config.https_uiprops = None
        config.https_datadir_url = None


if __name__ == '__main__':
    import unittest
    unittest.main()