News
====

3.0.2 (2024-11-27)
------------------

- Bump waitress min version to 3.0.2


3.0.1 (2024-08-30)
------------------

- Multiple file input support.

- Drop support for Python 3.8 and bellow

- Allows the TestResponse to follow customised onclick buttons

- Response.pyquery object now use the html parser.

- You can use the Response.PyQuery method to customize pyquery init.

- Various docs / testing improvments

- Rename "master" git branch to "main".

3.0.0 (2021-08-19)
------------------

- Dropped support for Python 2.7 and 3.5.

- Added support for Python 3.9.

- Clean up dependencies and requirements.

- Switch from Travis to GitHub Actions for building and testing.

- Prevent PytestCollectionWarning for TestApp


2.0.35 (2020-04-27)
-------------------

- python3.8 compat

- Remove use of deprecated splittype and splithost

2.0.34 (2020-01-29)
-------------------

- Fix the test ``length == 0`` in ``check_content_type``.

- Treat ``<input type="search">`` like ``<input type="text">``.

- Handle query parameters for the ``head`` method.


2.0.33 (2019-02-09)
-------------------

- Fixed #210. Allow to reset select multiple with `field.value = []`

- Support for PYTHONOPTIMIZE=2, fix tests on PYTHONOPTIMIZE=1, 2

- Fixed #196. Fix deprecation warnings for ``collections`` to use
  ``collections.abc`` for ``Iterable`` on Python 3.


2.0.32 (2018-10-05)
-------------------

- remove invalid email from setup.py


2.0.31 (2018-10-05)
-------------------

- py33 is no longer supported. It may works but has been removed from tox config

- Fixed #205: Use empty string as default value for submit and button

- tests use pytest

- docs use the standard Pylons template on RTD


2.0.30 (2018-06-23)
-------------------

- Add ``Email`` class for input fields with type "email".

- Documentation bearer token and JWT authorization


2.0.29 (2017-10-21)
-------------------

- Bugfix: Preserve submit order for radio inputs.

- Fixed #186: avoid UnicodeDecodeError in linter with py2 when a header contain
  non ascii chars


2.0.28 (2017-08-01)
-------------------

- Fixed #185: Fix strict cookie policy

- Fixed #146: Improve fields value checking when enctype is multipart

- Fixed #119: Assertion error should be raised when you have non-string
  response header

- Bugfix: Allow to set an int value to form fields when enctype is multipart

- Added py36 to tox.ini / .travis.yaml


2.0.27 (2017-03-15)
-------------------

- Bugfix: Allow to use set_cookie when HTTP_HOST is set

- Fix #177: resp.json now always decode body as utf8


2.0.26 (2017-03-05)
-------------------

- Added JWT auth support

- Always show response body when response status is invalid


2.0.25 (2017-02-05)
-------------------

- Fix #173: Do not omit file uploads without a file from post.
  [Michael Howitz]


2.0.24 (2016-12-16)
-------------------

- Drop python 2.6 support. Newer versions may still work if you use waitress < 1.0

- Remove bs4 warnings

- Docs improvments

- Tets are WebOb 1.7.x compatible


2.0.23 (2016-07-21)
-------------------

- Create universal wheels.


2.0.22 (2016-07-21)
-------------------

-  Fix #160: Do not guess encoding if response's charset is set.

2.0.21 (2016-04-12)
-------------------

- PR #154 Allow Bearer auth

- PR #147,#148 Take care of REFERER when using form.submit(), .click() and
  .clickbutton()

- PR #145 Allow to override content-type when using json methods

2.0.20 (2015-11-03)
-------------------

- nothing new release. just try to make wheel available on pypi


2.0.19 (2015-11-01)
-------------------

- fixed #131 prevent passing HTML parameters that conflict with Field kwargs

- fixed #135 Document that WSGIProxy2 is required for "using webtest with a real url"

- fixed #136 reset values of select multiple

- drop py32 support (still work but test dependencies fail)

2.0.18 (2015-02-05)
-------------------

- Avoid deprecation warning with py3.4


2.0.17 (2014-12-20)
-------------------

- Properly check for default cookiejar arguments
  [Julian Berman]

- Avoid raising encoding errors from debugapp (needed to use with WSGIProxy2)
  [Laurence Rowe]


2.0.16 (2014-09-19)
-------------------

- Fixed #110. Forced values for Radio inputs are no longer ignored by value
  property on get.
  [bayprogrammer]

