@@ -1054,6 +1054,112 @@ void main() {
10541054 });
10551055 });
10561056
1057+ group ('_defaultShouldRefreshBeforeRequest' , () {
1058+ test (
1059+ 'does not refresh when token expires '
1060+ 'more than 30 seconds from now' , () async {
1061+ final token = OAuth2Token (
1062+ accessToken: 'accessToken' ,
1063+ issuedAt: DateTime .now (),
1064+ expiresIn: 60 ,
1065+ );
1066+ when (() => tokenStorage.read ()).thenAnswer ((_) async => token);
1067+ when (() => tokenStorage.write (any ())).thenAnswer ((_) async {});
1068+
1069+ var refreshCallCount = 0 ;
1070+ final fresh = Fresh .oAuth2 <OAuth2Token >(
1071+ tokenStorage: tokenStorage,
1072+ refreshToken: (token, client) async {
1073+ refreshCallCount++ ;
1074+ return token ?? MockToken ();
1075+ },
1076+ );
1077+
1078+ final options = RequestOptions ();
1079+ await fresh.onRequest (options, requestHandler);
1080+
1081+ expect (refreshCallCount, 0 );
1082+ });
1083+
1084+ test ('refreshes when token expires within 30 seconds' , () async {
1085+ final token = OAuth2Token (
1086+ accessToken: 'accessToken' ,
1087+ issuedAt: DateTime .now (),
1088+ expiresIn: 29 ,
1089+ );
1090+ when (() => tokenStorage.read ()).thenAnswer ((_) async => token);
1091+ when (() => tokenStorage.write (any ())).thenAnswer ((_) async {});
1092+
1093+ var refreshCallCount = 0 ;
1094+ final fresh = Fresh .oAuth2 <OAuth2Token >(
1095+ tokenStorage: tokenStorage,
1096+ refreshToken: (_, __) async {
1097+ refreshCallCount++ ;
1098+ return const OAuth2Token (accessToken: 'newToken' );
1099+ },
1100+ );
1101+
1102+ final options = RequestOptions ();
1103+ await fresh.onRequest (options, requestHandler);
1104+
1105+ expect (refreshCallCount, 1 );
1106+ verify (() => tokenStorage.write (any ())).called (1 );
1107+ });
1108+
1109+ test (
1110+ 'refreshes when token expires '
1111+ 'exactly at the 30 second boundary' , () async {
1112+ final token = OAuth2Token (
1113+ accessToken: 'accessToken' ,
1114+ issuedAt: DateTime .now (),
1115+ expiresIn: 30 ,
1116+ );
1117+ when (() => tokenStorage.read ()).thenAnswer ((_) async => token);
1118+ when (() => tokenStorage.write (any ())).thenAnswer ((_) async {});
1119+
1120+ var refreshCallCount = 0 ;
1121+ final fresh = Fresh .oAuth2 <OAuth2Token >(
1122+ tokenStorage: tokenStorage,
1123+ refreshToken: (token, client) async {
1124+ refreshCallCount++ ;
1125+ return token ?? MockToken ();
1126+ },
1127+ );
1128+
1129+ final options = RequestOptions ();
1130+ await fresh.onRequest (options, requestHandler);
1131+
1132+ expect (refreshCallCount, 1 );
1133+ });
1134+
1135+ test ('refreshes when token is already expired' , () async {
1136+ final expiredToken = OAuth2Token (
1137+ accessToken: 'expiredToken' ,
1138+ issuedAt: DateTime .now ().subtract (const Duration (hours: 2 )),
1139+ expiresIn: 3600 ,
1140+ );
1141+ const newToken = OAuth2Token (accessToken: 'newToken' );
1142+
1143+ when (() => tokenStorage.read ()).thenAnswer ((_) async => expiredToken);
1144+ when (() => tokenStorage.write (any ())).thenAnswer ((_) async {});
1145+
1146+ var refreshCallCount = 0 ;
1147+ final fresh = Fresh .oAuth2 <OAuth2Token >(
1148+ tokenStorage: tokenStorage,
1149+ refreshToken: (_, __) async {
1150+ refreshCallCount++ ;
1151+ return newToken;
1152+ },
1153+ );
1154+
1155+ final options = RequestOptions ();
1156+ await fresh.onRequest (options, requestHandler);
1157+
1158+ expect (refreshCallCount, 1 );
1159+ verify (() => tokenStorage.write (any ())).called (1 );
1160+ });
1161+ });
1162+
10571163 group ('close' , () {
10581164 test ('should close streams' , () async {
10591165 final token = MockToken ();
0 commit comments