diff --git a/lib/app_version/app_version.dart b/lib/app_version/app_version.dart index 1eba1052..4a164137 100644 --- a/lib/app_version/app_version.dart +++ b/lib/app_version/app_version.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:package_info_plus/package_info_plus.dart'; import 'package:pub_semver/pub_semver.dart' as semver; @@ -41,13 +42,22 @@ class AppVersion { final data = List.from(json); final tag = data.firstWhere((element) => element['prerelease'] == false); final tagName = tag['tag_name'] as String; - // Strip the leading `v` and anything trailing. - // May need to be updated if we starting using postfixes like `beta`. - _latest = tagName.substring(1, 6); + _latest = parseVersionTag(tagName); } else { log.w('Issue getting latest version info from GitHub, ' 'status code: ${response.statusCode}\n'); } return _latest; } + + /// Returns the version number without the leading `v` or any postfix. + /// + /// Examples: + /// `v1.2.3` becomes `1.2.3`. + /// `v1.2.3-beta` becomes `1.2.3`. + @visibleForTesting + String parseVersionTag(String tag) { + final version = tag.split('v').last.split('-').first; + return version; + } } diff --git a/test/app_version/app_version_test.dart b/test/app_version/app_version_test.dart new file mode 100644 index 00000000..b128acb9 --- /dev/null +++ b/test/app_version/app_version_test.dart @@ -0,0 +1,50 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:nyrna/app_version/app_version.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:test/test.dart'; + +class MockPackageInfo extends Mock implements PackageInfo {} + +final packageInfo = MockPackageInfo(); + +AppVersion appVersion = AppVersion(packageInfo); + +void main() { + setUp(() { + appVersion = AppVersion(packageInfo); + }); + + group('AppVersion:', () { + group('parseVersionTag:', () { + test('parses versions with 1 digit in each place', () { + final version = appVersion.parseVersionTag('v1.2.3'); + expect(version, '1.2.3'); + }); + + test('parses versions with 2 digits in each place', () { + final version = appVersion.parseVersionTag('v12.23.34'); + expect(version, '12.23.34'); + }); + + test('parses versions with 3 digits in each place', () { + final version = appVersion.parseVersionTag('v123.234.345'); + expect(version, '123.234.345'); + }); + + test('parses versions with 1 digit in each place and a postfix', () { + final version = appVersion.parseVersionTag('v1.2.3-beta'); + expect(version, '1.2.3'); + }); + + test('parses versions with 2 digits in each place and a postfix', () { + final version = appVersion.parseVersionTag('v12.23.34-beta'); + expect(version, '12.23.34'); + }); + + test('parses versions with 3 digits in each place and a postfix', () { + final version = appVersion.parseVersionTag('v123.234.345-beta'); + expect(version, '123.234.345'); + }); + }); + }); +}