From d6a8815255048400c2e7efb046db009787a877e1 Mon Sep 17 00:00:00 2001 From: Bibash Shrestha Date: Wed, 22 May 2024 18:57:55 +0545 Subject: [PATCH] some onboarding tests --- .../view/onboarding_gen_phrase.dart | 2 +- .../cubit/onboarding_state_test.dart | 22 ++ .../onboarding_gen_phrase_cubit_test.dart | 63 ------ .../view/onboarding_gen_phrase_test.dart | 190 ++++++++++++++++++ 4 files changed, 213 insertions(+), 64 deletions(-) create mode 100644 test/onboarding/cubit/onboarding_state_test.dart delete mode 100644 test/onboarding/gen_phrase/cubit/onboarding_gen_phrase_cubit_test.dart create mode 100644 test/onboarding/gen_phrase/view/onboarding_gen_phrase_test.dart diff --git a/lib/onboarding/gen_phrase/view/onboarding_gen_phrase.dart b/lib/onboarding/gen_phrase/view/onboarding_gen_phrase.dart index 6ba772041..91014351a 100644 --- a/lib/onboarding/gen_phrase/view/onboarding_gen_phrase.dart +++ b/lib/onboarding/gen_phrase/view/onboarding_gen_phrase.dart @@ -175,7 +175,7 @@ class _OnBoardingGenPhraseViewState extends State { text: l10n.verifyNow, verticalSpacing: 18, onPressed: () { - Navigator.of(context).push( + Navigator.of(context).push( OnBoardingVerifyPhrasePage.route( mnemonic: mnemonic!, isFromOnboarding: true, diff --git a/test/onboarding/cubit/onboarding_state_test.dart b/test/onboarding/cubit/onboarding_state_test.dart new file mode 100644 index 000000000..7c49892f9 --- /dev/null +++ b/test/onboarding/cubit/onboarding_state_test.dart @@ -0,0 +1,22 @@ +import 'package:altme/app/app.dart'; +import 'package:altme/onboarding/cubit/onboarding_cubit.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('OnboardingState', () { + test('can be instantiated from JSON', () { + final json = {'status': 'init'}; + + final onboardingState = OnboardingState.fromJson(json); + + expect(onboardingState.status, AppStatus.init); + }); + + test('can be converted to JSON', () { + const onboardingState = OnboardingState(status: AppStatus.init); + final json = onboardingState.toJson(); + + expect(json, {'status': 'init'}); + }); + }); +} diff --git a/test/onboarding/gen_phrase/cubit/onboarding_gen_phrase_cubit_test.dart b/test/onboarding/gen_phrase/cubit/onboarding_gen_phrase_cubit_test.dart deleted file mode 100644 index b54c63dae..000000000 --- a/test/onboarding/gen_phrase/cubit/onboarding_gen_phrase_cubit_test.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:key_generator/key_generator.dart'; - -Future main() async { - final keyGenerator = KeyGenerator(); - group('from mnemonic for ssi', () { - const String mnemonic = - '''brief hello carry loop squeeze unknown click abstract lounge figure logic oblige child ripple about vacant scheme magnet open enroll stuff valve hobby what'''; - - test('jwk', () async { - final jwk = await keyGenerator.jwkFromMnemonic( - mnemonic: mnemonic, - accountType: AccountType.ssi, - ); - const expectedJwk = - '''{"kty":"OKP","crv":"Ed25519","d":"xgGv1OK9734J-_INYW3Ff7m0Cpkfhucx2Tg1w3LUOKI=","x":"tZT6dwnPD87v2MCzAlzPsrT6l06_YyyUsk-Y-mnR0sU="}'''; - expect(jwk, equals(expectedJwk)); - }); - - test('address', () async { - final address = await keyGenerator.walletAddressFromMnemonic( - mnemonic: mnemonic, - accountType: AccountType.tezos, - ); - const expectedAddress = 'tz1guoPjyUSs5N6UWoMxESSyPyUTJwqDgS3d'; - expect(address, equals(expectedAddress)); - }); - - test('secret key', () async { - final secretKey = await keyGenerator.secretKeyFromMnemonic( - mnemonic: mnemonic, - accountType: AccountType.ethereum, - ); - const expectedSecretKey = - '''0xc9d610aaf2b4c20b805a1e877637433d63f03c5a0d68d744e9e524efdd7259fd'''; - expect(secretKey, equals(expectedSecretKey)); - }); - }); - group('from secretKey : Tezos', () { - const String secretKey = - '''edskRrmNgPfAAvbZyzTptfvTju9X7ooLR5VVN9u8sXA42hXdMBd8CgrhykP7sZQf8hWLCYuqfEoWUFzL6Us3aKtMD9NsELGkuP'''; - - test('jwk', () async { - final jwk = await keyGenerator.jwkFromSecretKey( - secretKey: secretKey, - accountType: AccountType.tezos, - ); - const expectedJwk = - '''{"kty":"OKP","crv":"Ed25519","d":"cMGD8eAmjDn6MqvJoscsaPoyAMrjG41xbLDfE-uQkYw=","x":"-PeGBkVyMz2-yketwH2lbQqiflneee3jmaTafMCsURE="}'''; - expect(jwk, equals(expectedJwk)); - }); - - test('address', () async { - final address = await keyGenerator.walletAddressFromSecretKey( - secretKey: secretKey, - accountType: AccountType.tezos, - ); - - const expectedAddress = 'tz1NvqicaUW7v6sEbM4UYi3Wes7GHDft4kqY'; - expect(address, equals(expectedAddress)); - }); - }); -} diff --git a/test/onboarding/gen_phrase/view/onboarding_gen_phrase_test.dart b/test/onboarding/gen_phrase/view/onboarding_gen_phrase_test.dart new file mode 100644 index 000000000..169d425eb --- /dev/null +++ b/test/onboarding/gen_phrase/view/onboarding_gen_phrase_test.dart @@ -0,0 +1,190 @@ +import 'package:altme/app/app.dart'; +import 'package:altme/chat_room/chat_room.dart'; +import 'package:altme/dashboard/dashboard.dart'; +import 'package:altme/onboarding/onboarding.dart'; +import 'package:altme/splash/splash.dart'; +import 'package:altme/wallet/wallet.dart'; +import 'package:bloc_test/bloc_test.dart'; +import 'package:did_kit/did_kit.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:key_generator/key_generator.dart'; +import 'package:mockingjay/mockingjay.dart'; +import 'package:secure_storage/secure_storage.dart'; + +import '../../../helpers/helpers.dart'; + +class MockSecureStorage extends Mock implements SecureStorageProvider {} + +class MockDIDKitProvider extends Mock implements DIDKitProvider {} + +class MockKeyGenerator extends Mock implements KeyGenerator {} + +class MockHomeCubit extends MockCubit implements HomeCubit { + @override + Future emitHasWallet() async {} +} + +class MockWalletCubit extends MockCubit implements WalletCubit { + @override + final state = WalletState( + cryptoAccount: CryptoAccount( + data: [ + CryptoAccountData( + name: '', + secretKey: '', + blockchainType: BlockchainType.tezos, + walletAddress: '', + ), + ], + ), + ); + + @override + Future createCryptoWallet({ + String? accountName, + required String mnemonicOrKey, + required bool isImported, + required bool isFromOnboarding, + BlockchainType? blockchainType, + bool showStatus = true, + void Function({ + required CryptoAccount cryptoAccount, + required MessageHandler messageHandler, + })? onComplete, + }) async {} +} + +class MockSplashCubit extends MockCubit implements SplashCubit {} + +class MockAltmeChatSupportCubit extends MockCubit + implements AltmeChatSupportCubit {} + +class MockProfileCubit extends MockCubit implements ProfileCubit { + @override + final state = ProfileState(model: ProfileModel.empty()); +} + +void main() { + late SecureStorageProvider mockSecureStorage; + late DIDKitProvider didKitProvider; + late KeyGenerator keyGenerator; + late HomeCubit homeCubit; + late WalletCubit walletCubit; + late SplashCubit splashCubit; + late AltmeChatSupportCubit altmeChatSupportCubit; + late ProfileCubit profileCubit; + + setUpAll(() { + WidgetsFlutterBinding.ensureInitialized(); + mockSecureStorage = MockSecureStorage(); + didKitProvider = MockDIDKitProvider(); + keyGenerator = MockKeyGenerator(); + homeCubit = MockHomeCubit(); + splashCubit = MockSplashCubit(); + walletCubit = MockWalletCubit(); + altmeChatSupportCubit = MockAltmeChatSupportCubit(); + profileCubit = MockProfileCubit(); + + when(() => mockSecureStorage.set(any(), any())).thenAnswer((_) async {}); + when(() => mockSecureStorage.get(any())).thenAnswer((_) async {}); + }); + + group('OnBoarding GenPhrase Page', () { + late OnBoardingGenPhraseCubit onBoardingGenPhraseCubit; + + late MockNavigator navigator; + + setUpAll(() { + onBoardingGenPhraseCubit = OnBoardingGenPhraseCubit( + secureStorageProvider: mockSecureStorage, + didKitProvider: didKitProvider, + keyGenerator: keyGenerator, + homeCubit: homeCubit, + walletCubit: walletCubit, + splashCubit: splashCubit, + altmeChatSupportCubit: altmeChatSupportCubit, + profileCubit: profileCubit, + ); + navigator = MockNavigator(); + when(navigator.canPop).thenReturn(true); + + when(() => navigator.push(any())).thenAnswer((_) async {}); + }); + + testWidgets('is routable', (tester) async { + await tester.pumpApp( + MockNavigatorProvider( + navigator: navigator, + child: Builder( + builder: (context) => Scaffold( + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.of(context) + .push(OnBoardingVerifyPhrasePage.route( + isFromOnboarding: true, + mnemonic: [], + )); + }, + ), + ), + ), + ), + ); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pumpAndSettle(); + + verify( + () => navigator.push( + any( + that: isRoute( + whereName: equals('/OnBoardingVerifyPhrasePage'), + ), + ), + ), + ).called(1); + }); + + testWidgets('renders UI correctly', (tester) async { + await tester.pumpApp( + BlocProvider.value( + value: onBoardingGenPhraseCubit, + child: const OnBoardingGenPhraseView(), + ), + ); + + expect(find.byType(BasePage), findsOneWidget); + expect(find.byType(MStepper), findsOneWidget); + expect(find.byType(MnemonicDisplay), findsOneWidget); + expect(find.byType(MyElevatedButton), findsOneWidget); + expect(find.byType(MyGradientButton), findsOneWidget); + }); + + testWidgets( + 'navigates to OnBoardingVerifyPhrasePage when Verify Now button' + ' is tapped', (tester) async { + await tester.pumpApp( + MockNavigatorProvider( + navigator: navigator, + child: BlocProvider.value( + value: onBoardingGenPhraseCubit, + child: const OnBoardingGenPhraseView(), + ), + ), + ); + + await tester.tap(find.text('Verify Now'.toUpperCase())); + + verify( + () => navigator.push( + any( + that: isRoute( + whereName: equals('/OnBoardingVerifyPhrasePage'), + ), + ), + ), + ).called(1); + }); + }); +}