12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- # -*- coding: utf-8 -*-
- """
- werkzeug.contrib.testtools
- ~~~~~~~~~~~~~~~~~~~~~~~~~~
- This module implements extended wrappers for simplified testing.
- `TestResponse`
- A response wrapper which adds various cached attributes for
- simplified assertions on various content types.
- :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.
- :license: BSD, see LICENSE for more details.
- """
- from werkzeug.utils import cached_property, import_string
- from werkzeug.wrappers import Response
- from warnings import warn
- warn(DeprecationWarning('werkzeug.contrib.testtools is deprecated and '
- 'will be removed with Werkzeug 1.0'))
- class ContentAccessors(object):
- """
- A mixin class for response objects that provides a couple of useful
- accessors for unittesting.
- """
- def xml(self):
- """Get an etree if possible."""
- if 'xml' not in self.mimetype:
- raise AttributeError(
- 'Not a XML response (Content-Type: %s)'
- % self.mimetype)
- for module in ['xml.etree.ElementTree', 'ElementTree',
- 'elementtree.ElementTree']:
- etree = import_string(module, silent=True)
- if etree is not None:
- return etree.XML(self.body)
- raise RuntimeError('You must have ElementTree installed '
- 'to use TestResponse.xml')
- xml = cached_property(xml)
- def lxml(self):
- """Get an lxml etree if possible."""
- if ('html' not in self.mimetype and 'xml' not in self.mimetype):
- raise AttributeError('Not an HTML/XML response')
- from lxml import etree
- try:
- from lxml.html import fromstring
- except ImportError:
- fromstring = etree.HTML
- if self.mimetype == 'text/html':
- return fromstring(self.data)
- return etree.XML(self.data)
- lxml = cached_property(lxml)
- def json(self):
- """Get the result of simplejson.loads if possible."""
- if 'json' not in self.mimetype:
- raise AttributeError('Not a JSON response')
- try:
- from simplejson import loads
- except ImportError:
- from json import loads
- return loads(self.data)
- json = cached_property(json)
- class TestResponse(Response, ContentAccessors):
- """Pass this to `werkzeug.test.Client` for easier unittesting."""
|