From e93b4903c777ec0fcda9afc95aec4acb8ba2b8ef Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Fri, 15 May 2026 14:32:15 +0200 Subject: [PATCH] test(repository): settings_repository (+16 tests) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 24 of the coverage push. The SettingsRepository wraps SharedPreferences and is one of the few storage-adjacent files that can be tested directly via SharedPreferences.setMockInitialValues. - currentWalletId (3): null when not stored; save persists; remove clears - language (3): falls back to 'en' for non-German system locales, returns stored value, setter persists - currency (3): defaults to CHF, returns stored value, setter persists - terms (3): both flags default to false, each setter persists independently - networkMode (4): defaults to mainnet (no value + unknown value), reads under the enum constructor name (NOT the Dart identifier — the .name getter is shadowed by the constructor arg 'Mainnet' / 'Testnet'), setter persists --- .../repository/settings_repository_test.dart | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 test/packages/repository/settings_repository_test.dart diff --git a/test/packages/repository/settings_repository_test.dart b/test/packages/repository/settings_repository_test.dart new file mode 100644 index 00000000..fc5907b6 --- /dev/null +++ b/test/packages/repository/settings_repository_test.dart @@ -0,0 +1,161 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:realunit_wallet/packages/config/network_mode.dart'; +import 'package:realunit_wallet/packages/repository/settings_repository.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + // Initialise the binding so SharedPreferences plugin channels work. + TestWidgetsFlutterBinding.ensureInitialized(); + + group('$SettingsRepository', () { + group('currentWalletId', () { + test('returns null when no value is stored', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.currentWalletId, isNull); + }); + + test('saveCurrentWalletId persists the id', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + await repo.saveCurrentWalletId(42); + + expect(repo.currentWalletId, 42); + }); + + test('removeCurrentWalletId clears the stored id', () async { + SharedPreferences.setMockInitialValues({'currentWalletId': 7}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + expect(repo.currentWalletId, 7); + + await repo.removeCurrentWalletId(); + + expect(repo.currentWalletId, isNull); + }); + }); + + group('language', () { + test('falls back to "en" for non-German system locales', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + // PlatformDispatcher.instance.locale in the test binding defaults to + // en_US; the fallback rule says "anything non-de → en". + expect(repo.language, 'en'); + }); + + test('returns the stored language when set', () async { + SharedPreferences.setMockInitialValues({'language': 'de'}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.language, 'de'); + }); + + test('language setter persists', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.language = 'de'; + + // The setter is fire-and-forget; give the platform channel a tick. + await Future.delayed(Duration.zero); + expect(repo.language, 'de'); + }); + }); + + group('currency', () { + test('defaults to CHF when no value is stored', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.currency, 'CHF'); + }); + + test('returns the stored currency when set', () async { + SharedPreferences.setMockInitialValues({'currency': 'EUR'}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.currency, 'EUR'); + }); + + test('currency setter persists', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.currency = 'EUR'; + await Future.delayed(Duration.zero); + + expect(repo.currency, 'EUR'); + }); + }); + + group('terms', () { + test('defaults to false when not stored', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.termsAccepted, isFalse); + expect(repo.softwareTermsAccepted, isFalse); + }); + + test('termsAccepted setter persists', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.termsAccepted = true; + await Future.delayed(Duration.zero); + + expect(repo.termsAccepted, isTrue); + }); + + test('softwareTermsAccepted setter persists independently', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.softwareTermsAccepted = true; + await Future.delayed(Duration.zero); + + expect(repo.softwareTermsAccepted, isTrue); + expect(repo.termsAccepted, isFalse); + }); + }); + + group('networkMode', () { + test('defaults to mainnet when no value is stored', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.networkMode, NetworkMode.mainnet); + }); + + test('defaults to mainnet when stored value is unknown', () async { + SharedPreferences.setMockInitialValues({'networkMode': 'localnet'}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + // firstWhere falls back to mainnet via orElse. + expect(repo.networkMode, NetworkMode.mainnet); + }); + + test('returns testnet when stored under the enum constructor name', () async { + // The setter writes `mode.name`, which is the constructor arg + // ('Mainnet' / 'Testnet') — NOT the Dart enum identifier. + SharedPreferences.setMockInitialValues({'networkMode': 'Testnet'}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.networkMode, NetworkMode.testnet); + }); + + test('networkMode setter persists by enum name', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.networkMode = NetworkMode.testnet; + await Future.delayed(Duration.zero); + + expect(repo.networkMode, NetworkMode.testnet); + }); + }); + }); +}