cubicweb/web/test/unittest_idownloadable.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 24 Nov 2016 15:36:26 +0100
changeset 11892 08cf02efc7ce
parent 11241 a2091fa8cb2c
child 12880 59d4ad7e7df3
permissions -rw-r--r--
Simplify and fix _cw.drop_entity_cache * it's never called with an eid as argument, beside in a useless case in test (removed) * the only place where it's called from outside the tests is in full-text reindexation in server.checkintegrity: we could removed the request implementation and move it in unittest_rset, byt I decided to keep it for consistency with all other entity cache handling methods * get back a fix from Julien Cristau for the connection's implementation, quoting is commit message: When removing an entity from the transaction's cache, clear the entity's own cache May avoid issues where an entity object is still accessible somewhere else (e.g. an operation) after dropping it from the transaction's cache, with a stale attribute or relation cache.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
# copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
#
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
# This file is part of CubicWeb.
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
#
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
# CubicWeb is free software: you can redistribute it and/or modify it under the
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     8
# terms of the GNU Lesser General Public License as published by the Free
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     9
# Software Foundation, either version 2.1 of the License, or (at your option)
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    10
# any later version.
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    11
#
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    12
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    13
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    14
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    15
# details.
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    16
#
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    17
# You should have received a copy of the GNU Lesser General Public License along
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    18
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    19
11241
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    20
from datetime import datetime
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    21
from functools import partial
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    22
11241
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    23
from pytz import utc
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    24
9650
896b63873173 [web/test] use real_error_handling context manager instead of open-coding it
Julien Cristau <julien.cristau@logilab.fr>
parents: 9649
diff changeset
    25
