Skip to content

Commit

Permalink
feat: add getLatestVersion (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
felangel committed Oct 12, 2021
1 parent d570566 commit b092f77
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 35 deletions.
4 changes: 3 additions & 1 deletion .gitignore
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
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
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
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

0 comments on commit b092f77

Please sign in to comment.