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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
.dart_tool/
.packages
build/
pubspec.lock
pubspec.lock
.test_coverage.dart
coverage/
38 changes: 19 additions & 19 deletions coverage_badge.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 23 additions & 14 deletions lib/src/pub_updater.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:pub_updater/pub_updater.dart';
class PackageInfoRequestFailure implements Exception {}

/// Exception thrown when the provided package information is not found.
class PackageInfoNotFoundFailue implements Exception {}
class PackageInfoNotFoundFailure implements Exception {}

/// {@template pub_update}
/// A Dart package which enables checking whether a package is up to date.
Expand All @@ -30,33 +30,42 @@ class PubUpdater {
required String packageName,
required String currentVersion,
}) async {
final uri = Uri.parse('$_baseUrl$packageName.json');
final response = await _get(uri);

if (response.statusCode != HttpStatus.ok) throw PackageInfoRequestFailure();
final latestVersion = await getLatestVersion(packageName);

final packageInfo = _getPackageInfo(response.body);
return currentVersion == latestVersion;
}

final versionList = packageInfo.versions..sort();
/// Returns the latest published version of [packageName].
Future<String> getLatestVersion(String packageName) async {
final packageInfo = await _getPackageInfo(packageName);
final versions = packageInfo.versions..sort();

return versionList.last == currentVersion;
return versions.last;
}

/// Updates the package associated with [packageName]
Future<ProcessResult> update({
required String packageName,
ProcessManager processManager = const LocalProcessManager(),
}) {
return processManager
.run(['dart', 'pub', 'global', 'activate', packageName]);
return processManager.run(
['dart', 'pub', 'global', 'activate', packageName],
);
}

Future<PackageInfo> _getPackageInfo(String packageName) async {
final uri = Uri.parse('$_baseUrl$packageName.json');
final response = await _get(uri);

if (response.statusCode != HttpStatus.ok) throw PackageInfoRequestFailure();

return _decodePackageInfo(response.body);
}

PackageInfo _getPackageInfo(String body) {
PackageInfo _decodePackageInfo(String body) {
final packageJson = jsonDecode(body) as Map<String, dynamic>;

if (packageJson.isEmpty) {
throw PackageInfoNotFoundFailue();
}
if (packageJson.isEmpty) throw PackageInfoNotFoundFailure();

return PackageInfo.fromJson(packageJson);
}
Expand Down
62 changes: 61 additions & 1 deletion test/pub_update_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,67 @@ void main() {
packageName: 'very_good_cli',
currentVersion: '3.0.0',
),
throwsA(isA<PackageInfoNotFoundFailue>()),
throwsA(isA<PackageInfoNotFoundFailure>()),
);
});
});

group('getLatestVersion', () {
test('makes correct http request', () async {
when(() => response.body).thenReturn(emptyResponseBody);

try {
await pubUpdater.getLatestVersion('very_good_cli');
} catch (_) {
verify(
() => client.get(
Uri.https(
'pub.dev',
'/packages/very_good_cli.json',
),
),
).called(1);
}
});

test('returns correct version (dev)', () async {
when(() => response.body).thenReturn(devResponseBody);
expect(
await pubUpdater.getLatestVersion('very_good_cli'),
equals('3.0.0-dev.2'),
);
});

test('returns correct version (nullsafety)', () async {
when(() => response.body).thenReturn(nullSafetyReponseBody);
expect(
await pubUpdater.getLatestVersion('very_good_cli'),
equals('3.0.0-nullsafety.1'),
);
});

test('returns correct version (all)', () async {
when(() => response.body).thenReturn(responseBody);
expect(
await pubUpdater.getLatestVersion('very_good_cli'),
equals('3.0.0-nullsafety.1'),
);
});

test('throws PackageInfoRequestFailure on non-200 response', () async {
when(() => response.statusCode).thenReturn(HttpStatus.notFound);
await expectLater(
pubUpdater.getLatestVersion('very_good_cli'),
throwsA(isA<PackageInfoRequestFailure>()),
);
});

test('throws PackageInfoNotFoundFailure when response body is empty',
() async {
when(() => response.body).thenReturn(emptyResponseBody);
await expectLater(
pubUpdater.getLatestVersion('very_good_cli'),
throwsA(isA<PackageInfoNotFoundFailure>()),
);
});
});
Expand Down