Skip to content

Commit

Permalink
introduce custom logger
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbuechler committed Aug 25, 2023
1 parent fa09649 commit 25618d8
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 15 deletions.
5 changes: 5 additions & 0 deletions lib/src/adapters/dio_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import 'dart:typed_data';

import 'package:dio/dio.dart';
import 'package:http_mock_adapter/src/exceptions.dart';
import 'package:http_mock_adapter/src/logger/logger.dart';
import 'package:http_mock_adapter/src/matchers/http_matcher.dart';
import 'package:http_mock_adapter/src/mixins/mixins.dart';
import 'package:http_mock_adapter/src/response.dart';
import 'package:logger/logger.dart';

/// [HttpClientAdapter] extension with data mocking and recording functionality.
class DioAdapter with Recording, RequestHandling implements HttpClientAdapter {
Expand All @@ -18,6 +20,8 @@ class DioAdapter with Recording, RequestHandling implements HttpClientAdapter {
final HttpRequestMatcher matcher;

@override
late Logger logger;

final bool printLogs;

@override
Expand All @@ -30,6 +34,7 @@ class DioAdapter with Recording, RequestHandling implements HttpClientAdapter {
this.printLogs = false,
}) {
dio.httpClientAdapter = this;
logger = getLogger(printLogs);
}

/// [DioAdapter]`s [fetch] configuration intended to work with mock data.
Expand Down
5 changes: 5 additions & 0 deletions lib/src/interceptors/dio_interceptor.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:dio/dio.dart';
import 'package:http_mock_adapter/src/logger/logger.dart';
import 'package:http_mock_adapter/src/matchers/http_matcher.dart';
import 'package:http_mock_adapter/src/mixins/mixins.dart';
import 'package:http_mock_adapter/src/response.dart';
import 'package:logger/logger.dart';

/// [DioInterceptor] is a class for mocking [Dio] requests with [Interceptor].
class DioInterceptor extends Interceptor with Recording, RequestHandling {
Expand All @@ -12,6 +14,8 @@ class DioInterceptor extends Interceptor with Recording, RequestHandling {
final HttpRequestMatcher matcher;

@override
late Logger logger;

final bool printLogs;

@override
Expand All @@ -25,6 +29,7 @@ class DioInterceptor extends Interceptor with Recording, RequestHandling {
this.failOnMissingMock = true,
}) {
dio.interceptors.add(this);
logger = getLogger(printLogs);
}

/// Dio [Interceptor]`s [onRequest] configuration intended to catch and return
Expand Down
15 changes: 15 additions & 0 deletions lib/src/logger/logger.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:logger/logger.dart';

getLogger(bool printLogs) {
return Logger(
level: printLogs ? Level.debug : Level.off,
printer: PrettyPrinter(
methodCount: 0,
errorMethodCount: 8,
lineLength: 120,
colors: true,
printEmojis: true,
printTime: false,
),
);
}
19 changes: 8 additions & 11 deletions lib/src/mixins/recording.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import 'package:http_mock_adapter/src/extensions/signature.dart';
import 'package:http_mock_adapter/src/matchers/http_matcher.dart';
import 'package:http_mock_adapter/src/request.dart';
import 'package:http_mock_adapter/src/types.dart';
import 'package:logger/logger.dart';

/// An ability that lets a construct to record a [RequestMatcher] history.
mixin Recording {
bool get printLogs;
Logger get logger;

bool get failOnMissingMock;

Expand Down Expand Up @@ -38,19 +39,15 @@ mixin Recording {
'Could not find mocked route matching request for ${requestOptions.signature}',
);
}
if (printLogs) {
print(
'Not matched request: ${requestOptions.method} ${requestOptions.uri}',
);
}

logger.d(
'Not matched request: ${requestOptions.method} ${requestOptions.uri}');

return Future.value(null);
}

if (printLogs) {
print(
'Matched request: ${requestOptions.method} ${requestOptions.uri}',
);
}
logger.d(
'Matched request: ${requestOptions.method} ${requestOptions.uri}');

return requestMatcher.mockResponse(requestOptions);
};
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ dependencies:
collection: ^1.18.0
dio: ^5.3.2
http_parser: ^4.0.2
logger: ^2.0.1

dev_dependencies:
lints: '>=2.1.1'
Expand Down
47 changes: 43 additions & 4 deletions test/interceptors/dio_interceptor_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart';
import 'package:http_mock_adapter/http_mock_adapter.dart';
import 'package:logger/logger.dart';
import 'package:test/test.dart';

void main() {
Expand All @@ -11,21 +12,19 @@ void main() {
dio = Dio();
});

group('DioInterceptor', () {
group('DioInterceptor -', () {
test('if failOnMissingMock is false do not fail on missing mock', () async {
dioInterceptor1 = DioInterceptor(dio: dio, failOnMissingMock: false);
dioInterceptor2 = DioInterceptor(dio: dio, failOnMissingMock: false);

dio.interceptors.addAll([dioInterceptor1, dioInterceptor2]);

dioInterceptor1.onGet(
'/interceptor-1-route',
(server) => server.reply(
200,
{'message': 'Success from interceptor 1'},
),
);
dioInterceptor1.onGet(
dioInterceptor2.onGet(
'/interceptor-2-route',
(server) => server.reply(
200,
Expand All @@ -38,6 +37,46 @@ void main() {

final int2Response = await dio.get('/interceptor-2-route');
expect(int2Response.data, {'message': 'Success from interceptor 2'});

final googleResponse = await dio.get('https://google.com');
expect(googleResponse.statusCode, 200);
});
test('if printLogs is true we should see logs on mocked calls', () async {
dioInterceptor1 = DioInterceptor(dio: dio, printLogs: true);

dio.interceptors.add(dioInterceptor1);

dioInterceptor1.onGet(
'/interceptor-1-route', (server) => server.reply(200, 'OK'));

final capturedLogs = <OutputEvent>[];
Logger.addOutputListener((event) {
capturedLogs.add(event);
});

await dio.get('/interceptor-1-route');

expect(capturedLogs.first.origin.message,
'Matched request: GET /interceptor-1-route');
expect(capturedLogs.first.origin.level, Level.debug);
});
test('if printLogs is false we should not see logs on mocked calls',
() async {
dioInterceptor1 = DioInterceptor(dio: dio, printLogs: false);

dio.interceptors.add(dioInterceptor1);

dioInterceptor1.onGet(
'/interceptor-1-route', (server) => server.reply(200, 'OK'));

final capturedLogs = <OutputEvent>[];
Logger.addOutputListener((event) {
capturedLogs.add(event);
});

await dio.get('/interceptor-1-route');

expect(capturedLogs.length, 0);
});
});
}

0 comments on commit 25618d8

Please sign in to comment.