Skip to content

Commit

Permalink
test: mock http.Client instead of using nock (#295)
Browse files Browse the repository at this point in the history
  • Loading branch information
blaugold authored May 12, 2022
1 parent d6beb1c commit cd23798
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 16 deletions.
8 changes: 8 additions & 0 deletions packages/melos/lib/src/common/http.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:http/http.dart' as http;
import 'package:meta/meta.dart';

@visibleForTesting
http.Client? testClient;

Future<http.Response> get(Uri url, {Map<String, String>? headers}) =>
testClient?.get(url, headers: headers) ?? http.get(url, headers: headers);
2 changes: 1 addition & 1 deletion packages/melos/lib/src/package.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import 'dart:io';
import 'package:cli_util/cli_logging.dart';
import 'package:collection/collection.dart';
import 'package:glob/glob.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart';
import 'package:pool/pool.dart';
import 'package:pub_semver/pub_semver.dart';
Expand All @@ -31,6 +30,7 @@ import 'package:pubspec/pubspec.dart';
import '../version.g.dart';
import 'common/git.dart';
import 'common/glob.dart';
import 'common/http.dart' as http;
import 'common/platform.dart';
import 'common/utils.dart';
import 'common/validation.dart';
Expand Down
2 changes: 1 addition & 1 deletion packages/melos/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ dependencies:
yaml_edit: ^2.0.2

dev_dependencies:
nock: ^1.2.0
mockito: ^5.1.0
test: ^1.17.5

executables:
Expand Down
33 changes: 19 additions & 14 deletions packages/melos/test/package_test.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'dart:io';

import 'package:glob/glob.dart';
import 'package:http/http.dart' as http;
import 'package:melos/src/common/http.dart';
import 'package:melos/src/package.dart';
import 'package:melos/src/workspace.dart';
import 'package:melos/src/workspace_configs.dart';
import 'package:nock/nock.dart';
import 'package:mockito/mockito.dart';
import 'package:platform/platform.dart';
import 'package:test/test.dart';

Expand All @@ -23,11 +25,13 @@ const pubPackageJson = '''

void main() {
group('MelosPackage', () {
setUpAll(nock.init);

final httpClientMock = HttpClientMock();
late MelosWorkspace workspace;

setUpAll(() => testClient = httpClientMock);

setUp(() async {
nock.cleanAll();
reset(httpClientMock);
IOOverrides.global = MockFs();

final config = await MelosWorkspaceConfig.fromDirectory(
Expand All @@ -41,32 +45,33 @@ void main() {
);
});

tearDown(() {
IOOverrides.global = null;
});
tearDown(() => IOOverrides.global = null);

tearDownAll(() => testClient = null);

test('requests published packages from pub.dev by default', () async {
final interceptor = nock('https://pub.dev').get('/packages/melos.json')
..reply(200, pubPackageJson);
final uri = Uri.parse('https://pub.dev/packages/melos.json');
when(httpClientMock.get(uri))
.thenAnswer((_) async => http.Response(pubPackageJson, 200));

final package = workspace.allPackages.values.first;
await package.getPublishedVersions();

expect(interceptor.isDone, isTrue);
verify(httpClientMock.get(uri)).called(1);
});

test(
'requests published packages from PUB_HOSTED_URL if present',
withMockPlatform(
() async {
final interceptor = nock('http://localhost:8080')
.get('/packages/melos.json')
..reply(200, pubPackageJson);
final uri = Uri.parse('http://localhost:8080/packages/melos.json');
when(httpClientMock.get(uri))
.thenAnswer((_) async => http.Response(pubPackageJson, 200));

final package = workspace.allPackages.values.first;
await package.getPublishedVersions();

expect(interceptor.isDone, isTrue);
verify(httpClientMock.get(uri)).called(1);
},
platform: FakePlatform.fromPlatform(const LocalPlatform())
..environment['PUB_HOSTED_URL'] = 'http://localhost:8080',
Expand Down
12 changes: 12 additions & 0 deletions packages/melos/test/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import 'dart:convert';
import 'dart:io';

import 'package:cli_util/cli_logging.dart';
import 'package:http/http.dart' as http;
import 'package:melos/melos.dart';
import 'package:melos/src/common/platform.dart';
import 'package:melos/src/yamlicious/yaml_writer.dart';
import 'package:mockito/mockito.dart';
import 'package:path/path.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:pubspec/pubspec.dart';
Expand Down Expand Up @@ -336,3 +338,13 @@ class _VirtualPackage {

final String? path;
}

class HttpClientMock extends Mock implements http.Client {
@override
Future<http.Response> get(Uri? url, {Map<String, String>? headers}) {
return super.noSuchMethod(
Invocation.method(#get, [url], {#headers: headers}),
returnValue: Future.value(http.Response('', 200)),
) as Future<http.Response>;
}
}

0 comments on commit cd23798

Please sign in to comment.