diff --git a/finlog_app/fluttery/lib/environment.dart b/finlog_app/fluttery/lib/environment.dart new file mode 100644 index 0000000..1e9e91b --- /dev/null +++ b/finlog_app/fluttery/lib/environment.dart @@ -0,0 +1,27 @@ +import 'package:fluttery/fluttery.dart'; + +/// Abstract Environment contract +abstract class Environment extends Service { + /// Platform checks + bool get isAndroid; + + bool get isIOS; + + /// Build mode + bool get isDebug; + + bool get isRelease; + + bool get isProfile; + + /// App info + Future loadPackageInfo(); + + String get appName; + + String get packageName; + + String get version; + + String get buildNumber; +} diff --git a/finlog_app/fluttery/lib/fluttery.dart b/finlog_app/fluttery/lib/fluttery.dart index e56cef1..02e1dce 100644 --- a/finlog_app/fluttery/lib/fluttery.dart +++ b/finlog_app/fluttery/lib/fluttery.dart @@ -1,11 +1,13 @@ library; +import 'package:fluttery/environment.dart'; import 'package:fluttery/logger.dart'; import 'package:fluttery/preferences.dart'; import 'package:fluttery/secure_storage.dart'; import 'package:fluttery/src/logger/logger_impl.dart'; import 'package:fluttery/src/preferences/preferences_impl.dart'; import 'package:fluttery/src/storage/secure/secure_storage_impl.dart'; +import 'package:fluttery/src/system/environment/environment_impl.dart'; import 'package:fluttery/src/system/worker/worker_impl.dart'; import 'package:fluttery/worker.dart'; import 'package:kiwi/kiwi.dart'; @@ -34,6 +36,7 @@ class App { static void registerDefaultServices() { registerService(() => LoggerImpl()); registerService(() => PreferencesImpl()); + registerService(() => EnvironmentImpl()); registerService(() => SecureStorageImpl()); registerService(() => WorkerImpl()); } diff --git a/finlog_app/fluttery/lib/src/system/environment/environment_impl.dart b/finlog_app/fluttery/lib/src/system/environment/environment_impl.dart new file mode 100644 index 0000000..4395af2 --- /dev/null +++ b/finlog_app/fluttery/lib/src/system/environment/environment_impl.dart @@ -0,0 +1,42 @@ +import 'dart:io' show Platform; +import 'package:flutter/foundation.dart' + show kDebugMode, kReleaseMode, kProfileMode; + +import 'package:fluttery/environment.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class EnvironmentImpl implements Environment { + PackageInfo? _packageInfo; + + @override + bool get isAndroid => Platform.isAndroid; + + @override + bool get isIOS => Platform.isIOS; + + @override + Future loadPackageInfo() async { + _packageInfo = await PackageInfo.fromPlatform(); + } + + @override + String get appName => _packageInfo?.appName ?? 'Unknown'; + + @override + String get packageName => _packageInfo?.packageName ?? 'Unknown'; + + @override + String get version => _packageInfo?.version ?? '0.0.0'; + + @override + String get buildNumber => _packageInfo?.buildNumber ?? '0'; + + @override + bool get isDebug => kDebugMode; + + @override + bool get isRelease => kReleaseMode; + + @override + bool get isProfile => kProfileMode; +} diff --git a/finlog_app/fluttery/pubspec.yaml b/finlog_app/fluttery/pubspec.yaml index 5714837..5799668 100644 --- a/finlog_app/fluttery/pubspec.yaml +++ b/finlog_app/fluttery/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: kiwi: ^5.0.1 logging: ^1.3.0 mocktail: ^1.0.4 + package_info_plus: ^9.0.0 shared_preferences: ^2.5.3 dev_dependencies: diff --git a/finlog_app/fluttery/test/system/environment/environment_test.dart b/finlog_app/fluttery/test/system/environment/environment_test.dart new file mode 100644 index 0000000..142351a --- /dev/null +++ b/finlog_app/fluttery/test/system/environment/environment_test.dart @@ -0,0 +1,54 @@ +import 'dart:io' show Platform; +import 'package:flutter_test/flutter_test.dart'; +import 'package:fluttery/src/system/environment/environment_impl.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +void main() { + setUp(() { + PackageInfo.setMockInitialValues( + appName: 'Test App', + packageName: 'com.example.testapp', + version: '1.2.3', + buildNumber: '42', + buildSignature: 'mock-signature', + installerStore: 'mock-store', + ); + }); + + group('EnvironmentImpl', () { + test('defaults before loadPackageInfo()', () { + final env = EnvironmentImpl(); + + expect(env.appName, equals('Unknown')); + expect(env.packageName, equals('Unknown')); + expect(env.version, equals('0.0.0')); + expect(env.buildNumber, equals('0')); + }); + + test('loadPackageInfo() populates fields from PackageInfo', () async { + final env = EnvironmentImpl(); + await env.loadPackageInfo(); + + expect(env.appName, equals('Test App')); + expect(env.packageName, equals('com.example.testapp')); + expect(env.version, equals('1.2.3')); + expect(env.buildNumber, equals('42')); + }); + + test('platform flags mirror dart:io Platform', () { + final env = EnvironmentImpl(); + + expect(env.isAndroid, equals(Platform.isAndroid)); + expect(env.isIOS, equals(Platform.isIOS)); + }); + + test('build mode flags reflect Flutter constants', () { + final env = EnvironmentImpl(); + + // In unit tests, this should typically be: debug=true, release/profile=false. + expect(env.isDebug, isTrue); + expect(env.isRelease, isFalse); + expect(env.isProfile, isFalse); + }); + }); +}