- Added method TestApp.set_parser_features to change the parser_features used
  by BeautifulSoup.
  [tomasmoreyra]

- Added app.set_cookie
  [luhn]


2.0.15 (2014-04-17)
-------------------

- Fixed #73. Python < 2.6.5 does not support unicode as keyword arguments names.
  [Stepan Kolesnik]

- Fixed #84 Application cookies for localhost are no longer ignored
  [gawel]

- Fixed #89 remove WSGIWarning: You are not supposed to send a body in a DELETE
  request because we now have a good reason for that. See
  https://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request/299701#299701
  [gawel]

- Fixed #92 You can now override TestApp.JSONEncoder to use a custom encoder
  [gawel]

- Fixed #93 Support basic authentication
  [gawel]

- Fixed #103 Broken "Edit me on GitHub" links in documentation
  [gawel]

- Fixed #106 Make wrapping the app in the lint middleware optional
  [dmlayton]

- Fixed #107 Explicit error message when WSGIProxy2 is not installer
  [gawel]

- Fixed #108 cgi.parse_qsl is pending deprecation
  [gawel]

2.0.14 (2014-01-23)
-------------------

- Allow `.select()` on <select>s and <select multiple>s.
  [Markus Bertheau]


2.0.13 (2014-01-23)
-------------------

- Allow selecting <select> options by text
  [Markus Bertheau]


2.0.12 (2014-01-17)
-------------------

- Ignore the `value` attribute of file inputs
  [Markus Bertheau]

- Allow selecting the form submit button by its value
  [Markus Bertheau]


2.0.11 (2013-12-29)
-------------------

- Depend on `unittest2` only for Python versions lower than 2.7
  [iElectric]

- Add an optional parameter to `TestApp`, allowing the user to specify the
  parser used by BeautifulSoup
  [lyndsysimon]


2.0.10 (2013-11-14)
-------------------

- Make StopableWSGIServer thread daemonic
  [lrowe]


2.0.9 (2013-09-18)
------------------

- Make sure Upload.content_type is not ignored
  https://github.com/Pylons/webtest/pull/88
  [Marius Gedminas]


2.0.8 (2013-09-17)
------------------

- Allow checking/unchecking a set of same-named checkboxes by assigning a list of values.
  [carljm]

- fix "AttributeError: 'InputWrapper' object has no attribute 'seek'"
  [iElectric]

- Added `xhr=True` parameter to `TestApp.get`, `TestApp.post`, `TestApp.head`, `TestApp.delete`
  [kharandziuk]

- Remove old (and broken?) casperjs/selenium backward compat imports. Fix
  https://github.com/gawel/webtest-selenium/issues/9
  [gawel]

- Allow optionally specifying the MIME type of an uploaded form file. Fixes #86
  [Marius Gedminas]


2.0.7 (2013-08-07)
------------------

- Detect JSON if mimetype ends with +json, such as application/vnd.webtest+json
  [homm]

- Fixed #72. Use WSGIServer new api even if there waitress has backward compat.
  [gawel]

- Fixed #50. Corrected default value for the delete params argument.
  [noonat]

- Be sure to decode the content if it is gziped before returning it
  [Alexis Métaireau]


2.0.6 (2013-05-23)
------------------

- fixed #64. cookiejar api has changed in python3.3 [gawel]

- allow to use a fixed StopableWSGIServer [gawel]

- Do not alter the BeautifulSoup object when parsing forms. [Georges
  Dubus]

- Remove first newline while parse textarea block, how modern browsers does.
  [Victor Safronovich] pull #69


2.0.5 (2013-04-12)
------------------

* Ignore select.error (not socket.error) following
  StopableWSGIServer.shutdown. [Laurence Rowe]

* Handle the short form of <select multiple> [Marius Gedminas]


2.0.4 (2013-03-28)
------------------

* Correctly handle <option> elements with no value attribute
  [Marius Gedminas]

* Ignore socket.error following StopableWSGIServer.shutdown. [Laurence Rowe]

* <button> without type='submit' attribute is treated as Submit
  control [Andrey Lebedev].

* Support for redirects having relative "Location" header [Andrey Lebedev]


2.0.3 (2013-03-19)
------------------

* Treat strings in the WSGI environment as native strings, compliant with
  PEP-3333. [wosc]


2.0.2 (2013-03-15)
------------------

* Allow TestResponse.click() to match HTML content again. [ender672]

* Support secure cookies [Andrey Lebedev]

