Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions packages/talker_dio_logger/lib/dio_logs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,15 @@ class DioResponseLog extends TalkerLog {
String message, {
required this.response,
required this.settings,
}) : super(message);
}) : responseTime = _getResponseTime(response.requestOptions),
super(message);

final Response<dynamic> response;
final TalkerDioLoggerSettings settings;

/// Response time in milliseconds, calculated once when the log is created
final int? responseTime;

@override
AnsiPen get pen => settings.responsePen ?? (AnsiPen()..xterm(46));

Expand All @@ -127,8 +131,6 @@ class DioResponseLog extends TalkerLog {
msg += '\nStatus: ${response.statusCode}';

if (settings.printResponseTime) {
final responseTime = _getResponseTime(response.requestOptions);

if (responseTime != null) {
msg += '\nTime: $responseTime ms';
}
Expand Down Expand Up @@ -167,11 +169,15 @@ class DioErrorLog extends TalkerLog {
String title, {
required this.dioException,
required this.settings,
}) : super(title);
}) : responseTime = _getResponseTime(dioException.requestOptions),
super(title);

final DioException dioException;
final TalkerDioLoggerSettings settings;

/// Response time in milliseconds, calculated once when the log is created
final int? responseTime;

@override
AnsiPen get pen => settings.errorPen ?? (AnsiPen()..red());

Expand All @@ -197,8 +203,6 @@ class DioErrorLog extends TalkerLog {
}

if (settings.printResponseTime) {
final responseTime = _getResponseTime(dioException.requestOptions);

if (responseTime != null) {
msg += '\nTime: $responseTime ms';
}
Expand Down
67 changes: 67 additions & 0 deletions packages/talker_dio_logger/test/logs_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,41 @@ void main() {
expect(result, isNot(contains('Time:')));
});

test(
'response time should remain consistent across multiple calls to generateTextMessage',
() async {
final response = Response(
requestOptions: RequestOptions(path: '/test', method: 'GET', extra: {
TalkerDioLogger.kDioLogsTimeStampKey:
DateTime.now().millisecondsSinceEpoch - 100, // 100ms ago
}),
statusCode: 200,
statusMessage: 'OK',
);
final settings = TalkerDioLoggerSettings(printResponseTime: true);
final dioResponseLog = DioResponseLog(
'Test message',
response: response,
settings: settings,
);

final result1 = dioResponseLog.generateTextMessage();
await Future.delayed(Duration(milliseconds: 50));
final result2 = dioResponseLog.generateTextMessage();
await Future.delayed(Duration(milliseconds: 50));
final result3 = dioResponseLog.generateTextMessage();

// Extract time values from the results
final timeRegex = RegExp(r'Time: (\d+) ms');
final time1 = int.parse(timeRegex.firstMatch(result1)!.group(1)!);
final time2 = int.parse(timeRegex.firstMatch(result2)!.group(1)!);
final time3 = int.parse(timeRegex.firstMatch(result3)!.group(1)!);

// All three calls should return the same time value
expect(time1, equals(time2));
expect(time2, equals(time3));
});

test(
'generateTextMessage error should include include response time if printResponseTime is true',
() {
Expand Down Expand Up @@ -241,6 +276,38 @@ void main() {
expect(result, matches(RegExp(r'Time: \d+ ms')));
});

test(
'error response time should remain consistent across multiple calls to generateTextMessage',
() async {
final dioException = DioException(
requestOptions: RequestOptions(path: '/test', method: 'GET', extra: {
TalkerDioLogger.kDioLogsTimeStampKey:
DateTime.now().millisecondsSinceEpoch - 100, // 100ms ago
}),
message: 'Error message',
);

final settings = TalkerDioLoggerSettings(printResponseTime: true);
final dioErrorLog = DioErrorLog('Error title',
dioException: dioException, settings: settings);

final result1 = dioErrorLog.generateTextMessage();
await Future.delayed(Duration(milliseconds: 50));
final result2 = dioErrorLog.generateTextMessage();
await Future.delayed(Duration(milliseconds: 50));
final result3 = dioErrorLog.generateTextMessage();

// Extract time values from the results
final timeRegex = RegExp(r'Time: (\d+) ms');
final time1 = int.parse(timeRegex.firstMatch(result1)!.group(1)!);
final time2 = int.parse(timeRegex.firstMatch(result2)!.group(1)!);
final time3 = int.parse(timeRegex.firstMatch(result3)!.group(1)!);

// All three calls should return the same time value
expect(time1, equals(time2));
expect(time2, equals(time3));
});

test(
'generateTextMessage should include headers if printResponseHeaders is true',
() {
Expand Down