djblets.testing.testcases¶
Base class for test cases in Django-based applications.
- class ExpectedWarning[source]¶
Bases:
TypedDictAn expected warning from an assertion.
This is used for
TestCase.assertWarnings().New in version 3.2.
- message: Optional[str]¶
The expected message for the warning.
If not provided, messages won’t be compared.
- Type:
- __annotations__ = {'cls': typing.Type[Warning], 'message': typing.NotRequired[typing.Optional[str]]}¶
- __optional_keys__ = frozenset({'message'})¶
- __orig_bases__ = (<function TypedDict>,)¶
- __required_keys__ = frozenset({'cls'})¶
- __total__ = True¶
- class TestCase(methodName='runTest')[source]¶
Bases:
TestCaseBase class for test cases.
Individual tests on this TestCase can use the
add_fixtures()decorator to add or replace the fixtures used for the test.- __call__(*args, **kwargs)[source]¶
Wrapper around default __call__ method to perform common Django test set up. This means that user-defined Test Cases aren’t required to include a call to super().setUp().
- shortDescription()[source]¶
Returns the description of the current test.
This changes the default behavior to replace all newlines with spaces, allowing a test description to span lines. It should still be kept short, though.
- siteconfig_settings(settings)[source]¶
Temporarily sets siteconfig settings for a test.
Subclasses should override this if they want to run a method like
apply_django_settings()before and after each test.- Parameters:
settings (
dict) – The new siteconfig settings to set.- Context:
The current site configuration will contain the new settings for this test.
- assertAttrsEqual(obj, attrs, msg=None)[source]¶
Assert that attributes on an object match expected values.
This will compare each attribute defined in
attrsagainst the corresponding attribute onobj. If the attribute value does not match, or the attribute is missing, this will assert.- Parameters:
- Raises:
AssertionError – An attribute was not found or the value did not match.
- assertRaisesValidationError(expected_messages, *args, **kwargs)[source]¶
Assert that a ValidationError is raised with the given message(s).
This is a wrapper around
assertRaisesMessage()with aValidationErrorthat handles converting the expected messages into a list (if it isn’t already) and then converting that into a string representation, which is whatassertRaisesMessage()will be checking against.- Parameters:
expected_messages (
listorunicode) – The expected messages as either a list of strings or a single string.args – Additional arguments to pass to
assertRaisesMessage().kwargs – Additional keyword arguments to pass to
assertRaisesMessage().
- assertRaisesMessage(expected_exception, expected_message, *args, **kwargs)[source]¶
Assert that an exception is raised with a given message.
This is a replacement for Django’s assertRaisesMessage that behaves well with a design change in Python 2.7.9/10, without crashing.
- assertWarns(cls: ~typing.Type[Warning] = <class 'DeprecationWarning'>, message: ~typing.Optional[str] = None) Iterator[None][source]¶
Assert that a warning is generated with a given message.
This method only supports code which generates a single warning. Tests which make use of code generating multiple warnings will need to manually catch their warnings.
- Parameters:
cls (
type, optional) –The expected warning type.
If not provided, this defaults to a
DeprecationWarning.message (
unicode, optional) – The expected error message, if any.
- Context:
The test to run.
- assertWarnings(warning_list: List[ExpectedWarning]) Iterator[None][source]¶
Assert that multiple warnings were generated.
This method accepts a sequence of warnings that must be matched in order. Each item must be an instance of a warning with a message. The type and messages of the warnings must match.
New in version 3.2.
- Parameters:
warning_list (
listofdict, optional) –The list of expected warnings, in order.
Each item is a dictionary in the format described in
ExpectedWarning.- Context:
The test to run.
- assertQueries(queries, num_statements=None)[source]¶
Assert the number and complexity of queries.
This provides advanced checking of queries, allowing the caller to match filtering, JOINs, ordering, selected fields, and more.
This takes a list of dictionaries with query information. Each contains the following:
- Keys:
model (
type) – The model representing the results that would be returned or altered by the query.annotations (
dict, optional) – A dictionary containing applied annotations.Keys are destination attribute names, and values are the annotation instances.
The default is empty.
distinct (
bool, optional) – Whetherdjango.db.models.query.QuerySet.distinct()was used.The default is
False.distinct_fields (
tupleofstr, optional) – A list of fields passed todjango.db.models.query.QuerySet.distinct().The default is empty.
extra (
dict, optional) – State passed in calls todjango.db.models.query.QuerySet.extra()when usingselectandselect_params.Each key maps to a key in
select, and each value is a tuple containing the value inselectand the corresponding value (if any) inselect_params.Values are normalized to collapse and strip whitespace, to help with comparison.
The default is empty.
extra_order_by (
listofstr, optional) – State passed in calls todjango.db.models.query.QuerySet.extra()when usingorder_by.The default is empty.
extra_tables (
listofstr, optional) – State passed in calls todjango.db.models.query.QuerySet.extra()when usingtables.The default is empty.
group_by (
boolortuple, optional) – Whether no fields will be grouped (None), all fields will be grouped (True), or specific expressions/field names are grouped (a tuple).This is influenced by using
django.db.models.query.QuerySet.annotate().The default is
None.limit (
int, optional) – The value for aLIMITin theSELECT.This will generally only need to be supplied if testing a query using
QuerySet.exists()or when slicing results.Django itself sometimes uses a default of
Noneand sometimes a default currently of21(this exact value, and when it’s used, is considered an implementation detail in Django). Both of these will match a caller-providedlimitvalue ofNone.The default is
None.num_joins (
int, optional) – The number of tables JOINed.The default is 0.
offset (
int, optional) – The value for anOFFSETin theSELECT.The default is 0.
only_fields (
setofstr, optional) – The specific fields being fetched, orNoneif fetching all fields.The default is
None.order_by (
tupleofstr, optional) – The ordering criteria.The default is empty.
select_for_update (
bool, optional) – Whether this is a select-for-update operation.The default is
False.select_related (
setofstr, optional) – The table names involved in adjango.db.models.query.QuerySet.select_related().subquery (
bool, optional) – Whether this is considered a subquery of another query.The default is
False.tables (
setofstr, optional) – The tables involved in the query.The default is the model’s table name.
type (
str, optional) – The query type. This would be one ofDELETE,INSERT,SELECT, orUPDATE.The default is
SELECT.values_select (
listofstr, optional) – A list of specified fields being returned usingvalues()orvalues_list()orwhere (
django.db.models.Q, optional) – The query expression objects used to represent the filter on the query.
New in version 3.0.
- Parameters:
queries (
listofdict) – The list of query dictionaries to compare executed queries against.num_statements (
int, optional) –The numbre of SQL statements executed.
This defaults to the length of
queries, but callers may need to provide an explicit number, as some operations may add additional database-specific statements (such as transaction-related SQL) that won’t be covered inqueries.
- Raises:
AssertionError – The parameters passed, or the queries compared, failed expectations.
- class TestModelsLoaderMixin[source]¶
Bases:
objectAllows unit test modules to provide models to test against.
This allows a unit test file to provide models that will be synced to the database and flushed after tests. These can be tested against in any unit tests.
Typically, Django requires any test directories to be pre-added to INSTALLED_APPS in order for models to be created in the test database.
This mixin works around this by dynamically adding the module to INSTALLED_APPS and forcing the database to be synced. It also will generate a fake ‘models’ module to satisfy Django’s requirement, if one doesn’t already exist.
By default, this will assume that the test class’s module is the one that should be added to INSTALLED_APPS. This can be changed by overriding
tests_app.
- class FixturesCompilerMixin[source]¶
Bases:
objectCompiles and efficiently loads fixtures into a test suite.
Unlike Django’s standard fixture support, this doesn’t re-discover and re-deserialize the referenced fixtures every time they’re needed. Instead, it precompiles the fixtures the first time they’re found and reuses their objects for future tests.
However, also unlike Django’s, this does not accept compressed or non-JSON fixtures.
- class TagTest(methodName='runTest')[source]¶
Bases:
TestCaseBase testing setup for custom template tags
- __annotations__ = {}¶
- class StoppableWSGIServer(*args, ipv6=False, allow_reuse_address=True, **kwargs)[source]¶
Bases:
WSGIServerWSGIServer with short timeout, so that server thread can stop this server.
- class WSGIRequestHandler(request, client_address, server)[source]¶
Bases:
WSGIRequestHandlerA custom WSGIRequestHandler that logs all output to stdout.
Normally, WSGIRequestHandler will color-code messages and log them to stderr. It also filters out admin and favicon.ico requests. We don’t need any of this, and certainly don’t want it in stderr, as we’d like to only show it on failure.
- log_message(format, *args)[source]¶
Log an arbitrary message.
This is used by all other logging functions. Override it if you have specific logging wishes.
The first argument, FORMAT, is a format string for the message to be logged. If the format string contains any % escapes requiring parameters, they should be specified as subsequent arguments (it’s just like printf!).
The client ip and current date/time are prefixed to every message.
Unicode control characters are replaced with escaped hex before writing the output to stderr.
- class TestServerThread(address, port)[source]¶
Bases:
ThreadThread for running a http server while tests are running.
- __init__(address, port)[source]¶
This constructor should always be called with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.
args is a list or tuple of arguments for the target invocation. Defaults to ().
kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing anything else to the thread.