Skip to content

Add new headers parameter to test classes #1529

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 6, 2023

Conversation

Alexerson
Copy link
Contributor

Adding the new headers parameter to django.test.RequestFactory, AsyncRequestFactory, Client, and AsyncClient classes

Related issues

Also, extra was not defined on Client, but it was on AsyncClient, so I assumed it was a mistake and added it.

@Alexerson Alexerson mentioned this pull request Jun 5, 2023
30 tasks
@Alexerson Alexerson force-pushed the headers-parameter-django-4.2 branch 2 times, most recently from 7d84281 to c7dff6f Compare June 5, 2023 19:37
@Alexerson Alexerson force-pushed the headers-parameter-django-4.2 branch from c7dff6f to 6411ed6 Compare June 5, 2023 19:55
@sobolevn sobolevn requested a review from intgr June 5, 2023 20:15
Copy link
Contributor

@adamchainz adamchainz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, looks good. Happy to see this feature I suggested getting proper type hints. I would like another maintainer to double check though.

) -> _T: ...

class RequestFactory(_RequestFactory[WSGIRequest]): ...

class _AsyncRequestFactory(_RequestFactory[_T]):
def request(self, **request: Any) -> _T: ...
def generic(
self, method: str, path: str, data: Any = ..., content_type: str | None = ..., secure: bool = ..., **extra: Any
self,
Copy link
Member

@sobolevn sobolevn Jun 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we have this method? It is inherited from _RequestFactory and they are identical. Maybe we can remove this one?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And def request as well.

Copy link
Contributor Author

@Alexerson Alexerson Jun 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It’s most likely here because Django redefines it, and when the stubs are generated, the stub is added.
It would probably make sense to remove both and rely on the types in RequestFactory.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

@sobolevn sobolevn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LOOKS SOLID! 👍
Thanks!

data: _GetDataType = ...,
secure: bool = ...,
*,
headers: dict[str, Any] | None = ...,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason to type the dict value as Any? Is there any type besides str that makes sense?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Django supports anything that can be cast to a string, such as headers={"x-user-id": user.id}.

Copy link
Collaborator

@intgr intgr Jun 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Could be solved easily with str(user.id) in user code

  2. I tested this, I don't think there's any "casting to string" that happens. Django's Client just passes the value verbatim to the view function.
    image

    So this actually misbehaves, since request.headers[x] is defined to return str, but here it returned list. And it can result code behaving differently during testing and with real world requests, causing more hair pulling for users.

  3. For testing really weird cases there's always the **extra kwarg escape hatch.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyway let's continue this discussion in #1534.

descope bot referenced this pull request in descope/django-descope Jul 18, 2023
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [django-stubs](https://togithub.com/typeddjango/django-stubs)
([changelog](https://togithub.com/typeddjango/django-stubs/releases)) |
dev | patch | `4.2.1` -> `4.2.2` | `4.2.3` |

---

### Release Notes

<details>
<summary>typeddjango/django-stubs (django-stubs)</summary>

###
[`v4.2.2`](https://togithub.com/typeddjango/django-stubs/releases/tag/4.2.2)

[Compare
Source](https://togithub.com/typeddjango/django-stubs/compare/4.2.1...4.2.2)

#### Headline changes

-   **mypy 1.4:** Recommended mypy version updated to 1.4.x
- Support for `django-split-settings`, `django-configurations` and other
Django settings addons with `strict_settings = false` option, [see
README for
details](https://togithub.com/typeddjango/django-stubs#how-to-use-a-custom-library-to-handle-django-settings)
- We have now adopted [mypy's
stubtest](https://mypy.readthedocs.io/en/stable/stubtest.html) to
automatically find discrepancies between Django and django-stubs.

If you want to contribute to django-stubs but are not sure where to
start, have a look at [stubtest's TODO
list](https://togithub.com/typeddjango/django-stubs/blob/master/scripts/stubtest/allowlist_todo.txt)
file, which lists the many issues discovered by stubtest.

##### Django 4.2 changes

- Applied Django 4.2 deprecations by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1523](https://togithub.com/typeddjango/django-stubs/pull/1523)
- Updated global settings and `AppConfig` class to match Django 4.2 by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1524](https://togithub.com/typeddjango/django-stubs/pull/1524)
- Added types for new 'system checks' in Django 4.2 by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1526](https://togithub.com/typeddjango/django-stubs/pull/1526)
- Added `ManifestStaticFilesStorage` new parameters by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1528](https://togithub.com/typeddjango/django-stubs/pull/1528)
- Added new methods to `Sitemap` class by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1527](https://togithub.com/typeddjango/django-stubs/pull/1527)
- Added new `headers=` parameter to `(Async)RequestFactory` and
`(Async)Client` classes by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1529](https://togithub.com/typeddjango/django-stubs/pull/1529)
- Additional fixes by [@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1537](https://togithub.com/typeddjango/django-stubs/pull/1537)
- GDAL-related GeoDjango updates in Django 4.2 by
[@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1525](https://togithub.com/typeddjango/django-stubs/pull/1525)
- Added ORM `^` and `~` operator support, JSON lookup classes, Postgres
lookup classes, `ModelForm` changes, `json_script` template filter
parameters by [@&#8203;Alexerson](https://togithub.com/Alexerson) in
[https://github.com/typeddjango/django-stubs/pull/1536](https://togithub.com/typeddjango/django-stubs/pull/1536)
- Added and updated `db.backends` `DatabaseIntrospection` and
`DatabaseOperations` classes by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1571](https://togithub.com/typeddjango/django-stubs/pull/1571)

##### Stubs additions

- Added `QuerySet._result_cache` attribute and `_fetch_all()` method by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1505](https://togithub.com/typeddjango/django-stubs/pull/1505)
- Added `ModelAdmin.search_help_text` attribute by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1546](https://togithub.com/typeddjango/django-stubs/pull/1546)
- Added email console handler `EmailBackend.write_message()` method by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1547](https://togithub.com/typeddjango/django-stubs/pull/1547)
- Added `ModelAdmin.get_formset_kwargs()` method by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1545](https://togithub.com/typeddjango/django-stubs/pull/1545)
- Added `Signal._live_receivers()` method by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1551](https://togithub.com/typeddjango/django-stubs/pull/1551)
- Added `SQLCompiler._order_by_pairs()` method by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1586](https://togithub.com/typeddjango/django-stubs/pull/1586)
- Added `memcache_key_warnings()` function by
[@&#8203;rvanlaar](https://togithub.com/rvanlaar) in
[https://github.com/typeddjango/django-stubs/pull/1562](https://togithub.com/typeddjango/django-stubs/pull/1562)

##### Stubs fixes

- Fixed `create_model_instance` incorrect data argument type by
[@&#8203;namper](https://togithub.com/namper) in
[https://github.com/typeddjango/django-stubs/pull/1521](https://togithub.com/typeddjango/django-stubs/pull/1521)
- Marked `RequestSite.{save,delete}` methods as `NoReturn` since they
always raise by [@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1530](https://togithub.com/typeddjango/django-stubs/pull/1530)
- Updated `SafeExceptionReporterFilter` attributes and removed obsolete
`CLEANSED_SUBSTITUTE` by
[@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/1540](https://togithub.com/typeddjango/django-stubs/pull/1540)
- Changed `AppConfig.default_auto_field` to attribute instead of method
by [@&#8203;mthuurne](https://togithub.com/mthuurne) in
[https://github.com/typeddjango/django-stubs/pull/1541](https://togithub.com/typeddjango/django-stubs/pull/1541)
- Fixed `default_error_messages` attribute type of base `Field` and
`GenericIPAddressField` classes by
[@&#8203;asottile](https://togithub.com/asottile) in
[https://github.com/typeddjango/django-stubs/pull/1538](https://togithub.com/typeddjango/django-stubs/pull/1538)
- Improved spatialite `DatabaseWrapper` attributes by
[@&#8203;filbasi](https://togithub.com/filbasi) in
[https://github.com/typeddjango/django-stubs/pull/1544](https://togithub.com/typeddjango/django-stubs/pull/1544)
- Improved types for Signal `dispatch.dispatcher` by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1567](https://togithub.com/typeddjango/django-stubs/pull/1567)
- Accept `str` field names for `Window.order_by()`, allow `None` for
`asc/desc` arguments by [@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1574](https://togithub.com/typeddjango/django-stubs/pull/1574)
- Updated many `django.utils.*` types from stubtest by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1575](https://togithub.com/typeddjango/django-stubs/pull/1575)
- Updated many `db.migrations.operations` types from stubtest by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1583](https://togithub.com/typeddjango/django-stubs/pull/1583)
- Added `StepValueValidator`, fixed argument for
`SRIDCacheEntry`/`EmailValidator`, improved `urls.resolvers` types by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1589](https://togithub.com/typeddjango/django-stubs/pull/1589)

##### Plugin changes

- Fixed `ForeignKey` queryset filters on un-swapped models by
[@&#8203;UnknownPlatypus](https://togithub.com/UnknownPlatypus) in
[https://github.com/typeddjango/django-stubs/pull/1495](https://togithub.com/typeddjango/django-stubs/pull/1495)
- Add `strict_settings` option, allow runtime fallbacks for custom
settings by [@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1557](https://togithub.com/typeddjango/django-stubs/pull/1557)
- Add "Settings" section to README by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1581](https://togithub.com/typeddjango/django-stubs/pull/1581)
- Automatically reset mypy cache when plugin settings change by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1578](https://togithub.com/typeddjango/django-stubs/pull/1578)
- Fixed unhandled exception `KeyError: 'model_bases'` and related errors
by [@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1563](https://togithub.com/typeddjango/django-stubs/pull/1563)

##### django-stubs-ext

- Added `TypedDatabaseRouter` as database router base class by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1522](https://togithub.com/typeddjango/django-stubs/pull/1522)

##### CI/testing

- CI: Replace isort with Ruff import sorting by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1507](https://togithub.com/typeddjango/django-stubs/pull/1507)
- CI: Auto-remove unused imports using Ruff by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1508](https://togithub.com/typeddjango/django-stubs/pull/1508)
- CI: Enable Ruff pyupgrade fixes by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1509](https://togithub.com/typeddjango/django-stubs/pull/1509)
- CI: Run django-stubs-ext tests in full build matrix by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1552](https://togithub.com/typeddjango/django-stubs/pull/1552)
- Remove typecheck test and clean things up by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1556](https://togithub.com/typeddjango/django-stubs/pull/1556)
- Add stubtest with lots of errors (currently) by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1560](https://togithub.com/typeddjango/django-stubs/pull/1560)
- Removed extra `--generate-allowlist` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1576](https://togithub.com/typeddjango/django-stubs/pull/1576)

##### Housekeeping

- Removed unsupported Django versions from package classifiers by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1553](https://togithub.com/typeddjango/django-stubs/pull/1553)
- Removed try-except around import of `ArrayField` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1558](https://togithub.com/typeddjango/django-stubs/pull/1558)
- Reverted: Fix crash when psycopg2 is not installed by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1565](https://togithub.com/typeddjango/django-stubs/pull/1565)
- Removed usage of `mypy_extensions` by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1566](https://togithub.com/typeddjango/django-stubs/pull/1566)
- Upgrade to Mypy 1.4.0 by
[@&#8203;christianbundy](https://togithub.com/christianbundy) in
[https://github.com/typeddjango/django-stubs/pull/1572](https://togithub.com/typeddjango/django-stubs/pull/1572)
- Chore: set Black Python target to 3.8+ explicitely by
[@&#8203;GabDug](https://togithub.com/GabDug) in
[https://github.com/typeddjango/django-stubs/pull/1573](https://togithub.com/typeddjango/django-stubs/pull/1573)
- Update `flake8` plugins by
[@&#8203;sobolevn](https://togithub.com/sobolevn) in
[https://github.com/typeddjango/django-stubs/pull/1579](https://togithub.com/typeddjango/django-stubs/pull/1579)
- CI: Run tests and pre-commit using newest Python version by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1582](https://togithub.com/typeddjango/django-stubs/pull/1582)
- Removed duplicate "import all" test file by
[@&#8203;adamchainz](https://togithub.com/adamchainz) in
[https://github.com/typeddjango/django-stubs/pull/1587](https://togithub.com/typeddjango/django-stubs/pull/1587)
- Update compatible-mypy to 1.4.x by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1588](https://togithub.com/typeddjango/django-stubs/pull/1588)
- Version 4.2.2 release (django-stubs, django-stubs-ext) by
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1590](https://togithub.com/typeddjango/django-stubs/pull/1590)

#### New Contributors

- [@&#8203;namper](https://togithub.com/namper) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1521](https://togithub.com/typeddjango/django-stubs/pull/1521)
- [@&#8203;filbasi](https://togithub.com/filbasi) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1544](https://togithub.com/typeddjango/django-stubs/pull/1544)
- [@&#8203;GabDug](https://togithub.com/GabDug) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1567](https://togithub.com/typeddjango/django-stubs/pull/1567)
- [@&#8203;rvanlaar](https://togithub.com/rvanlaar) made their first
contribution in
[https://github.com/typeddjango/django-stubs/pull/1562](https://togithub.com/typeddjango/django-stubs/pull/1562)

**Full Changelog**:
typeddjango/django-stubs@4.2.1...4.2.2

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4xLjExIiwidXBkYXRlZEluVmVyIjoiMzYuMS4xMSIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: descope[bot] <descope[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

4 participants