Add testing utilities for building review request Q-expressions.

Review Request #13414 — Created Nov. 14, 2023 and submitted — Latest diff uploaded

Information

Review Board
release-5.0.x

Reviewers

This introduces several new functions in
reviewboard.reviews.testing.queries.review_requests for building
expected queries for unit tests:

  • get_review_requests_accessible_q()
  • get_review_requests_from_user_q()
  • get_review_requests_to_group_q()
  • get_review_requests_to_user_q()
  • get_review_requests_to_user_directly_q()
  • get_review_requests_to_user_groups_q()
  • get_review_requests_to_or_from_user_q()
  • get_review_requests_accessible_prep_equeries()
  • get_review_requests_accessible_equeries()
  • get_review_requests_accessible_from_user_equeries()
  • get_review_requests_accessible_to_group_equeries()
  • get_review_requests_accessible_to_user_equeries()
  • get_review_requests_accessible_to_user_directly_equeries()
  • get_review_requests_accessible_to_user_groups_equeries()
  • get_review_requests_accessible_to_or_from_user_equeries()

This covers all the queries used via ReviewRequestManager, offering
both Q-expressions (for embedding in other queries, needed for the
datagrids) and standalone queries.

The logic for building Q-expressions is verbose, checking each
combination of states individually and returning complete Q-expressions
as often as possible. Truth tables and comments help document these.
This is built this way in order to ensure we're testing against
fully-known expressions, making it harder to introduce a bug in any
queries.

Unit tests for ReviewRequestManager have been updated to use these.
There's still work that should be done to make these tests more
comprehensive, but between them, upcoming dashboard unit test changes,
and API tests, we have complete coverage.

As an implementation note, this is also the first change to make use of
the new PEP 692 support for defining **kwargs arguments using
TypedDict, helping with the complexity of the number of arguments
these functions all take. With this PEP, a value in the TypedDict
cannot also be present as a standalone argument (to, say, type-narrow
or override a value), and cannot be passed to a function if also
present in kwargs, so we have to resort to manipulating kwargs
directly. This is a reasonable trade-off in this code, but we'll need
to consider this approach elsewhere on a case-by-case basis.

All unit tests pass.

Commits

Files

    Loading...