web/test/unittest_views_json.py
author Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
Tue, 27 Sep 2011 18:47:11 +0200
changeset 7876 df15d194a134
child 7989 db76e8aaec29
permissions -rw-r--r--
[views] implement json / jsonp export views (closes #1942658) Json export views are based on the same model as CSV export views. There are two distinct views : - *jsonexport* : direct conversion of the result set into json - *ejsonexport* : convert entities into json The JSONP parameter is named ``callback`` (same as on geonames, dbepdia and a lot of sites) An optional `_indent` request parameter can be passed to pretty print the results.

from cubicweb.devtools.testlib import CubicWebTC

from json import loads

class JsonViewsTC(CubicWebTC):

    def test_json_rsetexport(self):
        req = self.request()
        rset = req.execute('Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN')
        data = self.view('jsonexport', rset)
        self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
        self.assertEqual(data, '[["guests", 1], ["managers", 1]]')

    def test_json_rsetexport_with_jsonp(self):
        req = self.request()
        req.form.update({'callback': 'foo',
                         'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN',
                         })
        data = self.ctrl_publish(req, ctrl='jsonp')
        self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
        # because jsonp anonymizes data, only 'guests' group should be found
        self.assertEqual(data, 'foo([["guests", 1]])')

    def test_json_rsetexport_with_jsonp_and_bad_vid(self):
        req = self.request()
        req.form.update({'callback': 'foo',
                         'vid': 'table', # <-- this parameter should be ignored by jsonp controller
                         'rql': 'Any GN,COUNT(X) GROUPBY GN ORDERBY GN WHERE X in_group G, G name GN',
                         })
        data = self.ctrl_publish(req, ctrl='jsonp')
        self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/javascript'])
        # result should be plain json, not the table view
        self.assertEqual(data, 'foo([["guests", 1]])')

    def test_json_ersetexport(self):
        req = self.request()
        rset = req.execute('Any G ORDERBY GN WHERE G is CWGroup, G name GN')
        data = loads(self.view('ejsonexport', rset))
        self.assertEqual(req.headers_out.getRawHeaders('content-type'), ['application/json'])
        self.assertEqual(data[0]['name'], 'guests')
        self.assertEqual(data[1]['name'], 'managers')


if __name__ == '__main__':
    from logilab.common.testlib import unittest_main
    unittest_main()