web/test/unittest_views_json.py
changeset 9810 51ebb1b925cb
parent 8704 933f9693c53d
child 9864 f60a80592224
equal deleted inserted replaced
9809:29d52a785729 9810:51ebb1b925cb
     1 # -*- coding: utf-8 -*-
     1 # -*- coding: utf-8 -*-
     2 # copyright 2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # copyright 2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     4 #
     4 #
     5 # This file is part of CubicWeb.
     5 # This file is part of CubicWeb.
     6 #
     6 #
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
     7 # CubicWeb is free software: you can redistribute it and/or modify it under the
    16 #
    16 #
    17 # You should have received a copy of the GNU Lesser General Public License along
    17 # You should have received a copy of the GNU Lesser General Public License along
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    19 from cubicweb.devtools.testlib import CubicWebTC
    19 from cubicweb.devtools.testlib import CubicWebTC
    20 
    20 
    21 from cubicweb.utils import json
       
    22 
       
    23 from cubicweb.web.application import anonymized_request
       
    24 
    21 
    25 class JsonViewsTC(CubicWebTC):
    22 class JsonViewsTC(CubicWebTC):
    26     anonymize = True
    23     anonymize = True
    27     res_jsonp_data = '[["guests", 1]]'
    24     res_jsonp_data = '[["guests", 1]]'
    28 
    25 
    29     def setUp(self):
    26     def setUp(self):
    30         super(JsonViewsTC, self).setUp()
    27         super(JsonViewsTC, self).setUp()
    31         self.config.global_set_option('anonymize-jsonp-queries', self.anonymize)
    28         self.config.global_set_option('anonymize-jsonp-queries', self.anonymize)
    32 
    29 
    33     def test_json_rsetexport(self):
    30     def test_json_rsetexport(self):
    34         req = self.request()
    31         with self.admin_access.web_request() as req:
    35         rset = req.execute('Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN')
    32             rset = req.execute('Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN')
    36         data = self.view('jsonexport', rset)
    33             data = self.view('jsonexport', rset)
    37         self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    34             self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    38         self.assertListEqual(data, [["guests", 1], ["managers", 1]])
    35             self.assertListEqual(data, [["guests", 1], ["managers", 1]])
    39 
    36 
    40     def test_json_rsetexport_empty_rset(self):
    37     def test_json_rsetexport_empty_rset(self):
    41         req = self.request()
    38         with self.admin_access.web_request() as req:
    42         rset = req.execute('Any X WHERE X is CWUser, X login "foobarbaz"')
    39             rset = req.execute('Any X WHERE X is CWUser, X login "foobarbaz"')
    43         data = self.view('jsonexport', rset)
    40             data = self.view('jsonexport', rset)
    44         self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    41             self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    45         self.assertListEqual(data, [])
    42             self.assertListEqual(data, [])
    46 
    43 
    47     def test_json_rsetexport_with_jsonp(self):
    44     def test_json_rsetexport_with_jsonp(self):
    48         req = self.request()
    45         with self.admin_access.web_request() as req:
    49         req.form.update({'callback': 'foo',
    46             req.form.update({'callback': 'foo',
    50                          'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN',
    47                              'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN '
    51                          })
    48                              'WHERE X in_group G, G name GN'})
    52         data = self.ctrl_publish(req, ctrl='jsonp')
    49             data = self.ctrl_publish(req, ctrl='jsonp')
    53         self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
    50             self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
    54         # because jsonp anonymizes data, only 'guests' group should be found
    51             # because jsonp anonymizes data, only 'guests' group should be found
    55         self.assertEqual(data, 'foo(%s)' % self.res_jsonp_data)
    52             self.assertEqual(data, 'foo(%s)' % self.res_jsonp_data)
    56 
    53 
    57     def test_json_rsetexport_with_jsonp_and_bad_vid(self):
    54     def test_json_rsetexport_with_jsonp_and_bad_vid(self):
    58         req = self.request()
    55         with self.admin_access.web_request() as req:
    59         req.form.update({'callback': 'foo',
    56             req.form.update({'callback': 'foo',
    60                          'vid': 'table', # <-- this parameter should be ignored by jsonp controller
    57                              'vid': 'table', # <-- this parameter should be ignored by jsonp controller
    61                          'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN',
    58                              'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN '
    62                          })
    59                              'WHERE X in_group G, G name GN'})
    63         data = self.ctrl_publish(req, ctrl='jsonp')
    60             data = self.ctrl_publish(req, ctrl='jsonp')
    64         self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
    61             self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
    65         # result should be plain json, not the table view
    62             # result should be plain json, not the table view
    66         self.assertEqual(data, 'foo(%s)' % self.res_jsonp_data)
    63             self.assertEqual(data, 'foo(%s)' % self.res_jsonp_data)
    67 
    64 
    68     def test_json_ersetexport(self):
    65     def test_json_ersetexport(self):
    69         req = self.request()
    66         with self.admin_access.web_request() as req:
    70         rset = req.execute('Any G ORDERBY GN WHERE G is CWGroup, G name GN')
    67             rset = req.execute('Any G ORDERBY GN WHERE G is CWGroup, G name GN')
    71         data = self.view('ejsonexport', rset)
    68             data = self.view('ejsonexport', rset)
    72         self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    69             self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
    73         self.assertEqual(data[0]['name'], 'guests')
    70             self.assertEqual(data[0]['name'], 'guests')
    74         self.assertEqual(data[1]['name'], 'managers')
    71             self.assertEqual(data[1]['name'], 'managers')
    75 
    72 
    76 
    73 
    77 class NotAnonymousJsonViewsTC(JsonViewsTC):
    74 class NotAnonymousJsonViewsTC(JsonViewsTC):
    78     anonymize = False
    75     anonymize = False
    79     res_jsonp_data = '[["guests", 1], ["managers", 1]]'
    76     res_jsonp_data = '[["guests", 1], ["managers", 1]]'