diff --git a/docs/_newsfragments/1871.bugfix.rst b/docs/_newsfragments/1871.bugfix.rst
new file mode 100644
index 0000000..72a284c
--- /dev/null
+++ b/docs/_newsfragments/1871.bugfix.rst
@@ -0,0 +1,4 @@
+The :func:`~falcon.to_query_str` method now correctly encodes parameter keys
+and values. As a result, the `params` parameter in
+:func:`~falcon.testing.simulate_request` will now correctly pass values
+containing special characters (such as ``'&'``) to the application.
diff --git a/falcon/util/misc.py b/falcon/util/misc.py
index 89f3e4a..bf6e112 100644
--- a/falcon/util/misc.py
+++ b/falcon/util/misc.py
@@ -34,6 +34,7 @@ import unicodedata
 
 from falcon import status_codes
 from falcon.constants import PYPY
+from falcon.uri import encode_value
 # NOTE(vytas): Hoist `deprecated` here since it is documented as part of the
 # public Falcon interface.
 from .deprecation import deprecated
@@ -230,7 +231,7 @@ def to_query_str(params, comma_delimited_lists=True, prefix=True):
             v = 'false'
         elif isinstance(v, list):
             if comma_delimited_lists:
-                v = ','.join(map(str, v))
+                v = ','.join(map(encode_value, map(str, v)))
             else:
                 for list_value in v:
                     if list_value is True:
@@ -238,15 +239,15 @@ def to_query_str(params, comma_delimited_lists=True, prefix=True):
                     elif list_value is False:
                         list_value = 'false'
                     else:
-                        list_value = str(list_value)
+                        list_value = encode_value(str(list_value))
 
-                    query_str += k + '=' + list_value + '&'
+                    query_str += encode_value(k) + '=' + list_value + '&'
 
                 continue
         else:
-            v = str(v)
+            v = encode_value(str(v))
 
-        query_str += k + '=' + v + '&'
+        query_str += encode_value(k) + '=' + v + '&'
 
     return query_str[:-1]
 

diff --git a/tests/test_utils.py b/tests/test_utils.py
index 3eccb34..53b1728 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -211,6 +211,21 @@ class TestFalconUtils:
 
         assert expected == garbage_out
 
+    @pytest.mark.parametrize('csv', [True, False])
+    @pytest.mark.parametrize('params', [
+        {'a & b': 'a and b', 'b and c': 'b & c'},
+        {'apples and oranges': '🍏 & 🍊'},
+        {'garbage': ['&', '&+&', 'a=1&b=2', 'c=4&'], 'one': '1'},
+        {'&': '&amp;', '™': '&trade;', '&&&': ['&amp;', '&amp;', '&amp;']},
+
+        # NOTE(vytas): Would fail because of https://github.com/falconry/falcon/issues/1872
+        # {'&': '%26', '&&': '%26', '&&&': ['%26', '%2', '%']},
+    ])
+    def test_to_query_str_encoding(self, params, csv):
+        query_str = falcon.to_query_str(params, comma_delimited_lists=csv, prefix=False)
+
+        assert uri.parse_query_string(query_str, csv=csv) == params
+
     def test_uri_encode(self):
         url = 'http://example.com/v1/fizbit/messages?limit=3&echo=true'
         assert uri.encode(url) == url

falcon.to_query_str does not properly encode query parameters
# Version details

* Python version tested: 3.7.9
* Falcon version tested: 2.0.0

# Observed Behavior

`falcon.testing.TestClient`'s `simulate_*` methods do not correctly encode query parameters when using the `params` keyword argument.

```python
import urllib.parse

import falcon
import falcon.testing
import falcon.util


class SomeHandler:
    def on_get(self, request, response):
        print("parsed params       ", request.params)


app = falcon.API()
app.add_route("/", SomeHandler())

test_client = falcon.testing.TestClient(app)


# Try a params dict with the TestClient. Note that it does not encode any special characters, and this results in a
# query string that does not decode back to the same parameters.
#
# This is because falcon.testing uses falcon.util.to_query_str, which does not apply any encoding to the supplied query
# params dict.
params = {"foo": "bar", "baz": "boz&something"}
print("original params dict", params)
print("to_query_str        ", falcon.util.to_query_str(params))
response = test_client.simulate_get("/", params=params)
print(response.status_code)
# => original params dict {'foo': 'bar', 'baz': 'boz&something'}
# => to_query_str         ?foo=bar&baz=boz&something
# => parsed params        {'foo': 'bar', 'baz': 'boz', 'something': ''}
# => 200

# Now try manually encoding the params dict ourselves with urllib. Note that the query string is then correctly
# interpreted by falcon.
params = {"foo": "bar", "baz": "boz&something"}
encoded_params = urllib.parse.urlencode(params)
print("encoded params      ", encoded_params)
response = test_client.simulate_get("/", query_string=encoded_params)
print(response.status_code)
# => encoded params       foo=bar&baz=boz%26something
# => parsed params        {'foo': 'bar', 'baz': 'boz&something'}
# => 200
```