2.0.1 (2013-03-05)
------------------

* Added Pasword field [diarmuidbourke]

* re-allow to use unknow field type. Like ``type="email"``. [gawel]

* Don't let BeautifulSoup use lxml. Fix GH-51 [kmike]

* added :meth:`webtest.response.TestResponse.maybe_follow` method [kmike]

2.0 (2013-02-25)
----------------

* drop zc.buildout usage for development, now using only virtualenv
  [Domen Kožar]

* Backward incompatibility : Removed the ``anchor`` argument of
  :meth:`webtest.response.TestResponse.click` and the ``button`` argument of
  :meth:`webtest.response.TestResponse.clickbutton`. It is for the greater good.
  [madjar]

* Rewrote API documentation [Domen Kožar]

* Added `wsgiproxy` support to do HTTP request to an URL [gawel]

* Use BeautifulSoup4 to parse forms [gawel]

* Added `webtest.app.TestApp.patch_json` [gawel]

* Implement `webtest.app.TestApp.cookiejar` support and kindof keep
  `webtest.app.TestApp.cookies` functionality.  `webtest.app.TestApp.cookies`
  should be treated as read-only.
  [Domen Kožar]

* Split Selenium integration into separate package webtest-selenium
  [gawel]

* Split casperjs integration into separate package webtest-casperjs
  [gawel]

* Test coverage improvements [harobed, cdevienne, arthru, Domen Kožar, gawel]

* Fully implement decoding of HTML entities

* Fix tox configuration

1.4.2
-----

* fix tests error due to CLRF in a tarball

1.4.1
-----

* add travis-ci

* migrate repository to https://github.com/Pylons/webtest

* Fix a typo in apps.py: selectedIndicies

* Preserve field order during parsing (support for deform and such)

* allow equals sign in the cookie by spliting name-value-string pairs on
  the first '=' sign as per
  https://tools.ietf.org/html/rfc6265#section-5.2

* fix an error when you use AssertionError(response) with unicode chars in
  response

1.4.0
-----

* added webtest.ext - allow to use casperjs

1.3.6
------

* fix `#42 <https://bitbucket.org/ianb/webtest/issues/42>`_ Check uppercase
  method.

* fix `#36 <https://bitbucket.org/ianb/webtest/issues/36>`_ Radio can use forced
  value.

* fix `#24 <https://bitbucket.org/ianb/webtest/issues/24>`_ Include test
  fixtures.

* fix bug when trying to print a response which contain some unicode chars

1.3.5
------

* fix `#39 <https://bitbucket.org/ianb/webtest/issues/39>`_ Add PATCH to
  acceptable methods.


1.3.4
-----

* fix `#33 <https://bitbucket.org/ianb/webtest/issues/33>`_ Remove
  CaptureStdout. Do nothing and break pdb

* use OrderedDict to store fields in form. See
  `#31 <https://bitbucket.org/ianb/webtest/issues/31>`_

* fix `#38 <https://bitbucket.org/ianb/webtest/issues/38>`_ Allow to post falsey
  values.

* fix `#37 <https://bitbucket.org/ianb/webtest/issues/37>`_ Allow
  Content-Length: 0 without Content-Type

* `fix #30 <https://bitbucket.org/ianb/webtest/issues/30>`_ bad link to pyquery
  documentation

* Never catch NameError during iteration

1.3.3
-----

* added ``post_json``, ``put_json``, ``delete_json``

* fix `#25 <https://bitbucket.org/ianb/webtest/issues/25>`_ params dictionary of
  webtest.AppTest.post() does not support unicode values

1.3.2
-----

* improve showbrowser. fixed `#23 <https://bitbucket.org/ianb/webtest/issues/23>`_

* print_stderr fail with unicode string on python2

1.3.1
-----

* Added .option() `#20 <https://bitbucket.org/ianb/webtest/issues/20>`_

* Fix #21

* Full python3 compat

1.3
---

* Moved TestApp to app.py

* Added selenium testing framework. See :mod:`~webtest.sel` module.


1.2.4
------

* Accept lists for ``app.post(url, params=[...])``

* Allow to use url that starts with the SCRIPT_NAME found in extra_environ

* Fix `#16 <https://bitbucket.org/ianb/webtest/issues/16>`_  Default
  content-type is now correctly set to `application/octet-stream`

* Fix `#14 and #18 <https://bitbucket.org/ianb/webtest/issues/18>`_ Allow to use
  `.delete(params={})`

