9
9
from pathlib import Path
10
10
from unittest import mock , skipIf , skipUnless
11
11
12
+ from asgiref .sync import async_to_sync , iscoroutinefunction
13
+
12
14
from django .core import mail
13
15
from django .core .files .uploadedfile import SimpleUploadedFile
14
16
from django .db import DatabaseError , connection
39
41
from django .views .decorators .debug import sensitive_post_parameters , sensitive_variables
40
42
41
43
from ..views import (
44
+ async_sensitive_method_view ,
45
+ async_sensitive_method_view_nested ,
46
+ async_sensitive_view ,
47
+ async_sensitive_view_nested ,
42
48
custom_exception_reporter_filter_view ,
43
49
index_page ,
44
50
multivalue_dict_key_error ,
@@ -1351,7 +1357,10 @@ def verify_unsafe_response(
1351
1357
Asserts that potentially sensitive info are displayed in the response.
1352
1358
"""
1353
1359
request = self .rf .post ("/some_url/" , self .breakfast_data )
1354
- response = view (request )
1360
+ if iscoroutinefunction (view ):
1361
+ response = async_to_sync (view )(request )
1362
+ else :
1363
+ response = view (request )
1355
1364
if check_for_vars :
1356
1365
# All variables are shown.
1357
1366
self .assertContains (response , "cooked_eggs" , status_code = 500 )
@@ -1371,7 +1380,10 @@ def verify_safe_response(
1371
1380
Asserts that certain sensitive info are not displayed in the response.
1372
1381
"""
1373
1382
request = self .rf .post ("/some_url/" , self .breakfast_data )
1374
- response = view (request )
1383
+ if iscoroutinefunction (view ):
1384
+ response = async_to_sync (view )(request )
1385
+ else :
1386
+ response = view (request )
1375
1387
if check_for_vars :
1376
1388
# Non-sensitive variable's name and value are shown.
10000
span>
1377
1389
self .assertContains (response , "cooked_eggs" , status_code = 500 )
@@ -1418,7 +1430,10 @@ def verify_unsafe_email(self, view, check_for_POST_params=True):
1418
1430
with self .settings (ADMINS = [("Admin" , "admin@fattie-breakie.com" )]):
1419
1431
mail .outbox = [] # Empty outbox
1420
1432
request = self .rf .post ("/some_url/" , self .breakfast_data )
1421
- view (request )
1433
+ if iscoroutinefunction (view ):
1434
+ async_to_sync (view )(request )
1435
+ else :
1436
+ view (request )
1422
1437
self .assertEqual (len (mail .outbox ), 1 )
1423
1438
email = mail .outbox [0 ]
1424
1439
@@ -1451,7 +1466,10 @@ def verify_safe_email(self, view, check_for_POST_params=True):
1451
1466
with self .settings (ADMINS = [("Admin" , "admin@fattie-breakie.com" )]):
1452
1467
mail .outbox = [] # Empty outbox
1453
1468
request = self .rf .post ("/some_url/" , self .breakfast_data )
1454
- view (request )
1469
+ if iscoroutinefunction (view ):
1470
+ async_to_sync (view )(request )
1471
+ else :
1472
+ view (request )
1455
1473
self .assertEqual (len (mail .outbox ), 1 )
1456
1474
email = mail .outbox [0 ]
1457
1475
@@ -1543,6 +1561,24 @@ def test_sensitive_request(self):
1543
1561
self .verify_safe_response (sensitive_view )
1544
1562
self .verify_safe_email (sensitive_view )
1545
1563
1564
+ def test_async_sensitive_request (self ):
1565
+ with self .settings (DEBUG = True ):
1566
+ self .verify_unsafe_response (async_sensitive_view )
1567
+ self .verify_unsafe_email (async_sensitive_view )
1568
+
1569
+ with self .settings (DEBUG = False ):
1570
+ self .verify_safe_response (async_sensitive_view )
1571
+ self .verify_safe_email (async_sensitive_view )
1572
+
1573
+ def test_async_sensitive_nested_request (self ):
1574
+ with self .settings (DEBUG = True ):
1575
+ self .verify_unsafe_response (async_sensitive_view_nested )
1576
+ self .verify_unsafe_email (async_sensitive_view_nested )
1577
+
1578
+ with self .settings (DEBUG = False ):
1579
+ self .verify_safe_response (async_sensitive_view_nested )
1580
+ self .verify_safe_email (async_sensitive_view_nested )
1581
+
1546
1582
def test_paranoid_request (self ):
1547
1583
"""
1548
1584
No POST parameters and frame variables can be seen in the
@@ -1598,6 +1634,46 @@ def test_sensitive_method(self):
1598
1634
)
1599
1635
self .verify_safe_email (sensitive_method_view , check_for_POST_params = False )
1600
1636
1637
+ def test_async_sensitive_method (self ):
1638
+ """
1639
+ The sensitive_variables decorator works with async object methods.
1640
+ """
1641
+ with self .settings (DEBUG = True ):
1642
+ self .verify_unsafe_response (
1643
+ async_sensitive_method_view , check_for_POST_params = False
1644
+ )
1645
+ self .verify_unsafe_email (
1646
+ async_sensitive_method_view , check_for_POST_params = False
1647
+ )
1648
+
1649
+ with self .settings (DEBUG = False ):
1650
+ self .verify_safe_response (
1651
+ async_sensitive_method_view , check_for_POST_params = False
1652
+ )
1653
+ self .verify_safe_email (
1654
+ async_sensitive_method_view , check_for_POST_params = False
1655
+ )
1656
+
1657
+ def test_async_sensitive_method_nested (self ):
1658
+ """
1659
+ The sensitive_variables decorator works with async object methods.
1660
+ """
1661
+ with self .settings (DEBUG = True ):
1662
+ self .verify_unsafe_response (
1663
+ async_sensitive_method_view_nested , check_for_POST_params = False
1664
+ )
1665
+ self .verify_unsafe_email (
1666
+ async_sensitive_method_view_nested , check_for_POST_params = False
1667
+ )
1668
+
1669
+ with self .settings (DEBUG = False ):
1670
+ self .verify_safe_response (
1671
+ async_sensitive_method_view_nested , check_for_POST_params = False
1672
+ )
1673
+ self .verify_safe_email (
1674
+ async_sensitive_method_view_nested , check_for_POST_params = False
1675
+ )
1676
+
1601
1677
def test_sensitive_function_arguments (self ):
1602
1678
"""
1603
1679
Sensitive variables don't leak in the sensitive_variables decorator's
@@ -1890,6 +1966,30 @@ def test_sensitive_request(self):
1890
1966
with self .settings (DEBUG = False ):
1891
1967
self .verify_safe_response (sensitive_view , check_for_vars = False )
1892
1968
1969
+ def test_async_sensitive_request (self ):
1970
+ """
1971
+ Sensitive POST parameters cannot be seen in the default
1972
+ error reports for sensitive requests.
1973
+ """
1974
+ with self .settings (DEBUG = True ):
1975
+ self .verify_unsafe_response (async_sensitive_view , check_for_vars = False )
1976
+
1977
+ with self .settings (DEBUG = False ):
1978
+ self .verify_safe_response (async_sensitive_view , check_for_vars = False )
1979
+
1980
+ def test_async_sensitive_request_nested (self ):
1981
+ """
1982
+ Sensitive POST parameters cannot be seen in the default
1983
+ error reports for sensitive requests.
1984
+ """
1985
+ with self .settings (DEBUG = True ):
1986
+ self .verify_unsafe_response (
1987
+ async_sensitive_view_nested , check_for_vars = False
1988
+ )
1989
+
1990
+ with self .settings (DEBUG = False ):
1991
+ self .verify_safe_response (async_sensitive_view_nested , check_for_vars = False )
1992
+
1893
1993
def test_paranoid_request (self ):
1894
1994
"""
1895
1995
No POST parameters can be seen in the default error reports
0 commit comments