from cubicweb.devtools.testlib import CubicWebTC, real_error_handling
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    26
from cubicweb import view
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    27
from cubicweb.predicates import is_instance
11241
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    28
from cubicweb.web import http_headers
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    29
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    30
8753
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    31
class IDownloadableUser(view.EntityAdapter):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    32
    __regid__ = 'IDownloadable'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    33
    __select__ = is_instance('CWUser')
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    34
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    35
    def download_content_type(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    36
        """return MIME type of the downloadable content"""
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    37
        return 'text/plain'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    38
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    39
    def download_encoding(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    40
        """return encoding of the downloadable content"""
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    41
        return 'ascii'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    42
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    43
    def download_file_name(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    44
        """return file name of the downloadable content"""
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    45
        return  self.entity.name() + '.txt'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    46
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    47
    def download_data(self):
10731
0736e31f8644 [py3k] IDownloadable.download_data() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10592
diff changeset
    48
        return b'Babar is not dead!'
8753
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    49
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    50
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    51
class BrokenIDownloadableGroup(IDownloadableUser):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    52
    __regid__ = 'IDownloadable'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    53
    __select__ = is_instance('CWGroup')
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    54
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    55
    def download_file_name(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    56
        return  self.entity.name + '.txt'
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    57
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    58
    def download_data(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
    59
        raise IOError()
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    60
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
class IDownloadableTC(CubicWebTC):
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    62
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    63
    def setUp(self):
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    64
        super(IDownloadableTC, self).setUp()
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    65
        self.vreg.register(IDownloadableUser)
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
        self.addCleanup(partial(self.vreg.unregister, IDownloadableUser))
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    67
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
    def test_header_simple_case(self):
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    69
        with self.admin_access.web_request() as req:
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    70
            req.form['vid'] = 'download'
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    71
            req.form['eid'] = str(req.user.eid)
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    72
            data = self.ctrl_publish(req, 'view')
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    73
            get = req.headers_out.getRawHeaders
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    74
            self.assertEqual(['attachment;filename="admin.txt"'],
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    75
                             get('content-disposition'))
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    76
            self.assertEqual(['text/plain;charset=ascii'],
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    77
                             get('content-type'))
11241
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    78
            last_mod = http_headers.parseDateTime(get('last-modified')[0])
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    79
            self.assertEqual(datetime.fromtimestamp(last_mod, tz=utc),
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    80
                             req.user.modification_date.replace(microsecond=0))
10731
0736e31f8644 [py3k] IDownloadable.download_data() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10592
diff changeset
    81
            self.assertEqual(b'Babar is not dead!', data)
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    82
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    83
    def test_header_with_space(self):
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    84
        with self.admin_access.web_request() as req:
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    85
            self.create_user(req, login=u'c c l a', password='babar')
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    86
            req.cnx.commit()
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    87
        with self.new_access(u'c c l a').web_request() as req:
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    88
            req.form['vid'] = 'download'
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    89
            req.form['eid'] = str(req.user.eid)
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    90
            data = self.ctrl_publish(req,'view')
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    91
            get = req.headers_out.getRawHeaders
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    92
            self.assertEqual(['attachment;filename="c c l a.txt"'],
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    93
                             get('content-disposition'))
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    94
            self.assertEqual(['text/plain;charset=ascii'],
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    95
                             get('content-type'))
10731
0736e31f8644 [py3k] IDownloadable.download_data() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10592
diff changeset
    96
            self.assertEqual(b'Babar is not dead!', data)
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    97
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
    98
    def test_header_with_space_and_comma(self):
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
    99
        with self.admin_access.web_request() as req:
10592
dfa1dcf4d7f1 [py3k] ur'' is gone
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 9650
diff changeset
   100
            self.create_user(req, login=u'c " l\\ a', password='babar')
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   101
            req.cnx.commit()
10592
dfa1dcf4d7f1 [py3k] ur'' is gone
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 9650
diff changeset
   102
        with self.new_access(u'c " l\\ a').web_request() as req:
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   103
            req.form['vid'] = 'download'
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   104
            req.form['eid'] = str(req.user.eid)
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   105
            data = self.ctrl_publish(req,'view')
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   106
            get = req.headers_out.getRawHeaders
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   107
            self.assertEqual([r'attachment;filename="c \" l\\ a.txt"'],
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   108
                             get('content-disposition'))
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   109
            self.assertEqual(['text/plain;charset=ascii'],
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   110
                             get('content-type'))
10731
0736e31f8644 [py3k] IDownloadable.download_data() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10592
diff changeset
   111
            self.assertEqual(b'Babar is not dead!', data)
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   112
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   113
    def test_header_unicode_filename(self):
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   114
        with self.admin_access.web_request() as req:
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   115
            self.create_user(req, login=u'cécilia', password='babar')
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   116
            req.cnx.commit()
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   117
        with self.new_access(u'cécilia').web_request() as req:
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
            req.form['vid'] = 'download'
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
            req.form['eid'] = str(req.user.eid)
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
            self.ctrl_publish(req,'view')
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
            get = req.headers_out.getRawHeaders
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   122
            self.assertEqual(['''attachment;filename="ccilia.txt";filename*=utf-8''c%C3%A9cilia.txt'''],
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   123
                             get('content-disposition'))
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   124
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
    def test_header_unicode_long_filename(self):
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   126
        name = u'Bèrte_hô_grand_nôm_ça_va_totallement_déborder_de_la_limite_là'
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   127
        with self.admin_access.web_request() as req:
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   128
            self.create_user(req, login=name, password='babar')
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   129
            req.cnx.commit()
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   130
        with self.new_access(name).web_request() as req:
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
            req.form['vid'] = 'download'
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   132
            req.form['eid'] = str(req.user.eid)
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   133
            self.ctrl_publish(req,'view')
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   134
            get = req.headers_out.getRawHeaders
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   135
            self.assertEqual(["""attachment;filename="Brte_h_grand_nm_a_va_totallement_dborder_de_la_limite_l.txt";filename*=utf-8''B%C3%A8rte_h%C3%B4_grand_n%C3%B4m_%C3%A7a_va_totallement_d%C3%A9border_de_la_limite_l%C3%A0.txt"""],
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   136
                             get('content-disposition'))
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   137
8753
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
   138
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
   139
    def test_download_data_error(self):
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
   140
        self.vreg.register(BrokenIDownloadableGroup)
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
   141
        self.addCleanup(partial(self.vreg.unregister, BrokenIDownloadableGroup))
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   142
        with self.admin_access.web_request() as req:
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   143
            req.form['vid'] = 'download'
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   144
            req.form['eid'] = str(req.execute('CWGroup X WHERE X name "managers"')[0][0])
9650
896b63873173 [web/test] use real_error_handling context manager instead of open-coding it
Julien Cristau <julien.cristau@logilab.fr>
parents: 9649
diff changeset
   145
            with real_error_handling(self.app):
9649
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   146
                data = self.app_handle_request(req)
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   147
            get = req.headers_out.getRawHeaders
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   148
            self.assertEqual(['text/html;charset=UTF-8'],
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   149
                             get('content-type'))
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   150
            self.assertEqual(None,
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   151
                             get('content-disposition'))
f89c2f127897 [web/test] port unittest_idownloadable to RepoAccess API
Julien Cristau <julien.cristau@logilab.fr>
parents: 8941
diff changeset
   152
            self.assertEqual(req.status_out, 500)
8753
b61a7c6352f2 [web publish] in case of error, ensure proper http status is set and Content-disposition header is reseted. Closes #2553066
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8694
diff changeset
   153
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   154
if __name__ == '__main__':
11241
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   155
    from unittest import main
a2091fa8cb2c [web/httpcache] fix Last-Modified generation
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   156
    main()