@@ -30,7 +30,7 @@ use serde_json::json;
3030use tokio:: sync:: { broadcast:: error:: TryRecvError , mpsc} ;
3131use wiremock:: {
3232 Mock , ResponseTemplate ,
33- matchers:: { body_partial_json, header, method, path} ,
33+ matchers:: { body_partial_json, header, method, path, path_regex } ,
3434} ;
3535
3636fn session ( ) -> MatrixSession {
@@ -764,3 +764,74 @@ async fn test_oauth_handle_refresh_tokens() {
764764 "There should be no more session changes"
765765 ) ;
766766}
767+
768+ #[ async_test]
769+ async fn test_oauth_handle_refresh_tokens_without_versions ( ) {
770+ use matrix_sdk:: test_utils:: {
771+ client:: {
772+ mock_prev_session_tokens_with_refresh, mock_session_tokens_with_refresh,
773+ oauth:: mock_session,
774+ } ,
775+ mocks:: MatrixMockServer ,
776+ } ;
777+
778+ let server = MatrixMockServer :: new ( ) . await ;
779+ let oauth_server = server. oauth ( ) ;
780+
781+ // If we provide an access token, we encounter a failure, likely because the
782+ // token has expired.
783+ Mock :: given ( method ( "GET" ) )
784+ . and ( path_regex ( r"^/_matrix/client/versions" ) )
785+ . and ( header ( "authorization" , "Bearer prev-access-token" ) )
786+ . respond_with ( ResponseTemplate :: new ( 401 ) )
787+ . mount ( server. server ( ) )
788+ . await ;
789+
790+ // If we do not provide an access token, all is fine as the endpoint does not
791+ // require one.
792+ Mock :: given ( method ( "GET" ) )
793+ . and ( path_regex ( r"^/_matrix/client/versions" ) )
794+ . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
795+ "versions" : [
796+ "r0.0.1" ,
797+ "v1.1"
798+ ]
799+ } ) ) )
800+ . expect ( 1 ..)
801+ . mount ( server. server ( ) )
802+ . await ;
803+
804+ oauth_server. mock_server_metadata ( ) . ok ( ) . expect ( 1 ..) . named ( "server_metadata" ) . mount ( ) . await ;
805+
806+ let client = server
807+ . client_builder ( )
808+ . unlogged ( )
809+ . on_builder ( |builder| builder. handle_refresh_tokens ( ) )
810+ . build ( )
811+ . await ;
812+
813+ let oauth = client. oauth ( ) ;
814+ oauth
815+ . restore_session (
816+ mock_session ( mock_prev_session_tokens_with_refresh ( ) ) ,
817+ RoomLoadSettings :: default ( ) ,
818+ )
819+ . await
820+ . unwrap ( ) ;
821+
822+ // Ensure that we don't have any server info.
823+ client. reset_server_info ( ) . await . unwrap ( ) ;
824+
825+ assert_eq ! ( client. session_tokens( ) , Some ( mock_prev_session_tokens_with_refresh( ) ) ) ;
826+
827+ // Refresh token successfully.
828+ oauth_server. mock_token ( ) . ok ( ) . mock_once ( ) . named ( "refresh_token" ) . mount ( ) . await ;
829+ oauth. refresh_access_token ( ) . await . unwrap ( ) ;
830+
831+ // The tokens were updated.
832+ assert_eq ! (
833+ client. session_tokens( ) ,
834+ Some ( mock_session_tokens_with_refresh( ) ) ,
835+ "The session tokens should have been updated with the new values"
836+ ) ;
837+ }
0 commit comments