@@ -53,6 +53,15 @@ def tearDown(self):
53
53
return super ().tearDown ()
54
54
55
55
56
+ class MockOauthlibCoreClass :
57
+ """
58
+ Mock oauthlib, used in test_token_view_status_equals_what_oauthlib_token_response_method_returns.
59
+ """
60
+
61
+ def create_token_response (self , _ ):
62
+ return "url" , {"headers_are_ignored" : True }, '{"Key": "Value"}' , 299
63
+
64
+
56
65
class TestDeviceFlow (DeviceFlowBaseTestCase ):
57
66
"""
58
67
The first 2 tests test the device flow in order
@@ -439,6 +448,39 @@ def test_token_view_returns_404_error_if_device_not_found(self):
439
448
# consumed by devices.
440
449
self .assertEqual (response .__getitem__ ("content-type" ), "application/json" )
441
450
451
+ @mock .patch ("oauth2_provider.views.mixins.OAuthLibMixin.get_oauthlib_core" , MockOauthlibCoreClass )
452
+ def test_token_view_status_equals_what_oauthlib_token_response_method_returns (self ):
453
+ device = DeviceModel (
454
+ client_id = "client_id" ,
455
+ device_code = "device_code" ,
456
+ user_code = "user_code" ,
457
+ scope = "scope" ,
458
+ expires = datetime .now () + timedelta (seconds = 60 ),
459
+ status = "authorized" ,
460
+ )
461
+ device .save ()
462
+
463
+ token_payload = {
464
+ "device_code" : "device_code" ,
465
+ "client_id" : "client_id" ,
466
+ "grant_type" : "urn:ietf:params:oauth:grant-type:device_code" ,
467
+ }
468
+
469
+ response = self .client .post (
470
+ "/o/token/" ,
471
+ data = urlencode (token_payload ),
472
+ content_type = "application/x-www-form-urlencoded" ,
473
+ )
474
+
475
+ self .assertEqual (response ["content-type" ], "application/json" )
476
+ self .assertContains (
477
+ response = response ,
478
+ status_code = 299 ,
479
+ text = '{"Key": "Value"}' ,
480
+ count = 1 ,
481
+ )
482
+ assert not response .has_header ("headers_are_ignored" )
483
+
442
484
@mock .patch (
443
485
"oauthlib.oauth2.rfc8628.endpoints.device_authorization.generate_token" ,
444
486
lambda : "abc" ,
@@ -644,3 +686,9 @@ def test_device_is_expired_method_sets_status_to_expired_if_deadline_passed(self
644
686
645
687
assert is_expired
646
688
assert device .status == device .EXPIRED
689
+
690
+ # calling again is_expired() should return true and not change the state
691
+ is_expired = device .is_expired ()
692
+
693
+ assert is_expired
694
+ assert device .status == device .EXPIRED
0 commit comments