@@ -346,6 +346,45 @@ def test_revoke_sends_revoke_request(
346346 assert oauth .access_token is None
347347
348348
349+ @pytest .fixture
350+ def check_downscope_token_request (
351+ oauth ,
352+ mock_network_layer ,
353+ mock_box_session ,
354+ mock_object_id ,
355+ make_mock_box_request ,
356+ ):
357+ def do_check (access_token , item_class , scopes , additional_data , expected_data ):
358+ dummy_downscoped_token = 'dummy_downscoped_token'
359+ dummy_expires_in = 1234
360+ mock_network_response , _ = make_mock_box_request (
361+ response = {'access_token' : dummy_downscoped_token , 'expires_in' : dummy_expires_in },
362+ )
363+ mock_network_layer .request .return_value = mock_network_response
364+
365+ item = item_class (mock_box_session , mock_object_id ) if item_class else None
366+
367+ if additional_data :
368+ downscoped_token_response = oauth .downscope_token (scopes , item , additional_data )
369+ else :
370+ downscoped_token_response = oauth .downscope_token (scopes , item )
371+
372+ assert downscoped_token_response .access_token == dummy_downscoped_token
373+ assert downscoped_token_response .expires_in == dummy_expires_in
374+
375+ if item :
376+ expected_data ['resource' ] = item .get_url ()
377+ mock_network_layer .request .assert_called_once_with (
378+ 'POST' ,
379+ '{0}/token' .format (API .OAUTH2_API_URL ),
380+ data = expected_data ,
381+ headers = {'content-type' : 'application/x-www-form-urlencoded' },
382+ access_token = access_token ,
383+ )
384+
385+ return do_check
386+
387+
349388@pytest .mark .parametrize (
350389 'item_class,scopes,expected_scopes' ,
351390 [
@@ -356,72 +395,34 @@ def test_revoke_sends_revoke_request(
356395 ],
357396)
358397def test_downscope_token_sends_downscope_request (
359- oauth ,
360398 access_token ,
361- mock_network_layer ,
362- mock_box_session ,
363- mock_object_id ,
364- make_mock_box_request ,
399+ check_downscope_token_request ,
365400 item_class ,
366401 scopes ,
367402 expected_scopes ,
368403):
369- mock_downscoped_token = 'mock_downscoped_token'
370- mock_network_response , _ = make_mock_box_request (response = {'access_token' : mock_downscoped_token })
371- mock_network_layer .request .return_value = mock_network_response
372-
373- item = item_class (mock_box_session , mock_object_id ) if item_class else None
374- downscoped_token = oauth .downscope_token (scopes , item )
375-
376- assert downscoped_token == mock_downscoped_token
377404 expected_data = {
378405 'subject_token' : access_token ,
379406 'subject_token_type' : 'urn:ietf:params:oauth:token-type:access_token' ,
380407 'scope' : expected_scopes ,
381408 'grant_type' : 'urn:ietf:params:oauth:grant-type:token-exchange' ,
382409 }
383- if item :
384- expected_data ['resource' ] = item .get_url ()
385- mock_network_layer .request .assert_called_once_with (
386- 'POST' ,
387- '{0}/token' .format (API .OAUTH2_API_URL ),
388- data = expected_data ,
389- headers = {'content-type' : 'application/x-www-form-urlencoded' },
390- access_token = access_token ,
391- )
410+ check_downscope_token_request (access_token , item_class , scopes , {}, expected_data )
392411
393412
394413def test_downscope_token_sends_downscope_request_with_additional_data (
395- oauth ,
396414 access_token ,
397- mock_network_layer ,
398- mock_box_session ,
399- mock_object_id ,
400- make_mock_box_request ,
415+ check_downscope_token_request ,
401416):
402- mock_downscoped_token = 'mock_downscoped_token'
403- mock_network_response , _ = make_mock_box_request (response = {'access_token' : mock_downscoped_token })
404- mock_network_layer .request .return_value = mock_network_response
405-
406- item = File (mock_box_session , mock_object_id )
407417 additional_data = {'grant_type' : 'new_grant_type' , 'extra_data_key' : 'extra_data_value' }
408- downscoped_token = oauth .downscope_token ([TokenScope .ITEM_READWRITE ], item , additional_data )
409-
410- assert downscoped_token == mock_downscoped_token
411- mock_network_layer .request .assert_called_once_with (
412- 'POST' ,
413- '{0}/token' .format (API .OAUTH2_API_URL ),
414- data = {
415- 'subject_token' : access_token ,
416- 'subject_token_type' : 'urn:ietf:params:oauth:token-type:access_token' ,
417- 'scope' : 'item_readwrite' ,
418- 'resource' : item .get_url (),
419- 'grant_type' : 'new_grant_type' ,
420- 'extra_data_key' : 'extra_data_value' ,
421- },
422- headers = {'content-type' : 'application/x-www-form-urlencoded' },
423- access_token = access_token ,
424- )
418+ expected_data = {
419+ 'subject_token' : access_token ,
420+ 'subject_token_type' : 'urn:ietf:params:oauth:token-type:access_token' ,
421+ 'scope' : 'item_readwrite' ,
422+ 'grant_type' : 'new_grant_type' ,
423+ 'extra_data_key' : 'extra_data_value' ,
424+ }
425+ check_downscope_token_request (access_token , File , [TokenScope .ITEM_READWRITE ], additional_data , expected_data )
425426
426427
427428def test_tokens_get_updated_after_noop_refresh (client_id , client_secret , access_token , new_access_token , refresh_token , mock_network_layer ):
0 commit comments