* Fix `#12 <https://bitbucket.org/ianb/webtest/issues/12>`_


1.2.3
-----

* Fix `#10
  <https://bitbucket.org/ianb/webtest/issues/10/testapprequest-method-overwrites-specifics-with-testapp-scoped>`_,
  now `TestApp.extra_environ` doesn't take precedence over a WSGI
  environment passed in through the request.

* Removed stray print

1.2.2
-----

* Revert change to cookies that would add ``"`` around cookie values.

* Added property :meth:`webtest.Response.pyquery` which returns a
  `PyQuery <https://pypi.org/project/pyquery/>`_ object.

* Set base_url on ``resp.lxml``

* Include tests and docs in tarball.

* Fix sending in webob.Request (or webtest.TestRequest) objects.

* Fix handling forms with file uploads, when no file is selected.

* Added ``extra_environ`` argument to :meth:`webtest.TestResponse.click`.

* Fixed/added wildcard statuses, like ``status="4*"``

* Fix file upload fields in forms: allow upload field to be empty.

* Added support for single-quoted html attributes.

* `TestResponse` now has unicode support. It is turned on by default
  for all responses with charset information. **This is backward
  incompatible change** if you rely (e.g. in doctests) on parsed
  form fields or responses returned by `json` and `lxml` methods
  being encoded strings when charset header is in response. In order
  to switch to old behaviour pass `use_unicode=False` flag to
  `TestApp` constructor.


1.2.1
-----

* Added method :meth:`TestApp.request`, which can be used for
  sending requests with different methods (e.g., ``MKCOL``).  This
  method sends all its keyword arguments to
  :meth:`webtest.TestRequest.blank` and then executes the request.
  The parameters are somewhat different than other methods (like
  :meth:`webtest.TestApp.get`), as they match WebOb's attribute
  names exactly (the other methods were written before WebOb existed).

* Removed the copying of stdout to stderr during requests.

* Fix file upload fields in forms (`#340
  <https://web.archive.org/web/20120516124643/http://trac.pythonpaste.org/pythonpaste/ticket/340>`_) -- you could
  upload files with :meth:`webtest.TestApp.post`, but if you use
  ``resp.form`` file upload fields would not work (from rcs-comp.com
  and Matthew Desmarais).

1.2
---

* Fix form inputs; text inputs always default to the empty string, and
  unselected radio inputs default to nothing at all.  From Daniele
  Paolella.

* Fix following links with fragments (these fragments should not be
  sent to the WSGI application).  From desmaj.

* Added ``force_value`` to select fields, like
  ``res.form['select'].force_value("new_value")``.  This makes it
  possible to simulate forms that are dynamically updated.  From
  Matthew Desmarais.

* Fixed :meth:`webtest.Response.mustcontain` when you pass in a
  ``no=[strings]`` argument.

1.1
---

* Changed the ``__str__`` of responses to make them more doctest
  friendly:

  - All headers are displayed capitalized, like Content-Type
  - Headers are sorted alphabetically

* Changed ``__repr__`` to only show the body length if the complete
  body is not shown (for short bodies the complete body is in the
  repr)

* Note: **these are backward incompatible changes** if you are using
  doctest (you'll have to update your doctests with the new format).

* Fixed exception in the ``.delete`` method.

* Added a ``content_type`` argument to ``app.post`` and ``app.put``,
  which sets the ``Content-Type`` of the request.  This is more
  convenient when testing REST APIs.

* Skip links in ``<script>...</script>`` tags (since that's not real
  markup).

1.0.2
-----

* Don't submit unnamed form fields.

* Checkboxes with no explicit ``value`` send ``on`` (previously they
  sent ``checked``, which isn't what browsers send).

* Support for ``<select multiple>`` fields (from Matthew Desmarais)

1.0.1
---

* Fix the ``TestApp`` validator's InputWrapper lacking support for
  readline with an argument as needed by the cgi module.

1.0
---

* Keep URLs in-tact in cases such as
  ``app.get('http://www.python.org')`` (so HTTP_HOST=www.python.org,
  etc).

* Fix ``lxml.html`` import, so lxml 2.0 users can get HTML lxml
  objects from ``resp.lxml``

* Treat ``<input type="image">`` like a submit button.

* Use ``BaseCookie`` instead of ``SimpleCookie`` for storing cookies
  (avoids quoting cookie values).

* Accept any ``params`` argument that has an ``items`` method (like
  MultiDict)

0.9
---

Initial release
