Skip to content

Commit fc374e7

Browse files
authored
Merge pull request #37474 from openedx/fix-assert-dict-contains-subset-depr
fix: replace deprecated assertDictContainsSubset()
2 parents 3db4399 + 8aa2970 commit fc374e7

File tree

26 files changed

+362
-210
lines changed

26 files changed

+362
-210
lines changed

cms/djangoapps/contentstore/views/tests/test_block.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
add_container_page_publishing_info,
8787
create_xblock_info,
8888
)
89+
from common.test.utils import assert_dict_contains_subset
8990

9091

9192
class AsideTest(XBlockAside):
@@ -863,7 +864,8 @@ def test_duplicate_event(self):
863864
XBLOCK_DUPLICATED.connect(event_receiver)
864865
usage_key = self._duplicate_and_verify(self.vert_usage_key, self.seq_usage_key)
865866
event_receiver.assert_called()
866-
self.assertDictContainsSubset(
867+
assert_dict_contains_subset(
868+
self,
867869
{
868870
"signal": XBLOCK_DUPLICATED,
869871
"sender": None,

common/djangoapps/student/tests/test_events.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from xmodule.modulestore.tests.django_utils import \
3737
SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
3838
from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order
39+
from common.test.utils import assert_dict_contains_subset
3940

4041

4142
class TestUserProfileEvents(UserSettingsEventTestMixin, TestCase):
@@ -271,7 +272,8 @@ def test_enrollment_created_event_emitted(self):
271272
enrollment = CourseEnrollment.enroll(self.user, self.course.id)
272273

273274
self.assertTrue(self.receiver_called)
274-
self.assertDictContainsSubset(
275+
assert_dict_contains_subset(
276+
self,
275277
{
276278
"signal": COURSE_ENROLLMENT_CREATED,
277279
"sender": None,
@@ -294,7 +296,7 @@ def test_enrollment_created_event_emitted(self):
294296
creation_date=enrollment.created,
295297
),
296298
},
297-
event_receiver.call_args.kwargs
299+
event_receiver.call_args.kwargs,
298300
)
299301

300302
def test_enrollment_changed_event_emitted(self):
@@ -314,7 +316,8 @@ def test_enrollment_changed_event_emitted(self):
314316
enrollment.update_enrollment(mode="verified")
315317

316318
self.assertTrue(self.receiver_called)
317-
self.assertDictContainsSubset(
319+
assert_dict_contains_subset(
320+
self,
318321
{
319322
"signal": COURSE_ENROLLMENT_CHANGED,
320323
"sender": None,
@@ -337,7 +340,7 @@ def test_enrollment_changed_event_emitted(self):
337340
creation_date=enrollment.created,
338341
),
339342
},
340-
event_receiver.call_args.kwargs
343+
event_receiver.call_args.kwargs,
341344
)
342345

343346
def test_unenrollment_completed_event_emitted(self):
@@ -357,7 +360,8 @@ def test_unenrollment_completed_event_emitted(self):
357360
CourseEnrollment.unenroll(self.user, self.course.id)
358361

359362
self.assertTrue(self.receiver_called)
360-
self.assertDictContainsSubset(
363+
assert_dict_contains_subset(
364+
self,
361365
{
362366
"signal": COURSE_UNENROLLMENT_COMPLETED,
363367
"sender": None,
@@ -380,7 +384,7 @@ def test_unenrollment_completed_event_emitted(self):
380384
creation_date=enrollment.created,
381385
),
382386
},
383-
event_receiver.call_args.kwargs
387+
event_receiver.call_args.kwargs,
384388
)
385389

386390

@@ -430,7 +434,8 @@ def test_access_role_created_event_emitted(self, AccessRole):
430434
role.add_users(self.user)
431435

432436
self.assertTrue(self.receiver_called)
433-
self.assertDictContainsSubset(
437+
assert_dict_contains_subset(
438+
self,
434439
{
435440
"signal": COURSE_ACCESS_ROLE_ADDED,
436441
"sender": None,
@@ -448,7 +453,7 @@ def test_access_role_created_event_emitted(self, AccessRole):
448453
role=role._role_name, # pylint: disable=protected-access
449454
),
450455
},
451-
event_receiver.call_args.kwargs
456+
event_receiver.call_args.kwargs,
452457
)
453458

454459
@ddt.data(
@@ -468,7 +473,8 @@ def test_access_role_removed_event_emitted(self, AccessRole):
468473
role.remove_users(self.user)
469474

470475
self.assertTrue(self.receiver_called)
471-
self.assertDictContainsSubset(
476+
assert_dict_contains_subset(
477+
self,
472478
{
473479
"signal": COURSE_ACCESS_ROLE_REMOVED,
474480
"sender": None,
@@ -486,5 +492,5 @@ def test_access_role_removed_event_emitted(self, AccessRole):
486492
role=role._role_name, # pylint: disable=protected-access
487493
),
488494
},
489-
event_receiver.call_args.kwargs
495+
event_receiver.call_args.kwargs,
490496
)

common/djangoapps/third_party_auth/tests/specs/test_testshib.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from openedx.features.enterprise_support.tests.factories import EnterpriseCustomerFactory
3131

3232
from .base import IntegrationTestMixin
33+
from common.test.utils import assert_dict_contains_subset
3334

3435
TESTSHIB_ENTITY_ID = "https://idp.testshib.org/idp/shibboleth"
3536
TESTSHIB_METADATA_URL = "https://mock.testshib.org/metadata/testshib-providers.xml"
@@ -402,8 +403,10 @@ def test_debug_mode_login(self, debug_mode_enabled):
402403
assert msg.startswith("SAML login %s")
403404
assert action_type == "request"
404405
assert idp_name == self.PROVIDER_IDP_SLUG
405-
self.assertDictContainsSubset(
406-
{"idp": idp_name, "auth_entry": "login", "next": expected_next_url}, request_data
406+
assert_dict_contains_subset(
407+
self,
408+
{"idp": idp_name, "auth_entry": "login", "next": expected_next_url},
409+
request_data,
407410
)
408411
assert next_url == expected_next_url
409412
assert "<samlp:AuthnRequest" in xml
@@ -412,7 +415,7 @@ def test_debug_mode_login(self, debug_mode_enabled):
412415
assert msg.startswith("SAML login %s")
413416
assert action_type == "response"
414417
assert idp_name == self.PROVIDER_IDP_SLUG
415-
self.assertDictContainsSubset({"RelayState": idp_name}, response_data)
418+
assert_dict_contains_subset(self, {"RelayState": idp_name}, response_data)
416419
assert "SAMLResponse" in response_data
417420
assert next_url == expected_next_url
418421
assert "<saml2p:Response" in xml

common/djangoapps/third_party_auth/tests/test_identityserver3.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from common.djangoapps.third_party_auth.identityserver3 import IdentityServer3
77
from common.djangoapps.third_party_auth.tests import testutil
88
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
9+
from common.test.utils import assert_dict_contains_subset
910

1011

1112
@skip_unless_thirdpartyauth()
@@ -97,13 +98,14 @@ def test_user_details_without_settings(self):
9798
Test user details fields are mapped to default keys
9899
"""
99100
provider_config = self.configure_identityServer3_provider(enabled=True)
100-
self.assertDictContainsSubset(
101+
assert_dict_contains_subset(
102+
self,
101103
{
102104
"username": "Edx",
103105
"email": "[email protected]",
104106
"first_name": "Edx",
105107
"last_name": "Openid",
106108
"fullname": "Edx Openid"
107109
},
108-
provider_config.backend_class().get_user_details(self.response)
110+
provider_config.backend_class().get_user_details(self.response),
109111
)

common/djangoapps/third_party_auth/tests/test_lti.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from common.djangoapps.third_party_auth.lti import LTI_PARAMS_KEY, LTIAuthBackend
1111
from common.djangoapps.third_party_auth.tests.testutil import ThirdPartyAuthTestMixin
12+
from common.test.utils import assert_dict_contains_subset
1213

1314

1415
class UnitTestLTI(unittest.TestCase, ThirdPartyAuthTestMixin):
@@ -55,10 +56,14 @@ def test_validate_lti_valid_request(self):
5556
lti_max_timestamp_age=10
5657
)
5758
assert parameters
58-
self.assertDictContainsSubset({
59-
'custom_extra': 'parameter',
60-
'user_id': '292832126'
61-
}, parameters)
59+
assert_dict_contains_subset(
60+
self,
61+
{
62+
'custom_extra': 'parameter',
63+
'user_id': '292832126'
64+
},
65+
parameters,
66+
)
6267

6368
def test_validate_lti_valid_request_with_get_params(self):
6469
request = Request(
@@ -72,10 +77,14 @@ def test_validate_lti_valid_request_with_get_params(self):
7277
lti_max_timestamp_age=10
7378
)
7479
assert parameters
75-
self.assertDictContainsSubset({
76-
'custom_extra': 'parameter',
77-
'user_id': '292832126'
78-
}, parameters)
80+
assert_dict_contains_subset(
81+
self,
82+
{
83+
'custom_extra': 'parameter',
84+
'user_id': '292832126'
85+
},
86+
parameters,
87+
)
7988

8089
def test_validate_lti_old_timestamp(self):
8190
request = Request(

common/test/utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@
1212
from markupsafe import escape
1313

1414

15+
def assert_dict_contains_subset(test_case, subset, superset):
16+
"""
17+
Assert that `superset` includes all key/value pairs from `subset`.
18+
"""
19+
test_case.assertTrue(
20+
all(item in superset.items() for item in subset.items())
21+
)
22+
23+
1524
@contextmanager
1625
def nostderr():
1726
"""

lms/djangoapps/certificates/tests/test_events.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from openedx.core.djangolib.testing.utils import skip_unless_lms
1919

2020
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
21+
from common.test.utils import assert_dict_contains_subset
2122

2223

2324
@skip_unless_lms
@@ -94,7 +95,8 @@ def test_send_certificate_created_event(self):
9495
)
9596

9697
self.assertTrue(self.receiver_called)
97-
self.assertDictContainsSubset(
98+
assert_dict_contains_subset(
99+
self,
98100
{
99101
"signal": CERTIFICATE_CREATED,
100102
"sender": None,
@@ -118,7 +120,7 @@ def test_send_certificate_created_event(self):
118120
name=certificate.name,
119121
),
120122
},
121-
event_receiver.call_args.kwargs
123+
event_receiver.call_args.kwargs,
122124
)
123125

124126
def test_send_certificate_changed_event(self):
@@ -147,7 +149,8 @@ def test_send_certificate_changed_event(self):
147149
certificate.save()
148150

149151
self.assertTrue(self.receiver_called)
150-
self.assertDictContainsSubset(
152+
assert_dict_contains_subset(
153+
self,
151154
{
152155
"signal": CERTIFICATE_CHANGED,
153156
"sender": None,
@@ -171,7 +174,7 @@ def test_send_certificate_changed_event(self):
171174
name=certificate.name,
172175
),
173176
},
174-
event_receiver.call_args.kwargs
177+
event_receiver.call_args.kwargs,
175178
)
176179

177180
def test_send_certificate_revoked_event(self):
@@ -199,7 +202,8 @@ def test_send_certificate_revoked_event(self):
199202
certificate.invalidate()
200203

201204
self.assertTrue(self.receiver_called)
202-
self.assertDictContainsSubset(
205+
assert_dict_contains_subset(
206+
self,
203207
{
204208
"signal": CERTIFICATE_REVOKED,
205209
"sender": None,
@@ -223,5 +227,5 @@ def test_send_certificate_revoked_event(self):
223227
name=certificate.name,
224228
),
225229
},
226-
event_receiver.call_args.kwargs
230+
event_receiver.call_args.kwargs,
227231
)

lms/djangoapps/commerce/tests/test_signals.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from ..utils import _generate_refund_notification_body, _send_refund_notification, create_zendesk_ticket
2727
from . import JSON
2828
from .mocks import mock_create_refund, mock_process_refund
29+
from common.test.utils import assert_dict_contains_subset
2930

3031
ZENDESK_URL = 'http://zendesk.example.com/'
3132
ZENDESK_USER = '[email protected]'
@@ -309,7 +310,7 @@ def test_create_zendesk_ticket(self):
309310
f'{ZENDESK_USER}/token:{ZENDESK_API_KEY}'.encode('utf8')).decode('utf8')
310311
)
311312
}
312-
self.assertDictContainsSubset(expected, last_request.headers)
313+
assert_dict_contains_subset(self, expected, last_request.headers)
313314

314315
# Verify the content
315316
expected = {

0 commit comments

Comments
 (0)