# Expected Behavior

I expect a WSGI app testing library that supports a way to specify query parameters as a dict to correctly encode my parameters so that the application interprets them the same way (although it is reasonable to require both sides to agree on how to handle lists as CSV vs repeating a query parameter)

I think that merely documenting this shortcoming is insufficient because the argument specifically exists to allow me to pass in query parameters as a dict.


# Root Cause

This is caused by `falcon.util.misc.to_query_str` not applying any URL encoding to the query parameters as it constructs the query string. `to_query_str` looks like it is currently only used by `falcon.testing.simulate_request`.
tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params0-True] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params0-False] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params1-True] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params1-False] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params2-True] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params2-False] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params3-True] tests/test_utils.py::TestFalconUtils::test_to_query_str_encoding[params3-False]
tests/test_utils.py::TestFalconUtils::test_deprecated_decorator tests/test_utils.py::TestFalconUtils::test_http_now tests/test_utils.py::TestFalconUtils::test_dt_to_http tests/test_utils.py::TestFalconUtils::test_http_date_to_dt tests/test_utils.py::TestFalconUtils::test_pack_query_params_none tests/test_utils.py::TestFalconUtils::test_pack_query_params_one tests/test_utils.py::TestFalconUtils::test_pack_query_params_several tests/test_utils.py::TestFalconUtils::test_uri_encode tests/test_utils.py::TestFalconUtils::test_uri_encode_double tests/test_utils.py::TestFalconUtils::test_uri_encode_value tests/test_utils.py::TestFalconUtils::test_uri_decode[bytearray] tests/test_utils.py::TestFalconUtils::test_uri_decode[join_list] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[bytearray-ab%2Gcd-ab%2Gcd] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[bytearray-ab%2Fcd: tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[bytearray-%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s-%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[join_list-ab%2Gcd-ab%2Gcd] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[join_list-ab%2Fcd: tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_coding[join_list-%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s-%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[bytearray-+%80- tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[bytearray-+++%FF+++- tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[bytearray-%fc%83%bf%bf%bf%bf-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[bytearray-%ed%ae%80%ed%b0%80-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[join_list-+%80- tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[join_list-+++%FF+++- tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[join_list-%fc%83%bf%bf%bf%bf-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd] tests/test_utils.py::TestFalconUtils::test_uri_decode_bad_unicode[join_list-%ed%ae%80%ed%b0%80-\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd] tests/test_utils.py::TestFalconUtils::test_uri_decode_unquote_plus[bytearray] tests/test_utils.py::TestFalconUtils::test_uri_decode_unquote_plus[join_list] tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_models_stdlib_quote tests/test_utils.py::TestFalconUtils::test_prop_uri_encode_value_models_stdlib_quote_safe_tilde tests/test_utils.py::TestFalconUtils::test_prop_uri_decode_models_stdlib_unquote_plus tests/test_utils.py::TestFalconUtils::test_unquote_string tests/test_utils.py::TestFalconUtils::test_parse_query_string tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[-True-expected0] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[-False-expected1] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[flag1&&&&&flag2&&&-True-expected2] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[flag1&&&&&flag2&&&-False-expected3] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[malformed=%FG%1%Hi%%%a-False-expected4] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[=-False-expected5] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[==-False-expected6] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[%==+==&&&&&&&&&%%==+=&&&&&&%0g%=%=-False-expected7] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[%=&%%=&&%%%=-False-expected8] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[%=&%%=&&%%%=-True-expected9] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[+=&%+=&&%++=-True-expected10] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[=x=&=x=+1=x=&%=x-False-expected11] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[%=+&%=&+%+=&%+&=%&=+%&+==%+&=%&+=+%&=+&%=&%+=&+%+%=&+%&=+=%&+=&%+&%=+&=%&%=+&%+=&=%+&=+%&+%=&+=%-False-expected12] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[%%%\x00%\x00==\x00\x00==-True-expected13] tests/test_utils.py::TestFalconUtils::test_parse_query_string_edge_cases[spade=\u2660&spade=\u2660-False-expected14] tests/test_utils.py::TestFalconUtils::test_parse_host tests/test_utils.py::TestFalconUtils::test_get_http_status_warns tests/test_utils.py::TestFalconUtils::test_get_http_status tests/test_utils.py::TestFalconUtils::test_code_to_http_status[703-703 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[404-404 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[404.9-404 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[200 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[307 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[404 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[123-123 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[123 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.OK-200 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.TEMPORARY_REDIRECT-307 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.UNAUTHORIZED-401 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.GONE-410 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.TOO_MANY_REQUESTS-429 tests/test_utils.py::TestFalconUtils::test_code_to_http_status[HTTPStatus.INTERNAL_SERVER_ERROR-500 tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[0] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[13] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[99] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[1000] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[1337.01] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[-99] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[-404.3_0] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[-404] tests/test_utils.py::TestFalconUtils::test_code_to_http_status_value_error[-404.3_1] tests/test_utils.py::TestFalconUtils::test_http_status_to_code[HTTPStatus.HTTP_VERSION_NOT_SUPPORTED-505_0] tests/test_utils.py::TestFalconUtils::test_http_status_to_code[712-712_0] tests/test_utils.py::TestFalconUtils::test_http_status_to_code[712-712_1] tests/test_utils.py::TestFalconUtils::test_http_status_to_code[404 tests/test_utils.py::TestFalconUtils::test_http_status_to_code[712 tests/test_utils.py::TestFalconUtils::test_http_status_to_code[123 tests/test_utils.py::TestFalconUtils::test_http_status_to_code[HTTPStatus.HTTP_VERSION_NOT_SUPPORTED-505_1] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[0] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[ tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[1] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[12] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[99] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[catsup] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[2] tests/test_utils.py::TestFalconUtils::test_http_status_to_code_neg[5.2] tests/test_utils.py::TestFalconUtils::test_etag_dumps_to_header_format tests/test_utils.py::TestFalconUtils::test_etag_strong_vs_weak_comparison tests/test_utils.py::TestFalconUtils::test_secure_filename[.-_] tests/test_utils.py::TestFalconUtils::test_secure_filename[..-_.] tests/test_utils.py::TestFalconUtils::test_secure_filename[hello.txt-hello.txt] tests/test_utils.py::TestFalconUtils::test_secure_filename[\u0104\u017euolai tests/test_utils.py::TestFalconUtils::test_secure_filename[/etc/shadow-_etc_shadow] tests/test_utils.py::TestFalconUtils::test_secure_filename[. tests/test_utils.py::TestFalconUtils::test_secure_filename[C:\\Windows\\kernel32.dll-C__Windows_kernel32.dll] tests/test_utils.py::TestFalconUtils::test_secure_filename_empty_value tests/test_utils.py::TestFalconUtils::test_misc_isascii[-True] tests/test_utils.py::TestFalconUtils::test_misc_isascii[/-True] tests/test_utils.py::TestFalconUtils::test_misc_isascii[/api-True] tests/test_utils.py::TestFalconUtils::test_misc_isascii[/data/items/something?query=apples%20and%20oranges-True] tests/test_utils.py::TestFalconUtils::test_misc_isascii[/food?item=\xf0\x9f\x8d\x94-False] tests/test_utils.py::TestFalconUtils::test_misc_isascii[\x00\x00\x7f\x00\x00\x7f\x00-True] tests/test_utils.py::TestFalconUtils::test_misc_isascii[\x00\x00\x7f\x00\x00\x80\x00-False] tests/test_utils.py::test_simulate_request_protocol[asgi-https-CONNECT] tests/test_utils.py::test_simulate_request_protocol[asgi-https-DELETE] tests/test_utils.py::test_simulate_request_protocol[asgi-https-GET] tests/test_utils.py::test_simulate_request_protocol[asgi-https-HEAD] tests/test_utils.py::test_simulate_request_protocol[asgi-https-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[asgi-https-PATCH] tests/test_utils.py::test_simulate_request_protocol[asgi-https-POST] tests/test_utils.py::test_simulate_request_protocol[asgi-https-PUT] tests/test_utils.py::test_simulate_request_protocol[asgi-https-TRACE] tests/test_utils.py::test_simulate_request_protocol[asgi-http-CONNECT] tests/test_utils.py::test_simulate_request_protocol[asgi-http-DELETE] tests/test_utils.py::test_simulate_request_protocol[asgi-http-GET] tests/test_utils.py::test_simulate_request_protocol[asgi-http-HEAD] tests/test_utils.py::test_simulate_request_protocol[asgi-http-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[asgi-http-PATCH] tests/test_utils.py::test_simulate_request_protocol[asgi-http-POST] tests/test_utils.py::test_simulate_request_protocol[asgi-http-PUT] tests/test_utils.py::test_simulate_request_protocol[asgi-http-TRACE] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-CONNECT] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-DELETE] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-GET] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-HEAD] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-PATCH] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-POST] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-PUT] tests/test_utils.py::test_simulate_request_protocol[wsgi-https-TRACE] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-CONNECT] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-DELETE] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-GET] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-HEAD] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-OPTIONS] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-PATCH] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-POST] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-PUT] tests/test_utils.py::test_simulate_request_protocol[wsgi-http-TRACE] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_get] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_head] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_post] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_put] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_options] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_patch] tests/test_utils.py::test_simulate_free_functions[asgi-simulate_delete] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_get] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_head] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_post] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_put] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_options] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_patch] tests/test_utils.py::test_simulate_free_functions[wsgi-simulate_delete] tests/test_utils.py::TestFalconTestingUtils::test_path_escape_chars_in_create_environ tests/test_utils.py::TestFalconTestingUtils::test_no_prefix_allowed_for_query_strings_in_create_environ tests/test_utils.py::TestFalconTestingUtils::test_plus_in_path_in_create_environ tests/test_utils.py::TestFalconTestingUtils::test_none_header_value_in_create_environ tests/test_utils.py::TestFalconTestingUtils::test_decode_empty_result[asgi] tests/test_utils.py::TestFalconTestingUtils::test_decode_empty_result[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_httpnow_alias_for_backwards_compat tests/test_utils.py::TestFalconTestingUtils::test_default_headers[asgi] tests/test_utils.py::TestFalconTestingUtils::test_default_headers[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_default_headers_with_override[asgi] tests/test_utils.py::TestFalconTestingUtils::test_default_headers_with_override[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_status[asgi] tests/test_utils.py::TestFalconTestingUtils::test_status[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_wsgi_iterable_not_closeable tests/test_utils.py::TestFalconTestingUtils::test_path_must_start_with_slash[asgi] tests/test_utils.py::TestFalconTestingUtils::test_path_must_start_with_slash[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_cached_text_in_result[asgi] tests/test_utils.py::TestFalconTestingUtils::test_cached_text_in_result[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_simple_resource_body_json_xor[SimpleTestResource] tests/test_utils.py::TestFalconTestingUtils::test_simple_resource_body_json_xor[SimpleTestResourceAsync] tests/test_utils.py::TestFalconTestingUtils::test_query_string[asgi] tests/test_utils.py::TestFalconTestingUtils::test_query_string[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_query_string_no_question[asgi] tests/test_utils.py::TestFalconTestingUtils::test_query_string_no_question[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_query_string_in_path[asgi] tests/test_utils.py::TestFalconTestingUtils::test_query_string_in_path[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-16.0625] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-123456789] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-True] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-I tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-document5] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-document6] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[asgi-document7] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-16.0625] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-123456789] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-True] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-I tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-document5] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-document6] tests/test_utils.py::TestFalconTestingUtils::test_simulate_json_body[wsgi-document7] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[asgi-None] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[asgi-127.0.0.1] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[asgi-8.8.8.8] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[asgi-104.24.101.85] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[asgi-2606:4700:30::6818:6455] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[wsgi-None] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[wsgi-127.0.0.1] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[wsgi-8.8.8.8] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[wsgi-104.24.101.85] tests/test_utils.py::TestFalconTestingUtils::test_simulate_remote_addr[wsgi-2606:4700:30::6818:6455] tests/test_utils.py::TestFalconTestingUtils::test_simulate_hostname[asgi] tests/test_utils.py::TestFalconTestingUtils::test_simulate_hostname[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_simulate_with_environ_extras[extras0-expected_headers0] tests/test_utils.py::TestFalconTestingUtils::test_simulate_with_environ_extras[extras1-expected_headers1] tests/test_utils.py::TestFalconTestingUtils::test_override_method_with_extras[asgi] tests/test_utils.py::TestFalconTestingUtils::test_override_method_with_extras[wsgi] tests/test_utils.py::TestFalconTestingUtils::test_simulate_content_type[application/json] tests/test_utils.py::TestFalconTestingUtils::test_simulate_content_type[application/json; tests/test_utils.py::TestFalconTestingUtils::test_simulate_content_type[application/yaml] tests/test_utils.py::TestNoApiClass::test_something tests/test_utils.py::TestSetupApi::test_something tests/test_utils.py::test_get_argnames tests/test_utils.py::TestContextType::test_attributes[CustomContextType] tests/test_utils.py::TestContextType::test_attributes[Context] tests/test_utils.py::TestContextType::test_items_from_attributes[CustomContextType] tests/test_utils.py::TestContextType::test_items_from_attributes[Context] tests/test_utils.py::TestContextType::test_attributes_from_items[CustomContextType] tests/test_utils.py::TestContextType::test_attributes_from_items[Context] tests/test_utils.py::TestContextType::test_dict_interface[CustomContextType-CustomContextType] tests/test_utils.py::TestContextType::test_dict_interface[Context-Context] tests/test_utils.py::TestContextType::test_keys_and_values[CustomContextType] tests/test_utils.py::TestContextType::test_keys_and_values[Context] tests/test_utils.py::TestDeprecatedArgs::test_method tests/test_utils.py::TestDeprecatedArgs::test_function tests/test_utils.py::test_json_deprecation