#33348: Change API of assertFormError to take an actual form object
------------------------------------------------+--------------------------
               Reporter:  Baptiste Mispelon     |          Owner:  nobody
                   Type:  Cleanup/optimization  |         Status:  assigned
              Component:  Testing framework     |        Version:  dev
               Severity:  Normal                |       Keywords:
           Triage Stage:  Unreviewed            |      Has patch:  0
    Needs documentation:  0                     |    Needs tests:  0
Patch needs improvement:  0                     |  Easy pickings:  0
                  UI/UX:  0                     |
------------------------------------------------+--------------------------
 The current signature of `assertFormError` is `(response, form, field,
 errors, msg_prefix='')` where:

 - `response` is a response object (specifically one generated by the test
 client because it needs `response.context`)
 - `form` is the name of a form (string) to be found in the response's
 context
 - `field` is a name of a field in the form (string)
 - `errors` is either a list of error strings, a single error string
 (equivalent to `[error]`) or `None` (equivalent to `[]`)
 - `msg_prefix` is a string added to the test failure message


 Personally I've always found this `response`/`form` API to be clunky since
 I often want to test a form directly without having to go through the test
 client.
 It would be a lot easier to use if we could pass a form object directly. I
 don't really understand why the API was implemented like this to begin
 with.

 On top of that, now that Django uses template-based rendering for forms,
 formsets and widgets there are a lot of contexts to search in
 `response.context` and a lot of possibilities for clashing names (see
 #33346).

 I would therefore propose the following new signature:
 `assertFormError(form, field, errors, msg_prefix='')` with `form` being an
 actual `Form` object and all other parameters staying the same.
 The deprecation should be straightforward to implement by checking if
 `form` is a response object (`isinstance` check) or if `response` kwarg
 has been passed.


 With that change `assertFormsetError` becomes mostly useless since one can
 simply do `assertFormError(formset.forms[i], field_name, errors)`. The one
 usecase that wouldn't be covered is `i = None + field_name=None` which
 checks the `errors` list against the formset's `non_form_errors()`.
 We could either leave `assertFormsetError` in place as a convenience
 method (with a similar change to its API to accept a formset object
 directly) or deprecate more agressively by suggesting the user tests the
 output of `formset.non_field_errors()` directly.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33348>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.0bc3e14065c976106257690e2004b2e9%40djangoproject.com.

Reply via email to