From 20c34a185b8b5ef572d9b0d4a51f61962fa45816 Mon Sep 17 00:00:00 2001 From: Likho <likhojiba@gmail.com> Date: Wed, 19 Oct 2022 12:09:34 +0200 Subject: [PATCH 1/5] Trade Card test --- test/widget_tests/trade_card_test.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 test/widget_tests/trade_card_test.dart diff --git a/test/widget_tests/trade_card_test.dart b/test/widget_tests/trade_card_test.dart new file mode 100644 index 000000000..6c6e3411c --- /dev/null +++ b/test/widget_tests/trade_card_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; + +void main() {} From 1c2cd822925364e47f580e180c7ee8a84d9db610 Mon Sep 17 00:00:00 2001 From: Likho <likhojiba@gmail.com> Date: Wed, 19 Oct 2022 15:18:05 +0200 Subject: [PATCH 2/5] WIP: Desktop widget tests and update other tests --- .../custom_loading_overlay_test.dart | 9 ++-- .../desktop/custom_text_button_test.dart | 33 ++++++++++++ .../desktop/desktop_app_bar_test.dart | 34 ++++++++++++ .../desktop_dialog_close_button_test.dart | 40 ++++++++++++++ .../desktop/desktop_dialog_test.dart | 30 +++++++++++ test/widget_tests/managed_favorite_test.dart | 1 + test/widget_tests/node_card_test.dart | 6 +-- .../widget_tests/node_options_sheet_test.dart | 7 ++- test/widget_tests/trade_card_test.dart | 53 +++++++++++++++++-- 9 files changed, 198 insertions(+), 15 deletions(-) create mode 100644 test/widget_tests/desktop/custom_text_button_test.dart create mode 100644 test/widget_tests/desktop/desktop_app_bar_test.dart create mode 100644 test/widget_tests/desktop/desktop_dialog_close_button_test.dart create mode 100644 test/widget_tests/desktop/desktop_dialog_test.dart diff --git a/test/widget_tests/custom_loading_overlay_test.dart b/test/widget_tests/custom_loading_overlay_test.dart index 2e1ac4846..48939c9b4 100644 --- a/test/widget_tests/custom_loading_overlay_test.dart +++ b/test/widget_tests/custom_loading_overlay_test.dart @@ -1,3 +1,4 @@ +import 'package:event_bus/event_bus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:stackwallet/utilities/theme/light_colors.dart'; @@ -6,8 +7,7 @@ import 'package:stackwallet/widgets/custom_loading_overlay.dart'; void main() { testWidgets("Test wiget displays correct text", (widgetTester) async { - const customLoadingOverlay = - CustomLoadingOverlay(message: "Updating exchange rate", eventBus: null); + final eventBus = EventBus(); await widgetTester.pumpWidget( MaterialApp( theme: ThemeData( @@ -15,8 +15,9 @@ void main() { StackColors.fromStackColorTheme(LightColors()), ], ), - home: const Material( - child: customLoadingOverlay, + home: Material( + child: CustomLoadingOverlay( + message: "Updating exchange rate", eventBus: eventBus), ), ), ); diff --git a/test/widget_tests/desktop/custom_text_button_test.dart b/test/widget_tests/desktop/custom_text_button_test.dart new file mode 100644 index 000000000..08cf19098 --- /dev/null +++ b/test/widget_tests/desktop/custom_text_button_test.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/widgets/desktop/custom_text_button.dart'; + +void main() { + testWidgets("Test text button ", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: CustomTextButtonBase( + key: key, + width: 200, + height: 300, + textButton: + const TextButton(onPressed: null, child: Text("Some Text")), + ), + ), + ), + ); + + expect(find.byType(CustomTextButtonBase), findsOneWidget); + }); +} diff --git a/test/widget_tests/desktop/desktop_app_bar_test.dart b/test/widget_tests/desktop/desktop_app_bar_test.dart new file mode 100644 index 000000000..2452f1860 --- /dev/null +++ b/test/widget_tests/desktop/desktop_app_bar_test.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; +import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; + +void main() { + testWidgets("Test DesktopAppBar widget", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: DesktopAppBar( + key: key, + isCompactHeight: false, + leading: const AppBarBackButton(), + trailing: const ExitToMyStackButton(), + center: const Text("Some Text"), + ), + ), + ), + ); + + expect(find.byType(DesktopAppBar), findsOneWidget); + }); +} diff --git a/test/widget_tests/desktop/desktop_dialog_close_button_test.dart b/test/widget_tests/desktop/desktop_dialog_close_button_test.dart new file mode 100644 index 000000000..4c9a8113f --- /dev/null +++ b/test/widget_tests/desktop/desktop_dialog_close_button_test.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockingjay/mockingjay.dart' as mockingjay; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart'; + +void main() { + testWidgets("test DesktopDialog button pressed", (widgetTester) async { + final key = UniqueKey(); + + final navigator = mockingjay.MockNavigator(); + + await widgetTester.pumpWidget( + ProviderScope( + overrides: [], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: mockingjay.MockNavigatorProvider( + navigator: navigator, + child: DesktopDialogCloseButton( + key: key, + onPressedOverride: null, + )), + ), + ), + ); + + await widgetTester.tap(find.byType(AppBarIconButton)); + await widgetTester.pumpAndSettle(); + + mockingjay.verify(() => navigator.pop()).called(1); + }); +} diff --git a/test/widget_tests/desktop/desktop_dialog_test.dart b/test/widget_tests/desktop/desktop_dialog_test.dart new file mode 100644 index 000000000..48e82bf89 --- /dev/null +++ b/test/widget_tests/desktop/desktop_dialog_test.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart'; + +void main() { + testWidgets("test DesktopDialog builds", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: DesktopDialog( + key: key, + child: const DesktopDialogCloseButton(), + ), + ), + ), + ); + + expect(find.byType(DesktopDialog), findsOneWidget); + }); +} diff --git a/test/widget_tests/managed_favorite_test.dart b/test/widget_tests/managed_favorite_test.dart index 4caaad89d..93d61ba32 100644 --- a/test/widget_tests/managed_favorite_test.dart +++ b/test/widget_tests/managed_favorite_test.dart @@ -18,6 +18,7 @@ import 'package:stackwallet/widgets/managed_favorite.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/theme/light_colors.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/utilities/util.dart'; import 'managed_favorite_test.mocks.dart'; diff --git a/test/widget_tests/node_card_test.dart b/test/widget_tests/node_card_test.dart index 47209db58..2728fc304 100644 --- a/test/widget_tests/node_card_test.dart +++ b/test/widget_tests/node_card_test.dart @@ -82,7 +82,7 @@ void main() { (realInvocation) => NodeModel( host: "127.0.0.1", port: 2000, - name: "Stack Default", + name: "Some other node name", id: "node id", useSSL: true, enabled: true, @@ -94,7 +94,7 @@ void main() { NodeModel( host: "127.0.0.1", port: 2000, - name: "Stack Default", + name: "Some other node name", id: "node id", useSSL: true, enabled: true, @@ -122,7 +122,7 @@ void main() { ); await tester.pumpAndSettle(); - expect(find.text("Stack Default"), findsOneWidget); + expect(find.text("Some other node name"), findsOneWidget); expect(find.text("Connected"), findsOneWidget); expect(find.byType(Text), findsNWidgets(2)); expect(find.byType(SvgPicture), findsWidgets); diff --git a/test/widget_tests/node_options_sheet_test.dart b/test/widget_tests/node_options_sheet_test.dart index 78800fb8a..2a4782c07 100644 --- a/test/widget_tests/node_options_sheet_test.dart +++ b/test/widget_tests/node_options_sheet_test.dart @@ -29,7 +29,7 @@ void main() { (realInvocation) => NodeModel( host: "127.0.0.1", port: 2000, - name: "Stack Default", + name: "Some other name", id: "node id", useSSL: true, enabled: true, @@ -41,7 +41,7 @@ void main() { (realInvocation) => NodeModel( host: "127.0.0.1", port: 2000, - name: "Stack Default", + name: "Some other name", id: "node id", useSSL: true, enabled: true, @@ -72,7 +72,7 @@ void main() { await tester.pumpAndSettle(); expect(find.text("Node options"), findsOneWidget); - expect(find.text("Stack Default"), findsOneWidget); + expect(find.text("Some other name"), findsOneWidget); expect(find.text("Connected"), findsOneWidget); expect(find.byType(SvgPicture), findsNWidgets(2)); expect(find.text("Details"), findsOneWidget); @@ -204,7 +204,6 @@ void main() { await tester.pumpAndSettle(); expect(find.text("Node options"), findsOneWidget); - // expect(find.text("Stack Default"), findsOneWidget); expect(find.text("Disconnected"), findsOneWidget); await tester.tap(find.text("Connect")); diff --git a/test/widget_tests/trade_card_test.dart b/test/widget_tests/trade_card_test.dart index 6c6e3411c..b21881781 100644 --- a/test/widget_tests/trade_card_test.dart +++ b/test/widget_tests/trade_card_test.dart @@ -1,10 +1,55 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; +import 'package:stackwallet/models/exchange/response_objects/trade.dart'; import 'package:stackwallet/utilities/theme/light_colors.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/trade_card.dart'; -void main() {} +void main() { + testWidgets("Test Trade card builds", (widgetTester) async { + final trade = Trade( + uuid: "uuid", + tradeId: "trade id", + rateType: "Estimate rate", + direction: "", + timestamp: DateTime.parse("1662544771"), + updatedAt: DateTime.parse("1662544771"), + payInCurrency: "BTC", + payInAmount: "10", + payInAddress: "btc address", + payInNetwork: "", + payInExtraId: "", + payInTxid: "", + payOutCurrency: "xmr", + payOutAmount: "10", + payOutAddress: "xmr address", + payOutNetwork: "", + payOutExtraId: "", + payOutTxid: "", + refundAddress: "refund address", + refundExtraId: "", + status: "Failed", + exchangeName: "Some Exchange"); + + await widgetTester.pumpWidget( + ProviderScope( + overrides: [], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: TradeCard(trade: trade, onTap: () {}), + ), + ), + ); + + expect(find.byType(TradeCard), findsOneWidget); + expect(find.text("BTC → XMR"), findsOneWidget); + expect(find.text("Some Exchange"), findsOneWidget); + }); +} From bb40d4b16593c94d9f5cc46fb147fd02c87bf70a Mon Sep 17 00:00:00 2001 From: Likho <likhojiba@gmail.com> Date: Thu, 20 Oct 2022 12:49:45 +0200 Subject: [PATCH 3/5] WIP: Widget tests --- test/widget_tests/address_book_card_test.dart | 231 +++--------------- .../desktop/desktop_scaffold_test.dart | 70 ++++++ test/widget_tests/shake/shake_test.dart | 4 + 3 files changed, 109 insertions(+), 196 deletions(-) create mode 100644 test/widget_tests/desktop/desktop_scaffold_test.dart create mode 100644 test/widget_tests/shake/shake_test.dart diff --git a/test/widget_tests/address_book_card_test.dart b/test/widget_tests/address_book_card_test.dart index 664fe05f3..ef031eb4e 100644 --- a/test/widget_tests/address_book_card_test.dart +++ b/test/widget_tests/address_book_card_test.dart @@ -21,207 +21,46 @@ class MockedFunctions extends Mock { @GenerateMocks([AddressBookService]) void main() { - group('Navigation tests', () { - late AddressBookService service; - setUp(() { - service = MockAddressBookService(); + testWidgets('test returns Contact Address Entry', (widgetTester) async { + final service = MockAddressBookService(); - when(service.getContactById("some id")) - .thenAnswer((realInvocation) => Contact( - name: "John Doe", - addresses: [ - const ContactAddressEntry( - coin: Coin.bitcoincash, - address: "some bch address", - label: "Bills") - ], - isFavorite: true)); - }); + when(service.getContactById("default")) + .thenAnswer((realInvocation) => Contact( + name: "John Doe", + addresses: [ + const ContactAddressEntry( + coin: Coin.bitcoincash, + address: "some bch address", + label: "Bills") + ], + isFavorite: true)); - testWidgets('test returns Contact Address Entry', (widgetTester) async { - await widgetTester.pumpWidget( - ProviderScope( - overrides: [ - addressBookServiceProvider.overrideWithValue( - service, - ), - ], - child: MaterialApp( - theme: ThemeData( - extensions: [ - StackColors.fromStackColorTheme( - LightColors(), - ), - ], - ), - home: const AddressBookCard( - contactId: "some id", - ), + await widgetTester.pumpWidget( + ProviderScope( + overrides: [ + addressBookServiceProvider.overrideWithValue( + service, + ), + ], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: const AddressBookCard( + contactId: "default", ), ), - ); + ), + ); - expect(find.text("John Doe"), findsOneWidget); - expect(find.text(Coin.bitcoincash.ticker), findsOneWidget); - }); + expect(find.text("John Doe"), findsOneWidget); + expect(find.text("BCH"), findsOneWidget); + expect(find.text(Coin.bitcoincash.ticker), findsOneWidget); - // testWidgets("Test button press opens dialog", (widgetTester) async { - // // final service = MockAddressBookService(); - // - // when(service.getContactById("some id")) - // .thenAnswer((realInvocation) => Contact( - // name: "John Doe", - // addresses: [ - // const ContactAddressEntry( - // coin: Coin.bitcoincash, - // address: "some bch address", - // label: "Bills") - // ], - // isFavorite: true)); - // - // await widgetTester.pumpWidget( - // ProviderScope( - // overrides: [ - // addressBookServiceProvider.overrideWithValue( - // service, - // ), - // ], - // child: MaterialApp( - // theme: ThemeData( - // extensions: [ - // StackColors.fromStackColorTheme( - // LightColors(), - // ), - // ], - // ), - // home: const AddressBookCard( - // contactId: "some id", - // ), - // ), - // ), - // ); - // // - // // when(service.getContactById("03177ce0-4af4-11ed-9617-af8aa7a3796f")) - // // .thenAnswer((realInvocation) => Contact( - // // name: "John Doe", - // // addresses: [ - // // const ContactAddressEntry( - // // coin: Coin.bitcoincash, - // // address: "some bch address", - // // label: "Bills") - // // ], - // // isFavorite: true)); - // await widgetTester.tap(find.byType(RawMaterialButton)); - // // verify(MockedFunctions().showDialog()).called(1); - // await widgetTester.pump(); - // when(service.getContactById("03177ce0-4af4-11ed-9617-af8aa7a3796f")) - // .thenAnswer((realInvocation) => Contact( - // name: "John Doe", - // addresses: [ - // const ContactAddressEntry( - // coin: Coin.bitcoincash, - // address: "some bch address", - // label: "Bills") - // ], - // isFavorite: true)); - // - // expect( - // find.byWidget(const ContactPopUp( - // contactId: "03177ce0-4af4-11ed-9617-af8aa7a3796f")), - // findsOneWidget); - // // await widgetTester.pump(); - // // // when(contact) - // // await widgetTester.pump(); - // }); + await widgetTester.tap(find.byType(RawMaterialButton)); }); - - // testWidgets('test returns Contact Address Entry', (widgetTester) async { - // // final service = MockAddressBookService(); - // // when(service.getContactById("some id")) - // // .thenAnswer((realInvocation) => Contact( - // // name: "John Doe", - // // addresses: [ - // // const ContactAddressEntry( - // // coin: Coin.bitcoincash, - // // address: "some bch address", - // // label: "Bills") - // // ], - // // isFavorite: true)); - // - // await widgetTester.pumpWidget( - // ProviderScope( - // overrides: [ - // addressBookServiceProvider.overrideWithValue( - // serv, - // ), - // ], - // child: MaterialApp( - // theme: ThemeData( - // extensions: [ - // StackColors.fromStackColorTheme( - // LightColors(), - // ), - // ], - // ), - // home: const AddressBookCard( - // contactId: "some id", - // ), - // ), - // ), - // ); - // - // expect(find.text("John Doe"), findsOneWidget); - // expect(find.text(Coin.bitcoincash.ticker), findsOneWidget); - // }); - - // testWidgets("Test button press opens dialog", (widgetTester) async { - // final service = MockAddressBookService(); - // - // // when(service.getContactById("some id")) - // // .thenAnswer((realInvocation) => Contact( - // // name: "John Doe", - // // addresses: [ - // // const ContactAddressEntry( - // // coin: Coin.bitcoincash, - // // address: "some bch address", - // // label: "Bills") - // // ], - // // isFavorite: true)); - // - // await widgetTester.pumpWidget( - // ProviderScope( - // overrides: [ - // addressBookServiceProvider.overrideWithValue( - // service, - // ), - // ], - // child: MaterialApp( - // theme: ThemeData( - // extensions: [ - // StackColors.fromStackColorTheme( - // LightColors(), - // ), - // ], - // ), - // home: const AddressBookCard( - // contactId: "03177ce0-4af4-11ed-9617-af8aa7a3796f", - // ), - // ), - // ), - // ); - // // - // // when(service.getContactById("03177ce0-4af4-11ed-9617-af8aa7a3796f")) - // // .thenAnswer((realInvocation) => Contact( - // // name: "John Doe", - // // addresses: [ - // // const ContactAddressEntry( - // // coin: Coin.bitcoincash, - // // address: "some bch address", - // // label: "Bills") - // // ], - // // isFavorite: true)); - // // await widgetTester.tap(find.byType(RawMaterialButton)); - // // // when(contact) - // // await widgetTester.pump(); - // }); } diff --git a/test/widget_tests/desktop/desktop_scaffold_test.dart b/test/widget_tests/desktop/desktop_scaffold_test.dart new file mode 100644 index 000000000..b7eba2c6d --- /dev/null +++ b/test/widget_tests/desktop/desktop_scaffold_test.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; + +void main() { + testWidgets("test DesktopScaffold", (widgetTester) async { + final key = UniqueKey(); + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: DesktopScaffold( + key: key, + body: const SizedBox(), + ), + ), + ), + ); + }); + + testWidgets("Test MasterScaffold for non desktop", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: MasterScaffold( + key: key, + body: const SizedBox(), + appBar: AppBar(), + isDesktop: false, + ), + ), + ), + ); + }); + + testWidgets("Test MasterScaffold for desktop", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: MasterScaffold( + key: key, + body: const SizedBox(), + appBar: AppBar(), + isDesktop: true, + ), + ), + ), + ); + }); +} diff --git a/test/widget_tests/shake/shake_test.dart b/test/widget_tests/shake/shake_test.dart new file mode 100644 index 000000000..cc82bf1ed --- /dev/null +++ b/test/widget_tests/shake/shake_test.dart @@ -0,0 +1,4 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; From 7e5b149079cd0a7c9b5bfa5c147b75c741322a4f Mon Sep 17 00:00:00 2001 From: Likho <likhojiba@gmail.com> Date: Thu, 20 Oct 2022 16:38:42 +0200 Subject: [PATCH 4/5] Widget testing add more tests --- test/pages/send_view/send_view_test.dart | 157 + .../pages/send_view/send_view_test.mocks.dart | 2626 +++++++++++++++++ .../custom_buttons/favorite_toggle_test.dart | 35 + test/widget_tests/managed_favorite_test.dart | 10 +- test/widget_tests/shake/shake_test.dart | 31 + 5 files changed, 2856 insertions(+), 3 deletions(-) create mode 100644 test/pages/send_view/send_view_test.dart create mode 100644 test/pages/send_view/send_view_test.mocks.dart create mode 100644 test/widget_tests/custom_buttons/favorite_toggle_test.dart diff --git a/test/pages/send_view/send_view_test.dart b/test/pages/send_view/send_view_test.dart new file mode 100644 index 000000000..73e5b8623 --- /dev/null +++ b/test/pages/send_view/send_view_test.dart @@ -0,0 +1,157 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:stackwallet/models/send_view_auto_fill_data.dart'; +import 'package:stackwallet/pages/send_view/send_view.dart'; +import 'package:stackwallet/providers/providers.dart'; +import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart'; +import 'package:stackwallet/services/coins/coin_service.dart'; +import 'package:stackwallet/services/coins/manager.dart'; +import 'package:stackwallet/services/locale_service.dart'; +import 'package:stackwallet/services/node_service.dart'; +import 'package:stackwallet/services/wallets.dart'; +import 'package:stackwallet/services/wallets_service.dart'; +import 'package:stackwallet/utilities/enums/coin_enum.dart'; +import 'package:stackwallet/utilities/prefs.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'send_view_test.mocks.dart'; + +@GenerateMocks([ + Wallets, + WalletsService, + NodeService, + BitcoinWallet, + LocaleService, + Prefs, +], customMocks: [ + MockSpec<Manager>(returnNullOnMissingStub: true), + MockSpec<CoinServiceAPI>(returnNullOnMissingStub: true), +]) +void main() { + testWidgets("Send to valid address", (widgetTester) async { + final mockWallets = MockWallets(); + final mockWalletsService = MockWalletsService(); + final mockNodeService = MockNodeService(); + final CoinServiceAPI wallet = MockBitcoinWallet(); + final mockLocaleService = MockLocaleService(); + final mockPrefs = MockPrefs(); + + when(wallet.coin).thenAnswer((_) => Coin.bitcoin); + when(wallet.walletName).thenAnswer((_) => "some wallet"); + when(wallet.walletId).thenAnswer((_) => "wallet id"); + + final manager = Manager(wallet); + when(mockWallets.getManagerProvider("wallet id")).thenAnswer( + (realInvocation) => ChangeNotifierProvider((ref) => manager)); + when(mockWallets.getManager("wallet id")) + .thenAnswer((realInvocation) => manager); + + when(mockLocaleService.locale).thenAnswer((_) => "en_US"); + when(mockPrefs.currency).thenAnswer((_) => "USD"); + when(wallet.validateAddress("send to address")) + .thenAnswer((realInvocation) => true); + + await widgetTester.pumpWidget( + ProviderScope( + overrides: [ + walletsChangeNotifierProvider.overrideWithValue(mockWallets), + walletsServiceChangeNotifierProvider + .overrideWithValue(mockWalletsService), + nodeServiceChangeNotifierProvider.overrideWithValue(mockNodeService), + localeServiceChangeNotifierProvider + .overrideWithValue(mockLocaleService), + prefsChangeNotifierProvider.overrideWithValue(mockPrefs), + // previewTxButtonStateProvider + ], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: SendView( + walletId: "wallet id", + coin: Coin.bitcoin, + autoFillData: SendViewAutoFillData( + address: "send to address", contactLabel: "contact label"), + ), + ), + ), + ); + + expect(find.text("Send to"), findsOneWidget); + expect(find.text("Amount"), findsOneWidget); + expect(find.text("Note (optional)"), findsOneWidget); + expect(find.text("Transaction fee (estimated)"), findsOneWidget); + verify(manager.validateAddress("send to address")).called(1); + }); + + testWidgets("Send to invalid address", (widgetTester) async { + final mockWallets = MockWallets(); + final mockWalletsService = MockWalletsService(); + final mockNodeService = MockNodeService(); + final CoinServiceAPI wallet = MockBitcoinWallet(); + final mockLocaleService = MockLocaleService(); + final mockPrefs = MockPrefs(); + + when(wallet.coin).thenAnswer((_) => Coin.bitcoin); + when(wallet.walletName).thenAnswer((_) => "some wallet"); + when(wallet.walletId).thenAnswer((_) => "wallet id"); + + final manager = Manager(wallet); + when(mockWallets.getManagerProvider("wallet id")).thenAnswer( + (realInvocation) => ChangeNotifierProvider((ref) => manager)); + when(mockWallets.getManager("wallet id")) + .thenAnswer((realInvocation) => manager); + + when(mockLocaleService.locale).thenAnswer((_) => "en_US"); + when(mockPrefs.currency).thenAnswer((_) => "USD"); + when(wallet.validateAddress("send to address")) + .thenAnswer((realInvocation) => false); + + // when(manager.isOwnAddress("send to address")) + // .thenAnswer((realInvocation) => Future(() => true)); + + await widgetTester.pumpWidget( + ProviderScope( + overrides: [ + walletsChangeNotifierProvider.overrideWithValue(mockWallets), + walletsServiceChangeNotifierProvider + .overrideWithValue(mockWalletsService), + nodeServiceChangeNotifierProvider.overrideWithValue(mockNodeService), + localeServiceChangeNotifierProvider + .overrideWithValue(mockLocaleService), + prefsChangeNotifierProvider.overrideWithValue(mockPrefs), + // previewTxButtonStateProvider + ], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: SendView( + walletId: "wallet id", + coin: Coin.bitcoin, + autoFillData: SendViewAutoFillData( + address: "send to address", contactLabel: "contact label"), + ), + ), + ), + ); + + expect(find.text("Send to"), findsOneWidget); + expect(find.text("Amount"), findsOneWidget); + expect(find.text("Note (optional)"), findsOneWidget); + expect(find.text("Transaction fee (estimated)"), findsOneWidget); + expect(find.text("Invalid address"), findsOneWidget); + verify(manager.validateAddress("send to address")).called(1); + }); +} diff --git a/test/pages/send_view/send_view_test.mocks.dart b/test/pages/send_view/send_view_test.mocks.dart new file mode 100644 index 000000000..a07377309 --- /dev/null +++ b/test/pages/send_view/send_view_test.mocks.dart @@ -0,0 +1,2626 @@ +// Mocks generated by Mockito 5.3.2 from annotations +// in stackwallet/test/pages/send_view_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i16; +import 'dart:ui' as _i18; + +import 'package:decimal/decimal.dart' as _i10; +import 'package:flutter/foundation.dart' as _i4; +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i5; +import 'package:mockito/mockito.dart' as _i1; +import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i12; +import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i11; +import 'package:stackwallet/models/models.dart' as _i9; +import 'package:stackwallet/models/node_model.dart' as _i19; +import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet.dart' + as _i23; +import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i20; +import 'package:stackwallet/services/coins/coin_service.dart' as _i13; +import 'package:stackwallet/services/coins/manager.dart' as _i6; +import 'package:stackwallet/services/locale_service.dart' as _i21; +import 'package:stackwallet/services/node_service.dart' as _i3; +import 'package:stackwallet/services/transaction_notification_tracker.dart' + as _i8; +import 'package:stackwallet/services/wallets.dart' as _i14; +import 'package:stackwallet/services/wallets_service.dart' as _i2; +import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i24; +import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i15; +import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i22; +import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' + as _i7; +import 'package:stackwallet/utilities/prefs.dart' as _i17; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeWalletsService_0 extends _i1.SmartFake + implements _i2.WalletsService { + _FakeWalletsService_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeNodeService_1 extends _i1.SmartFake implements _i3.NodeService { + _FakeNodeService_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeChangeNotifierProvider_2<Notifier extends _i4.ChangeNotifier?> + extends _i1.SmartFake implements _i5.ChangeNotifierProvider<Notifier> { + _FakeChangeNotifierProvider_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeManager_3 extends _i1.SmartFake implements _i6.Manager { + _FakeManager_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFlutterSecureStorageInterface_4 extends _i1.SmartFake + implements _i7.FlutterSecureStorageInterface { + _FakeFlutterSecureStorageInterface_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTransactionNotificationTracker_5 extends _i1.SmartFake + implements _i8.TransactionNotificationTracker { + _FakeTransactionNotificationTracker_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeUtxoData_6 extends _i1.SmartFake implements _i9.UtxoData { + _FakeUtxoData_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDecimal_7 extends _i1.SmartFake implements _i10.Decimal { + _FakeDecimal_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFeeObject_8 extends _i1.SmartFake implements _i9.FeeObject { + _FakeFeeObject_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTransactionData_9 extends _i1.SmartFake + implements _i9.TransactionData { + _FakeTransactionData_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumX_10 extends _i1.SmartFake implements _i11.ElectrumX { + _FakeElectrumX_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCachedElectrumX_11 extends _i1.SmartFake + implements _i12.CachedElectrumX { + _FakeCachedElectrumX_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXNode_12 extends _i1.SmartFake + implements _i11.ElectrumXNode { + _FakeElectrumXNode_12( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCoinServiceAPI_13 extends _i1.SmartFake + implements _i13.CoinServiceAPI { + _FakeCoinServiceAPI_13( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [Wallets]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWallets extends _i1.Mock implements _i14.Wallets { + MockWallets() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.WalletsService get walletsService => (super.noSuchMethod( + Invocation.getter(#walletsService), + returnValue: _FakeWalletsService_0( + this, + Invocation.getter(#walletsService), + ), + ) as _i2.WalletsService); + @override + set walletsService(_i2.WalletsService? _walletsService) => super.noSuchMethod( + Invocation.setter( + #walletsService, + _walletsService, + ), + returnValueForMissingStub: null, + ); + @override + _i3.NodeService get nodeService => (super.noSuchMethod( + Invocation.getter(#nodeService), + returnValue: _FakeNodeService_1( + this, + Invocation.getter(#nodeService), + ), + ) as _i3.NodeService); + @override + set nodeService(_i3.NodeService? _nodeService) => super.noSuchMethod( + Invocation.setter( + #nodeService, + _nodeService, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasWallets => (super.noSuchMethod( + Invocation.getter(#hasWallets), + returnValue: false, + ) as bool); + @override + List<_i5.ChangeNotifierProvider<_i6.Manager>> get managerProviders => + (super.noSuchMethod( + Invocation.getter(#managerProviders), + returnValue: <_i5.ChangeNotifierProvider<_i6.Manager>>[], + ) as List<_i5.ChangeNotifierProvider<_i6.Manager>>); + @override + List<_i6.Manager> get managers => (super.noSuchMethod( + Invocation.getter(#managers), + returnValue: <_i6.Manager>[], + ) as List<_i6.Manager>); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + List<String> getWalletIdsFor({required _i15.Coin? coin}) => + (super.noSuchMethod( + Invocation.method( + #getWalletIdsFor, + [], + {#coin: coin}, + ), + returnValue: <String>[], + ) as List<String>); + @override + Map<_i15.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>> + getManagerProvidersByCoin() => (super.noSuchMethod( + Invocation.method( + #getManagerProvidersByCoin, + [], + ), + returnValue: <_i15.Coin, + List<_i5.ChangeNotifierProvider<_i6.Manager>>>{}, + ) as Map<_i15.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>); + @override + _i5.ChangeNotifierProvider<_i6.Manager> getManagerProvider( + String? walletId) => + (super.noSuchMethod( + Invocation.method( + #getManagerProvider, + [walletId], + ), + returnValue: _FakeChangeNotifierProvider_2<_i6.Manager>( + this, + Invocation.method( + #getManagerProvider, + [walletId], + ), + ), + ) as _i5.ChangeNotifierProvider<_i6.Manager>); + @override + _i6.Manager getManager(String? walletId) => (super.noSuchMethod( + Invocation.method( + #getManager, + [walletId], + ), + returnValue: _FakeManager_3( + this, + Invocation.method( + #getManager, + [walletId], + ), + ), + ) as _i6.Manager); + @override + void addWallet({ + required String? walletId, + required _i6.Manager? manager, + }) => + super.noSuchMethod( + Invocation.method( + #addWallet, + [], + { + #walletId: walletId, + #manager: manager, + }, + ), + returnValueForMissingStub: null, + ); + @override + void removeWallet({required String? walletId}) => super.noSuchMethod( + Invocation.method( + #removeWallet, + [], + {#walletId: walletId}, + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<void> load(_i17.Prefs? prefs) => (super.noSuchMethod( + Invocation.method( + #load, + [prefs], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> loadAfterStackRestore( + _i17.Prefs? prefs, + List<_i6.Manager>? managers, + ) => + (super.noSuchMethod( + Invocation.method( + #loadAfterStackRestore, + [ + prefs, + managers, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [WalletsService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockWalletsService extends _i1.Mock implements _i2.WalletsService { + MockWalletsService() { + _i1.throwOnMissingStub(this); + } + + @override + _i16.Future<Map<String, _i2.WalletInfo>> get walletNames => + (super.noSuchMethod( + Invocation.getter(#walletNames), + returnValue: _i16.Future<Map<String, _i2.WalletInfo>>.value( + <String, _i2.WalletInfo>{}), + ) as _i16.Future<Map<String, _i2.WalletInfo>>); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i16.Future<bool> renameWallet({ + required String? from, + required String? to, + required bool? shouldNotifyListeners, + }) => + (super.noSuchMethod( + Invocation.method( + #renameWallet, + [], + { + #from: from, + #to: to, + #shouldNotifyListeners: shouldNotifyListeners, + }, + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<void> addExistingStackWallet({ + required String? name, + required String? walletId, + required _i15.Coin? coin, + required bool? shouldNotifyListeners, + }) => + (super.noSuchMethod( + Invocation.method( + #addExistingStackWallet, + [], + { + #name: name, + #walletId: walletId, + #coin: coin, + #shouldNotifyListeners: shouldNotifyListeners, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<String?> addNewWallet({ + required String? name, + required _i15.Coin? coin, + required bool? shouldNotifyListeners, + }) => + (super.noSuchMethod( + Invocation.method( + #addNewWallet, + [], + { + #name: name, + #coin: coin, + #shouldNotifyListeners: shouldNotifyListeners, + }, + ), + returnValue: _i16.Future<String?>.value(), + ) as _i16.Future<String?>); + @override + _i16.Future<List<String>> getFavoriteWalletIds() => (super.noSuchMethod( + Invocation.method( + #getFavoriteWalletIds, + [], + ), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + _i16.Future<void> saveFavoriteWalletIds(List<String>? walletIds) => + (super.noSuchMethod( + Invocation.method( + #saveFavoriteWalletIds, + [walletIds], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> addFavorite(String? walletId) => (super.noSuchMethod( + Invocation.method( + #addFavorite, + [walletId], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> removeFavorite(String? walletId) => (super.noSuchMethod( + Invocation.method( + #removeFavorite, + [walletId], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> moveFavorite({ + required int? fromIndex, + required int? toIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #moveFavorite, + [], + { + #fromIndex: fromIndex, + #toIndex: toIndex, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<bool> checkForDuplicate(String? name) => (super.noSuchMethod( + Invocation.method( + #checkForDuplicate, + [name], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<String?> getWalletId(String? walletName) => (super.noSuchMethod( + Invocation.method( + #getWalletId, + [walletName], + ), + returnValue: _i16.Future<String?>.value(), + ) as _i16.Future<String?>); + @override + _i16.Future<bool> isMnemonicVerified({required String? walletId}) => + (super.noSuchMethod( + Invocation.method( + #isMnemonicVerified, + [], + {#walletId: walletId}, + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<void> setMnemonicVerified({required String? walletId}) => + (super.noSuchMethod( + Invocation.method( + #setMnemonicVerified, + [], + {#walletId: walletId}, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<int> deleteWallet( + String? name, + bool? shouldNotifyListeners, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteWallet, + [ + name, + shouldNotifyListeners, + ], + ), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<void> refreshWallets(bool? shouldNotifyListeners) => + (super.noSuchMethod( + Invocation.method( + #refreshWallets, + [shouldNotifyListeners], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [NodeService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockNodeService extends _i1.Mock implements _i3.NodeService { + MockNodeService() { + _i1.throwOnMissingStub(this); + } + + @override + _i7.FlutterSecureStorageInterface get secureStorageInterface => + (super.noSuchMethod( + Invocation.getter(#secureStorageInterface), + returnValue: _FakeFlutterSecureStorageInterface_4( + this, + Invocation.getter(#secureStorageInterface), + ), + ) as _i7.FlutterSecureStorageInterface); + @override + List<_i19.NodeModel> get primaryNodes => (super.noSuchMethod( + Invocation.getter(#primaryNodes), + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); + @override + List<_i19.NodeModel> get nodes => (super.noSuchMethod( + Invocation.getter(#nodes), + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i16.Future<void> updateDefaults() => (super.noSuchMethod( + Invocation.method( + #updateDefaults, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> setPrimaryNodeFor({ + required _i15.Coin? coin, + required _i19.NodeModel? node, + bool? shouldNotifyListeners = false, + }) => + (super.noSuchMethod( + Invocation.method( + #setPrimaryNodeFor, + [], + { + #coin: coin, + #node: node, + #shouldNotifyListeners: shouldNotifyListeners, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i19.NodeModel? getPrimaryNodeFor({required _i15.Coin? coin}) => + (super.noSuchMethod(Invocation.method( + #getPrimaryNodeFor, + [], + {#coin: coin}, + )) as _i19.NodeModel?); + @override + List<_i19.NodeModel> getNodesFor(_i15.Coin? coin) => (super.noSuchMethod( + Invocation.method( + #getNodesFor, + [coin], + ), + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); + @override + _i19.NodeModel? getNodeById({required String? id}) => + (super.noSuchMethod(Invocation.method( + #getNodeById, + [], + {#id: id}, + )) as _i19.NodeModel?); + @override + List<_i19.NodeModel> failoverNodesFor({required _i15.Coin? coin}) => + (super.noSuchMethod( + Invocation.method( + #failoverNodesFor, + [], + {#coin: coin}, + ), + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); + @override + _i16.Future<void> add( + _i19.NodeModel? node, + String? password, + bool? shouldNotifyListeners, + ) => + (super.noSuchMethod( + Invocation.method( + #add, + [ + node, + password, + shouldNotifyListeners, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> delete( + String? id, + bool? shouldNotifyListeners, + ) => + (super.noSuchMethod( + Invocation.method( + #delete, + [ + id, + shouldNotifyListeners, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> setEnabledState( + String? id, + bool? enabled, + bool? shouldNotifyListeners, + ) => + (super.noSuchMethod( + Invocation.method( + #setEnabledState, + [ + id, + enabled, + shouldNotifyListeners, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> edit( + _i19.NodeModel? editedNode, + String? password, + bool? shouldNotifyListeners, + ) => + (super.noSuchMethod( + Invocation.method( + #edit, + [ + editedNode, + password, + shouldNotifyListeners, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> updateCommunityNodes() => (super.noSuchMethod( + Invocation.method( + #updateCommunityNodes, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [BitcoinWallet]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockBitcoinWallet extends _i1.Mock implements _i20.BitcoinWallet { + MockBitcoinWallet() { + _i1.throwOnMissingStub(this); + } + + @override + set timer(_i16.Timer? _timer) => super.noSuchMethod( + Invocation.setter( + #timer, + _timer, + ), + returnValueForMissingStub: null, + ); + @override + _i8.TransactionNotificationTracker get txTracker => (super.noSuchMethod( + Invocation.getter(#txTracker), + returnValue: _FakeTransactionNotificationTracker_5( + this, + Invocation.getter(#txTracker), + ), + ) as _i8.TransactionNotificationTracker); + @override + set txTracker(_i8.TransactionNotificationTracker? _txTracker) => + super.noSuchMethod( + Invocation.setter( + #txTracker, + _txTracker, + ), + returnValueForMissingStub: null, + ); + @override + List<_i9.UtxoObject> get outputsList => (super.noSuchMethod( + Invocation.getter(#outputsList), + returnValue: <_i9.UtxoObject>[], + ) as List<_i9.UtxoObject>); + @override + set outputsList(List<_i9.UtxoObject>? _outputsList) => super.noSuchMethod( + Invocation.setter( + #outputsList, + _outputsList, + ), + returnValueForMissingStub: null, + ); + @override + bool get longMutex => (super.noSuchMethod( + Invocation.getter(#longMutex), + returnValue: false, + ) as bool); + @override + set longMutex(bool? _longMutex) => super.noSuchMethod( + Invocation.setter( + #longMutex, + _longMutex, + ), + returnValueForMissingStub: null, + ); + @override + bool get refreshMutex => (super.noSuchMethod( + Invocation.getter(#refreshMutex), + returnValue: false, + ) as bool); + @override + set refreshMutex(bool? _refreshMutex) => super.noSuchMethod( + Invocation.setter( + #refreshMutex, + _refreshMutex, + ), + returnValueForMissingStub: null, + ); + @override + bool get isActive => (super.noSuchMethod( + Invocation.getter(#isActive), + returnValue: false, + ) as bool); + @override + set isActive(bool? _isActive) => super.noSuchMethod( + Invocation.setter( + #isActive, + _isActive, + ), + returnValueForMissingStub: null, + ); + @override + set isFavorite(bool? markFavorite) => super.noSuchMethod( + Invocation.setter( + #isFavorite, + markFavorite, + ), + returnValueForMissingStub: null, + ); + @override + bool get isFavorite => (super.noSuchMethod( + Invocation.getter(#isFavorite), + returnValue: false, + ) as bool); + @override + _i15.Coin get coin => (super.noSuchMethod( + Invocation.getter(#coin), + returnValue: _i15.Coin.bitcoin, + ) as _i15.Coin); + @override + _i16.Future<List<String>> get allOwnAddresses => (super.noSuchMethod( + Invocation.getter(#allOwnAddresses), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + _i16.Future<_i9.UtxoData> get utxoData => (super.noSuchMethod( + Invocation.getter(#utxoData), + returnValue: _i16.Future<_i9.UtxoData>.value(_FakeUtxoData_6( + this, + Invocation.getter(#utxoData), + )), + ) as _i16.Future<_i9.UtxoData>); + @override + _i16.Future<List<_i9.UtxoObject>> get unspentOutputs => (super.noSuchMethod( + Invocation.getter(#unspentOutputs), + returnValue: + _i16.Future<List<_i9.UtxoObject>>.value(<_i9.UtxoObject>[]), + ) as _i16.Future<List<_i9.UtxoObject>>); + @override + _i16.Future<_i10.Decimal> get availableBalance => (super.noSuchMethod( + Invocation.getter(#availableBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#availableBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get pendingBalance => (super.noSuchMethod( + Invocation.getter(#pendingBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#pendingBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get balanceMinusMaxFee => (super.noSuchMethod( + Invocation.getter(#balanceMinusMaxFee), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#balanceMinusMaxFee), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get totalBalance => (super.noSuchMethod( + Invocation.getter(#totalBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#totalBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<String> get currentReceivingAddress => (super.noSuchMethod( + Invocation.getter(#currentReceivingAddress), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<String> get currentLegacyReceivingAddress => (super.noSuchMethod( + Invocation.getter(#currentLegacyReceivingAddress), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<String> get currentReceivingAddressP2SH => (super.noSuchMethod( + Invocation.getter(#currentReceivingAddressP2SH), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + bool get hasCalledExit => (super.noSuchMethod( + Invocation.getter(#hasCalledExit), + returnValue: false, + ) as bool); + @override + _i16.Future<_i9.FeeObject> get fees => (super.noSuchMethod( + Invocation.getter(#fees), + returnValue: _i16.Future<_i9.FeeObject>.value(_FakeFeeObject_8( + this, + Invocation.getter(#fees), + )), + ) as _i16.Future<_i9.FeeObject>); + @override + _i16.Future<int> get maxFee => (super.noSuchMethod( + Invocation.getter(#maxFee), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<List<String>> get mnemonic => (super.noSuchMethod( + Invocation.getter(#mnemonic), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + _i16.Future<int> get chainHeight => (super.noSuchMethod( + Invocation.getter(#chainHeight), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + int get storedChainHeight => (super.noSuchMethod( + Invocation.getter(#storedChainHeight), + returnValue: 0, + ) as int); + @override + bool get shouldAutoSync => (super.noSuchMethod( + Invocation.getter(#shouldAutoSync), + returnValue: false, + ) as bool); + @override + set shouldAutoSync(bool? shouldAutoSync) => super.noSuchMethod( + Invocation.setter( + #shouldAutoSync, + shouldAutoSync, + ), + returnValueForMissingStub: null, + ); + @override + bool get isRefreshing => (super.noSuchMethod( + Invocation.getter(#isRefreshing), + returnValue: false, + ) as bool); + @override + bool get isConnected => (super.noSuchMethod( + Invocation.getter(#isConnected), + returnValue: false, + ) as bool); + @override + _i16.Future<_i9.TransactionData> get transactionData => (super.noSuchMethod( + Invocation.getter(#transactionData), + returnValue: + _i16.Future<_i9.TransactionData>.value(_FakeTransactionData_9( + this, + Invocation.getter(#transactionData), + )), + ) as _i16.Future<_i9.TransactionData>); + @override + String get walletId => (super.noSuchMethod( + Invocation.getter(#walletId), + returnValue: '', + ) as String); + @override + String get walletName => (super.noSuchMethod( + Invocation.getter(#walletName), + returnValue: '', + ) as String); + @override + set walletName(String? newName) => super.noSuchMethod( + Invocation.setter( + #walletName, + newName, + ), + returnValueForMissingStub: null, + ); + @override + _i11.ElectrumX get electrumXClient => (super.noSuchMethod( + Invocation.getter(#electrumXClient), + returnValue: _FakeElectrumX_10( + this, + Invocation.getter(#electrumXClient), + ), + ) as _i11.ElectrumX); + @override + _i12.CachedElectrumX get cachedElectrumXClient => (super.noSuchMethod( + Invocation.getter(#cachedElectrumXClient), + returnValue: _FakeCachedElectrumX_11( + this, + Invocation.getter(#cachedElectrumXClient), + ), + ) as _i12.CachedElectrumX); + @override + set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) => + super.noSuchMethod( + Invocation.setter( + #onIsActiveWalletChanged, + _onIsActiveWalletChanged, + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<void> exit() => (super.noSuchMethod( + Invocation.method( + #exit, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> updateStoredChainHeight({required int? newHeight}) => + (super.noSuchMethod( + Invocation.method( + #updateStoredChainHeight, + [], + {#newHeight: newHeight}, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i20.DerivePathType addressType({required String? address}) => + (super.noSuchMethod( + Invocation.method( + #addressType, + [], + {#address: address}, + ), + returnValue: _i20.DerivePathType.bip44, + ) as _i20.DerivePathType); + @override + _i16.Future<void> recoverFromMnemonic({ + required String? mnemonic, + required int? maxUnusedAddressGap, + required int? maxNumberOfIndexesToCheck, + required int? height, + }) => + (super.noSuchMethod( + Invocation.method( + #recoverFromMnemonic, + [], + { + #mnemonic: mnemonic, + #maxUnusedAddressGap: maxUnusedAddressGap, + #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck, + #height: height, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> getTransactionCacheEarly(List<String>? allAddresses) => + (super.noSuchMethod( + Invocation.method( + #getTransactionCacheEarly, + [allAddresses], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<bool> refreshIfThereIsNewData() => (super.noSuchMethod( + Invocation.method( + #refreshIfThereIsNewData, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<void> getAllTxsToWatch(_i9.TransactionData? txData) => + (super.noSuchMethod( + Invocation.method( + #getAllTxsToWatch, + [txData], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> refresh() => (super.noSuchMethod( + Invocation.method( + #refresh, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<Map<String, dynamic>> prepareSend({ + required String? address, + required int? satoshiAmount, + Map<String, dynamic>? args, + }) => + (super.noSuchMethod( + Invocation.method( + #prepareSend, + [], + { + #address: address, + #satoshiAmount: satoshiAmount, + #args: args, + }, + ), + returnValue: + _i16.Future<Map<String, dynamic>>.value(<String, dynamic>{}), + ) as _i16.Future<Map<String, dynamic>>); + @override + _i16.Future<String> confirmSend({required Map<String, dynamic>? txData}) => + (super.noSuchMethod( + Invocation.method( + #confirmSend, + [], + {#txData: txData}, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<String> send({ + required String? toAddress, + required int? amount, + Map<String, String>? args = const {}, + }) => + (super.noSuchMethod( + Invocation.method( + #send, + [], + { + #toAddress: toAddress, + #amount: amount, + #args: args, + }, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<bool> testNetworkConnection() => (super.noSuchMethod( + Invocation.method( + #testNetworkConnection, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + void startNetworkAlivePinging() => super.noSuchMethod( + Invocation.method( + #startNetworkAlivePinging, + [], + ), + returnValueForMissingStub: null, + ); + @override + void stopNetworkAlivePinging() => super.noSuchMethod( + Invocation.method( + #stopNetworkAlivePinging, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<void> initializeNew() => (super.noSuchMethod( + Invocation.method( + #initializeNew, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> initializeExisting() => (super.noSuchMethod( + Invocation.method( + #initializeExisting, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + bool validateAddress(String? address) => (super.noSuchMethod( + Invocation.method( + #validateAddress, + [address], + ), + returnValue: false, + ) as bool); + @override + _i16.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod( + Invocation.method( + #updateNode, + [shouldRefresh], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<_i11.ElectrumXNode> getCurrentNode() => (super.noSuchMethod( + Invocation.method( + #getCurrentNode, + [], + ), + returnValue: + _i16.Future<_i11.ElectrumXNode>.value(_FakeElectrumXNode_12( + this, + Invocation.method( + #getCurrentNode, + [], + ), + )), + ) as _i16.Future<_i11.ElectrumXNode>); + @override + _i16.Future<void> addDerivation({ + required int? chain, + required String? address, + required String? pubKey, + required String? wif, + required _i20.DerivePathType? derivePathType, + }) => + (super.noSuchMethod( + Invocation.method( + #addDerivation, + [], + { + #chain: chain, + #address: address, + #pubKey: pubKey, + #wif: wif, + #derivePathType: derivePathType, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> addDerivations({ + required int? chain, + required _i20.DerivePathType? derivePathType, + required Map<String, dynamic>? derivationsToAdd, + }) => + (super.noSuchMethod( + Invocation.method( + #addDerivations, + [], + { + #chain: chain, + #derivePathType: derivePathType, + #derivationsToAdd: derivationsToAdd, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<int> getTxCount({required String? address}) => + (super.noSuchMethod( + Invocation.method( + #getTxCount, + [], + {#address: address}, + ), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<void> checkCurrentReceivingAddressesForTransactions() => + (super.noSuchMethod( + Invocation.method( + #checkCurrentReceivingAddressesForTransactions, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> checkCurrentChangeAddressesForTransactions() => + (super.noSuchMethod( + Invocation.method( + #checkCurrentChangeAddressesForTransactions, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<List<Map<String, dynamic>>> fastFetch( + List<String>? allTxHashes) => + (super.noSuchMethod( + Invocation.method( + #fastFetch, + [allTxHashes], + ), + returnValue: _i16.Future<List<Map<String, dynamic>>>.value( + <Map<String, dynamic>>[]), + ) as _i16.Future<List<Map<String, dynamic>>>); + @override + int estimateTxFee({ + required int? vSize, + required int? feeRatePerKB, + }) => + (super.noSuchMethod( + Invocation.method( + #estimateTxFee, + [], + { + #vSize: vSize, + #feeRatePerKB: feeRatePerKB, + }, + ), + returnValue: 0, + ) as int); + @override + dynamic coinSelection( + int? satoshiAmountToSend, + int? selectedTxFeeRate, + String? _recipientAddress, + bool? isSendAll, { + int? additionalOutputs = 0, + List<_i9.UtxoObject>? utxos, + }) => + super.noSuchMethod(Invocation.method( + #coinSelection, + [ + satoshiAmountToSend, + selectedTxFeeRate, + _recipientAddress, + isSendAll, + ], + { + #additionalOutputs: additionalOutputs, + #utxos: utxos, + }, + )); + @override + _i16.Future<Map<String, dynamic>> fetchBuildTxData( + List<_i9.UtxoObject>? utxosToUse) => + (super.noSuchMethod( + Invocation.method( + #fetchBuildTxData, + [utxosToUse], + ), + returnValue: + _i16.Future<Map<String, dynamic>>.value(<String, dynamic>{}), + ) as _i16.Future<Map<String, dynamic>>); + @override + _i16.Future<Map<String, dynamic>> buildTransaction({ + required List<_i9.UtxoObject>? utxosToUse, + required Map<String, dynamic>? utxoSigningData, + required List<String>? recipients, + required List<int>? satoshiAmounts, + }) => + (super.noSuchMethod( + Invocation.method( + #buildTransaction, + [], + { + #utxosToUse: utxosToUse, + #utxoSigningData: utxoSigningData, + #recipients: recipients, + #satoshiAmounts: satoshiAmounts, + }, + ), + returnValue: + _i16.Future<Map<String, dynamic>>.value(<String, dynamic>{}), + ) as _i16.Future<Map<String, dynamic>>); + @override + _i16.Future<void> fullRescan( + int? maxUnusedAddressGap, + int? maxNumberOfIndexesToCheck, + ) => + (super.noSuchMethod( + Invocation.method( + #fullRescan, + [ + maxUnusedAddressGap, + maxNumberOfIndexesToCheck, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<int> estimateFeeFor( + int? satoshiAmount, + int? feeRate, + ) => + (super.noSuchMethod( + Invocation.method( + #estimateFeeFor, + [ + satoshiAmount, + feeRate, + ], + ), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + int roughFeeEstimate( + int? inputCount, + int? outputCount, + int? feeRatePerKB, + ) => + (super.noSuchMethod( + Invocation.method( + #roughFeeEstimate, + [ + inputCount, + outputCount, + feeRatePerKB, + ], + ), + returnValue: 0, + ) as int); + @override + int sweepAllEstimate(int? feeRate) => (super.noSuchMethod( + Invocation.method( + #sweepAllEstimate, + [feeRate], + ), + returnValue: 0, + ) as int); + @override + _i16.Future<bool> generateNewAddress() => (super.noSuchMethod( + Invocation.method( + #generateNewAddress, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); +} + +/// A class which mocks [LocaleService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocaleService extends _i1.Mock implements _i21.LocaleService { + MockLocaleService() { + _i1.throwOnMissingStub(this); + } + + @override + String get locale => (super.noSuchMethod( + Invocation.getter(#locale), + returnValue: '', + ) as String); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i16.Future<void> loadLocale({bool? notify = true}) => (super.noSuchMethod( + Invocation.method( + #loadLocale, + [], + {#notify: notify}, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Prefs]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPrefs extends _i1.Mock implements _i17.Prefs { + MockPrefs() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isInitialized => (super.noSuchMethod( + Invocation.getter(#isInitialized), + returnValue: false, + ) as bool); + @override + int get lastUnlockedTimeout => (super.noSuchMethod( + Invocation.getter(#lastUnlockedTimeout), + returnValue: 0, + ) as int); + @override + set lastUnlockedTimeout(int? lastUnlockedTimeout) => super.noSuchMethod( + Invocation.setter( + #lastUnlockedTimeout, + lastUnlockedTimeout, + ), + returnValueForMissingStub: null, + ); + @override + int get lastUnlocked => (super.noSuchMethod( + Invocation.getter(#lastUnlocked), + returnValue: 0, + ) as int); + @override + set lastUnlocked(int? lastUnlocked) => super.noSuchMethod( + Invocation.setter( + #lastUnlocked, + lastUnlocked, + ), + returnValueForMissingStub: null, + ); + @override + int get currentNotificationId => (super.noSuchMethod( + Invocation.getter(#currentNotificationId), + returnValue: 0, + ) as int); + @override + List<String> get walletIdsSyncOnStartup => (super.noSuchMethod( + Invocation.getter(#walletIdsSyncOnStartup), + returnValue: <String>[], + ) as List<String>); + @override + set walletIdsSyncOnStartup(List<String>? walletIdsSyncOnStartup) => + super.noSuchMethod( + Invocation.setter( + #walletIdsSyncOnStartup, + walletIdsSyncOnStartup, + ), + returnValueForMissingStub: null, + ); + @override + _i22.SyncingType get syncType => (super.noSuchMethod( + Invocation.getter(#syncType), + returnValue: _i22.SyncingType.currentWalletOnly, + ) as _i22.SyncingType); + @override + set syncType(_i22.SyncingType? syncType) => super.noSuchMethod( + Invocation.setter( + #syncType, + syncType, + ), + returnValueForMissingStub: null, + ); + @override + bool get wifiOnly => (super.noSuchMethod( + Invocation.getter(#wifiOnly), + returnValue: false, + ) as bool); + @override + set wifiOnly(bool? wifiOnly) => super.noSuchMethod( + Invocation.setter( + #wifiOnly, + wifiOnly, + ), + returnValueForMissingStub: null, + ); + @override + bool get showFavoriteWallets => (super.noSuchMethod( + Invocation.getter(#showFavoriteWallets), + returnValue: false, + ) as bool); + @override + set showFavoriteWallets(bool? showFavoriteWallets) => super.noSuchMethod( + Invocation.setter( + #showFavoriteWallets, + showFavoriteWallets, + ), + returnValueForMissingStub: null, + ); + @override + String get language => (super.noSuchMethod( + Invocation.getter(#language), + returnValue: '', + ) as String); + @override + set language(String? newLanguage) => super.noSuchMethod( + Invocation.setter( + #language, + newLanguage, + ), + returnValueForMissingStub: null, + ); + @override + String get currency => (super.noSuchMethod( + Invocation.getter(#currency), + returnValue: '', + ) as String); + @override + set currency(String? newCurrency) => super.noSuchMethod( + Invocation.setter( + #currency, + newCurrency, + ), + returnValueForMissingStub: null, + ); + @override + _i23.ExchangeRateType get exchangeRateType => (super.noSuchMethod( + Invocation.getter(#exchangeRateType), + returnValue: _i23.ExchangeRateType.estimated, + ) as _i23.ExchangeRateType); + @override + set exchangeRateType(_i23.ExchangeRateType? exchangeRateType) => + super.noSuchMethod( + Invocation.setter( + #exchangeRateType, + exchangeRateType, + ), + returnValueForMissingStub: null, + ); + @override + bool get useBiometrics => (super.noSuchMethod( + Invocation.getter(#useBiometrics), + returnValue: false, + ) as bool); + @override + set useBiometrics(bool? useBiometrics) => super.noSuchMethod( + Invocation.setter( + #useBiometrics, + useBiometrics, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasPin => (super.noSuchMethod( + Invocation.getter(#hasPin), + returnValue: false, + ) as bool); + @override + set hasPin(bool? hasPin) => super.noSuchMethod( + Invocation.setter( + #hasPin, + hasPin, + ), + returnValueForMissingStub: null, + ); + @override + bool get showTestNetCoins => (super.noSuchMethod( + Invocation.getter(#showTestNetCoins), + returnValue: false, + ) as bool); + @override + set showTestNetCoins(bool? showTestNetCoins) => super.noSuchMethod( + Invocation.setter( + #showTestNetCoins, + showTestNetCoins, + ), + returnValueForMissingStub: null, + ); + @override + bool get isAutoBackupEnabled => (super.noSuchMethod( + Invocation.getter(#isAutoBackupEnabled), + returnValue: false, + ) as bool); + @override + set isAutoBackupEnabled(bool? isAutoBackupEnabled) => super.noSuchMethod( + Invocation.setter( + #isAutoBackupEnabled, + isAutoBackupEnabled, + ), + returnValueForMissingStub: null, + ); + @override + set autoBackupLocation(String? autoBackupLocation) => super.noSuchMethod( + Invocation.setter( + #autoBackupLocation, + autoBackupLocation, + ), + returnValueForMissingStub: null, + ); + @override + _i24.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod( + Invocation.getter(#backupFrequencyType), + returnValue: _i24.BackupFrequencyType.everyTenMinutes, + ) as _i24.BackupFrequencyType); + @override + set backupFrequencyType(_i24.BackupFrequencyType? backupFrequencyType) => + super.noSuchMethod( + Invocation.setter( + #backupFrequencyType, + backupFrequencyType, + ), + returnValueForMissingStub: null, + ); + @override + set lastAutoBackup(DateTime? lastAutoBackup) => super.noSuchMethod( + Invocation.setter( + #lastAutoBackup, + lastAutoBackup, + ), + returnValueForMissingStub: null, + ); + @override + bool get hideBlockExplorerWarning => (super.noSuchMethod( + Invocation.getter(#hideBlockExplorerWarning), + returnValue: false, + ) as bool); + @override + set hideBlockExplorerWarning(bool? hideBlockExplorerWarning) => + super.noSuchMethod( + Invocation.setter( + #hideBlockExplorerWarning, + hideBlockExplorerWarning, + ), + returnValueForMissingStub: null, + ); + @override + bool get gotoWalletOnStartup => (super.noSuchMethod( + Invocation.getter(#gotoWalletOnStartup), + returnValue: false, + ) as bool); + @override + set gotoWalletOnStartup(bool? gotoWalletOnStartup) => super.noSuchMethod( + Invocation.setter( + #gotoWalletOnStartup, + gotoWalletOnStartup, + ), + returnValueForMissingStub: null, + ); + @override + set startupWalletId(String? startupWalletId) => super.noSuchMethod( + Invocation.setter( + #startupWalletId, + startupWalletId, + ), + returnValueForMissingStub: null, + ); + @override + bool get externalCalls => (super.noSuchMethod( + Invocation.getter(#externalCalls), + returnValue: false, + ) as bool); + @override + set externalCalls(bool? externalCalls) => super.noSuchMethod( + Invocation.setter( + #externalCalls, + externalCalls, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i16.Future<void> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod( + Invocation.method( + #incrementCurrentNotificationIndex, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Manager]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockManager extends _i1.Mock implements _i6.Manager { + @override + bool get isActiveWallet => (super.noSuchMethod( + Invocation.getter(#isActiveWallet), + returnValue: false, + ) as bool); + @override + set isActiveWallet(bool? isActive) => super.noSuchMethod( + Invocation.setter( + #isActiveWallet, + isActive, + ), + returnValueForMissingStub: null, + ); + @override + _i13.CoinServiceAPI get wallet => (super.noSuchMethod( + Invocation.getter(#wallet), + returnValue: _FakeCoinServiceAPI_13( + this, + Invocation.getter(#wallet), + ), + ) as _i13.CoinServiceAPI); + @override + bool get hasBackgroundRefreshListener => (super.noSuchMethod( + Invocation.getter(#hasBackgroundRefreshListener), + returnValue: false, + ) as bool); + @override + _i15.Coin get coin => (super.noSuchMethod( + Invocation.getter(#coin), + returnValue: _i15.Coin.bitcoin, + ) as _i15.Coin); + @override + bool get isRefreshing => (super.noSuchMethod( + Invocation.getter(#isRefreshing), + returnValue: false, + ) as bool); + @override + bool get shouldAutoSync => (super.noSuchMethod( + Invocation.getter(#shouldAutoSync), + returnValue: false, + ) as bool); + @override + set shouldAutoSync(bool? shouldAutoSync) => super.noSuchMethod( + Invocation.setter( + #shouldAutoSync, + shouldAutoSync, + ), + returnValueForMissingStub: null, + ); + @override + bool get isFavorite => (super.noSuchMethod( + Invocation.getter(#isFavorite), + returnValue: false, + ) as bool); + @override + set isFavorite(bool? markFavorite) => super.noSuchMethod( + Invocation.setter( + #isFavorite, + markFavorite, + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<_i9.FeeObject> get fees => (super.noSuchMethod( + Invocation.getter(#fees), + returnValue: _i16.Future<_i9.FeeObject>.value(_FakeFeeObject_8( + this, + Invocation.getter(#fees), + )), + ) as _i16.Future<_i9.FeeObject>); + @override + _i16.Future<int> get maxFee => (super.noSuchMethod( + Invocation.getter(#maxFee), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<String> get currentReceivingAddress => (super.noSuchMethod( + Invocation.getter(#currentReceivingAddress), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<_i10.Decimal> get availableBalance => (super.noSuchMethod( + Invocation.getter(#availableBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#availableBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i10.Decimal get cachedAvailableBalance => (super.noSuchMethod( + Invocation.getter(#cachedAvailableBalance), + returnValue: _FakeDecimal_7( + this, + Invocation.getter(#cachedAvailableBalance), + ), + ) as _i10.Decimal); + @override + _i16.Future<_i10.Decimal> get pendingBalance => (super.noSuchMethod( + Invocation.getter(#pendingBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#pendingBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get balanceMinusMaxFee => (super.noSuchMethod( + Invocation.getter(#balanceMinusMaxFee), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#balanceMinusMaxFee), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get totalBalance => (super.noSuchMethod( + Invocation.getter(#totalBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#totalBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i10.Decimal get cachedTotalBalance => (super.noSuchMethod( + Invocation.getter(#cachedTotalBalance), + returnValue: _FakeDecimal_7( + this, + Invocation.getter(#cachedTotalBalance), + ), + ) as _i10.Decimal); + @override + _i16.Future<List<String>> get allOwnAddresses => (super.noSuchMethod( + Invocation.getter(#allOwnAddresses), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + _i16.Future<_i9.TransactionData> get transactionData => (super.noSuchMethod( + Invocation.getter(#transactionData), + returnValue: + _i16.Future<_i9.TransactionData>.value(_FakeTransactionData_9( + this, + Invocation.getter(#transactionData), + )), + ) as _i16.Future<_i9.TransactionData>); + @override + _i16.Future<List<_i9.UtxoObject>> get unspentOutputs => (super.noSuchMethod( + Invocation.getter(#unspentOutputs), + returnValue: + _i16.Future<List<_i9.UtxoObject>>.value(<_i9.UtxoObject>[]), + ) as _i16.Future<List<_i9.UtxoObject>>); + @override + set walletName(String? newName) => super.noSuchMethod( + Invocation.setter( + #walletName, + newName, + ), + returnValueForMissingStub: null, + ); + @override + String get walletName => (super.noSuchMethod( + Invocation.getter(#walletName), + returnValue: '', + ) as String); + @override + String get walletId => (super.noSuchMethod( + Invocation.getter(#walletId), + returnValue: '', + ) as String); + @override + _i16.Future<List<String>> get mnemonic => (super.noSuchMethod( + Invocation.getter(#mnemonic), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + bool get isConnected => (super.noSuchMethod( + Invocation.getter(#isConnected), + returnValue: false, + ) as bool); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i16.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod( + Invocation.method( + #updateNode, + [shouldRefresh], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<Map<String, dynamic>> prepareSend({ + required String? address, + required int? satoshiAmount, + Map<String, dynamic>? args, + }) => + (super.noSuchMethod( + Invocation.method( + #prepareSend, + [], + { + #address: address, + #satoshiAmount: satoshiAmount, + #args: args, + }, + ), + returnValue: + _i16.Future<Map<String, dynamic>>.value(<String, dynamic>{}), + ) as _i16.Future<Map<String, dynamic>>); + @override + _i16.Future<String> confirmSend({required Map<String, dynamic>? txData}) => + (super.noSuchMethod( + Invocation.method( + #confirmSend, + [], + {#txData: txData}, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<String> send({ + required String? toAddress, + required int? amount, + Map<String, String>? args = const {}, + }) => + (super.noSuchMethod( + Invocation.method( + #send, + [], + { + #toAddress: toAddress, + #amount: amount, + #args: args, + }, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<void> refresh() => (super.noSuchMethod( + Invocation.method( + #refresh, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + bool validateAddress(String? address) => (super.noSuchMethod( + Invocation.method( + #validateAddress, + [address], + ), + returnValue: false, + ) as bool); + @override + _i16.Future<bool> testNetworkConnection() => (super.noSuchMethod( + Invocation.method( + #testNetworkConnection, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<void> initializeNew() => (super.noSuchMethod( + Invocation.method( + #initializeNew, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> initializeExisting() => (super.noSuchMethod( + Invocation.method( + #initializeExisting, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> recoverFromMnemonic({ + required String? mnemonic, + required int? maxUnusedAddressGap, + required int? maxNumberOfIndexesToCheck, + required int? height, + }) => + (super.noSuchMethod( + Invocation.method( + #recoverFromMnemonic, + [], + { + #mnemonic: mnemonic, + #maxUnusedAddressGap: maxUnusedAddressGap, + #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck, + #height: height, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> exitCurrentWallet() => (super.noSuchMethod( + Invocation.method( + #exitCurrentWallet, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> fullRescan( + int? maxUnusedAddressGap, + int? maxNumberOfIndexesToCheck, + ) => + (super.noSuchMethod( + Invocation.method( + #fullRescan, + [ + maxUnusedAddressGap, + maxNumberOfIndexesToCheck, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<bool> isOwnAddress(String? address) => (super.noSuchMethod( + Invocation.method( + #isOwnAddress, + [address], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<int> estimateFeeFor( + int? satoshiAmount, + int? feeRate, + ) => + (super.noSuchMethod( + Invocation.method( + #estimateFeeFor, + [ + satoshiAmount, + feeRate, + ], + ), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<bool> generateNewAddress() => (super.noSuchMethod( + Invocation.method( + #generateNewAddress, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [CoinServiceAPI]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCoinServiceAPI extends _i1.Mock implements _i13.CoinServiceAPI { + @override + set onIsActiveWalletChanged(void Function(bool)? _onIsActiveWalletChanged) => + super.noSuchMethod( + Invocation.setter( + #onIsActiveWalletChanged, + _onIsActiveWalletChanged, + ), + returnValueForMissingStub: null, + ); + @override + _i15.Coin get coin => (super.noSuchMethod( + Invocation.getter(#coin), + returnValue: _i15.Coin.bitcoin, + ) as _i15.Coin); + @override + bool get isRefreshing => (super.noSuchMethod( + Invocation.getter(#isRefreshing), + returnValue: false, + ) as bool); + @override + bool get shouldAutoSync => (super.noSuchMethod( + Invocation.getter(#shouldAutoSync), + returnValue: false, + ) as bool); + @override + set shouldAutoSync(bool? shouldAutoSync) => super.noSuchMethod( + Invocation.setter( + #shouldAutoSync, + shouldAutoSync, + ), + returnValueForMissingStub: null, + ); + @override + bool get isFavorite => (super.noSuchMethod( + Invocation.getter(#isFavorite), + returnValue: false, + ) as bool); + @override + set isFavorite(bool? markFavorite) => super.noSuchMethod( + Invocation.setter( + #isFavorite, + markFavorite, + ), + returnValueForMissingStub: null, + ); + @override + _i16.Future<_i9.FeeObject> get fees => (super.noSuchMethod( + Invocation.getter(#fees), + returnValue: _i16.Future<_i9.FeeObject>.value(_FakeFeeObject_8( + this, + Invocation.getter(#fees), + )), + ) as _i16.Future<_i9.FeeObject>); + @override + _i16.Future<int> get maxFee => (super.noSuchMethod( + Invocation.getter(#maxFee), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<String> get currentReceivingAddress => (super.noSuchMethod( + Invocation.getter(#currentReceivingAddress), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<_i10.Decimal> get availableBalance => (super.noSuchMethod( + Invocation.getter(#availableBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#availableBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get pendingBalance => (super.noSuchMethod( + Invocation.getter(#pendingBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#pendingBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get totalBalance => (super.noSuchMethod( + Invocation.getter(#totalBalance), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#totalBalance), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<_i10.Decimal> get balanceMinusMaxFee => (super.noSuchMethod( + Invocation.getter(#balanceMinusMaxFee), + returnValue: _i16.Future<_i10.Decimal>.value(_FakeDecimal_7( + this, + Invocation.getter(#balanceMinusMaxFee), + )), + ) as _i16.Future<_i10.Decimal>); + @override + _i16.Future<List<String>> get allOwnAddresses => (super.noSuchMethod( + Invocation.getter(#allOwnAddresses), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + _i16.Future<_i9.TransactionData> get transactionData => (super.noSuchMethod( + Invocation.getter(#transactionData), + returnValue: + _i16.Future<_i9.TransactionData>.value(_FakeTransactionData_9( + this, + Invocation.getter(#transactionData), + )), + ) as _i16.Future<_i9.TransactionData>); + @override + _i16.Future<List<_i9.UtxoObject>> get unspentOutputs => (super.noSuchMethod( + Invocation.getter(#unspentOutputs), + returnValue: + _i16.Future<List<_i9.UtxoObject>>.value(<_i9.UtxoObject>[]), + ) as _i16.Future<List<_i9.UtxoObject>>); + @override + set walletName(String? newName) => super.noSuchMethod( + Invocation.setter( + #walletName, + newName, + ), + returnValueForMissingStub: null, + ); + @override + String get walletName => (super.noSuchMethod( + Invocation.getter(#walletName), + returnValue: '', + ) as String); + @override + String get walletId => (super.noSuchMethod( + Invocation.getter(#walletId), + returnValue: '', + ) as String); + @override + _i16.Future<List<String>> get mnemonic => (super.noSuchMethod( + Invocation.getter(#mnemonic), + returnValue: _i16.Future<List<String>>.value(<String>[]), + ) as _i16.Future<List<String>>); + @override + bool get hasCalledExit => (super.noSuchMethod( + Invocation.getter(#hasCalledExit), + returnValue: false, + ) as bool); + @override + bool get isConnected => (super.noSuchMethod( + Invocation.getter(#isConnected), + returnValue: false, + ) as bool); + @override + _i16.Future<Map<String, dynamic>> prepareSend({ + required String? address, + required int? satoshiAmount, + Map<String, dynamic>? args, + }) => + (super.noSuchMethod( + Invocation.method( + #prepareSend, + [], + { + #address: address, + #satoshiAmount: satoshiAmount, + #args: args, + }, + ), + returnValue: + _i16.Future<Map<String, dynamic>>.value(<String, dynamic>{}), + ) as _i16.Future<Map<String, dynamic>>); + @override + _i16.Future<String> confirmSend({required Map<String, dynamic>? txData}) => + (super.noSuchMethod( + Invocation.method( + #confirmSend, + [], + {#txData: txData}, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<String> send({ + required String? toAddress, + required int? amount, + Map<String, String>? args, + }) => + (super.noSuchMethod( + Invocation.method( + #send, + [], + { + #toAddress: toAddress, + #amount: amount, + #args: args, + }, + ), + returnValue: _i16.Future<String>.value(''), + ) as _i16.Future<String>); + @override + _i16.Future<void> refresh() => (super.noSuchMethod( + Invocation.method( + #refresh, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> updateNode(bool? shouldRefresh) => (super.noSuchMethod( + Invocation.method( + #updateNode, + [shouldRefresh], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + bool validateAddress(String? address) => (super.noSuchMethod( + Invocation.method( + #validateAddress, + [address], + ), + returnValue: false, + ) as bool); + @override + _i16.Future<bool> testNetworkConnection() => (super.noSuchMethod( + Invocation.method( + #testNetworkConnection, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); + @override + _i16.Future<void> recoverFromMnemonic({ + required String? mnemonic, + required int? maxUnusedAddressGap, + required int? maxNumberOfIndexesToCheck, + required int? height, + }) => + (super.noSuchMethod( + Invocation.method( + #recoverFromMnemonic, + [], + { + #mnemonic: mnemonic, + #maxUnusedAddressGap: maxUnusedAddressGap, + #maxNumberOfIndexesToCheck: maxNumberOfIndexesToCheck, + #height: height, + }, + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> initializeNew() => (super.noSuchMethod( + Invocation.method( + #initializeNew, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> initializeExisting() => (super.noSuchMethod( + Invocation.method( + #initializeExisting, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> exit() => (super.noSuchMethod( + Invocation.method( + #exit, + [], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<void> fullRescan( + int? maxUnusedAddressGap, + int? maxNumberOfIndexesToCheck, + ) => + (super.noSuchMethod( + Invocation.method( + #fullRescan, + [ + maxUnusedAddressGap, + maxNumberOfIndexesToCheck, + ], + ), + returnValue: _i16.Future<void>.value(), + returnValueForMissingStub: _i16.Future<void>.value(), + ) as _i16.Future<void>); + @override + _i16.Future<int> estimateFeeFor( + int? satoshiAmount, + int? feeRate, + ) => + (super.noSuchMethod( + Invocation.method( + #estimateFeeFor, + [ + satoshiAmount, + feeRate, + ], + ), + returnValue: _i16.Future<int>.value(0), + ) as _i16.Future<int>); + @override + _i16.Future<bool> generateNewAddress() => (super.noSuchMethod( + Invocation.method( + #generateNewAddress, + [], + ), + returnValue: _i16.Future<bool>.value(false), + ) as _i16.Future<bool>); +} diff --git a/test/widget_tests/custom_buttons/favorite_toggle_test.dart b/test/widget_tests/custom_buttons/favorite_toggle_test.dart new file mode 100644 index 000000000..54de9a44c --- /dev/null +++ b/test/widget_tests/custom_buttons/favorite_toggle_test.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:stackwallet/widgets/custom_buttons/favorite_toggle.dart'; + +void main() { + testWidgets("Test widget build", (widgetTester) async { + final key = UniqueKey(); + + await widgetTester.pumpWidget( + ProviderScope( + overrides: [], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: FavoriteToggle( + onChanged: null, + key: key, + ), + ), + ), + ); + + expect(find.byType(FavoriteToggle), findsOneWidget); + expect(find.byType(SvgPicture), findsOneWidget); + }); +} diff --git a/test/widget_tests/managed_favorite_test.dart b/test/widget_tests/managed_favorite_test.dart index 93d61ba32..dc643e831 100644 --- a/test/widget_tests/managed_favorite_test.dart +++ b/test/widget_tests/managed_favorite_test.dart @@ -46,7 +46,8 @@ void main() { .thenAnswer((realInvocation) => manager); when(manager.isFavorite).thenAnswer((realInvocation) => false); - const managedFavorite = ManagedFavorite(walletId: "some wallet id"); + final key = UniqueKey(); + // const managedFavorite = ManagedFavorite(walletId: "some wallet id", key: key,); await widgetTester.pumpWidget( ProviderScope( overrides: [ @@ -60,8 +61,11 @@ void main() { ), ], ), - home: const Material( - child: managedFavorite, + home: Material( + child: ManagedFavorite( + walletId: "some wallet id", + key: key, + ), ), ), ), diff --git a/test/widget_tests/shake/shake_test.dart b/test/widget_tests/shake/shake_test.dart index cc82bf1ed..cddd99c05 100644 --- a/test/widget_tests/shake/shake_test.dart +++ b/test/widget_tests/shake/shake_test.dart @@ -2,3 +2,34 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:stackwallet/utilities/theme/light_colors.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/shake/shake.dart'; + +void main() { + testWidgets("Widget build", (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: Shake( + animationRange: 10, + controller: ShakeController(), + animationDuration: const Duration(milliseconds: 200), + child: Column( + children: const [ + Center( + child: Text("Enter Pin"), + ) + ], + )), + ), + ), + ); + + expect(find.byType(Shake), findsOneWidget); + expect(find.byType(Text), findsOneWidget); + }); +} From decbf0989a61f99b7a184acb1cfae3ecdce8a7dd Mon Sep 17 00:00:00 2001 From: Likho <likhojiba@gmail.com> Date: Mon, 24 Oct 2022 17:16:08 +0200 Subject: [PATCH 5/5] Add more widget tests --- .../notifications/notification_card_test.dart | 47 ++++++++++ .../icon_widgets/addressbook_icon_test.dart | 31 +++++++ test/widget_tests/transaction_card_test.dart | 93 +++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 test/notifications/notification_card_test.dart create mode 100644 test/widget_tests/icon_widgets/addressbook_icon_test.dart diff --git a/test/notifications/notification_card_test.dart b/test/notifications/notification_card_test.dart new file mode 100644 index 000000000..3ac11c21c --- /dev/null +++ b/test/notifications/notification_card_test.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/models/notification_model.dart'; +import 'package:stackwallet/notifications/notification_card.dart'; +import 'package:stackwallet/utilities/assets.dart'; +import 'package:stackwallet/utilities/enums/coin_enum.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; + +void main() { + testWidgets("test notification card", (widgetTester) async { + final key = UniqueKey(); + final notificationCard = NotificationCard( + key: key, + notification: NotificationModel( + id: 1, + title: "notification title", + description: "notification description", + iconAssetName: Assets.svg.iconFor(coin: Coin.bitcoin), + date: DateTime.parse("1662544771"), + walletId: "wallet id", + read: true, + shouldWatchForUpdates: true, + coinName: "Bitcoin"), + ); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: notificationCard, + ), + ), + ); + + expect(find.byWidget(notificationCard), findsOneWidget); + expect(find.text("notification title"), findsOneWidget); + expect(find.text("notification description"), findsOneWidget); + expect(find.byType(SvgPicture), findsOneWidget); + }); +} diff --git a/test/widget_tests/icon_widgets/addressbook_icon_test.dart b/test/widget_tests/icon_widgets/addressbook_icon_test.dart new file mode 100644 index 000000000..89ff4f236 --- /dev/null +++ b/test/widget_tests/icon_widgets/addressbook_icon_test.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/theme/light_colors.dart'; +import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/widgets/icon_widgets/addressbook_icon.dart'; + +void main() { + testWidgets("test address book icon widget", (widgetTester) async { + final key = UniqueKey(); + final addressBookIcon = AddressBookIcon( + key: key, + ); + + await widgetTester.pumpWidget( + MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme(LightColors()), + ], + ), + home: Material( + child: addressBookIcon, + ), + ), + ); + + expect(find.byWidget(addressBookIcon), findsOneWidget); + expect(find.byType(SvgPicture), findsOneWidget); + }); +} diff --git a/test/widget_tests/transaction_card_test.dart b/test/widget_tests/transaction_card_test.dart index b23254f59..3f46794bd 100644 --- a/test/widget_tests/transaction_card_test.dart +++ b/test/widget_tests/transaction_card_test.dart @@ -131,6 +131,99 @@ void main() { verifyNoMoreInteractions(mockLocaleService); }); + testWidgets("Anonymized confirmed tx displays correctly", (tester) async { + final mockManager = MockManager(); + final mockLocaleService = MockLocaleService(); + final wallets = MockWallets(); + final mockPrefs = MockPrefs(); + final mockPriceService = MockPriceService(); + + final tx = Transaction( + txid: "some txid", + confirmedStatus: true, + timestamp: 1648595998, + txType: "Anonymized", + amount: 100000000, + aliens: [], + worthNow: "0.01", + worthAtBlockTimestamp: "0.01", + fees: 3794, + inputSize: 1, + outputSize: 1, + inputs: [], + outputs: [], + address: "", + height: 450123, + subType: "mint", + confirmations: 10, + isCancelled: false); + + final CoinServiceAPI wallet = MockFiroWallet(); + + when(wallet.coin.ticker).thenAnswer((_) => "FIRO"); + when(mockLocaleService.locale).thenAnswer((_) => "en_US"); + when(mockPrefs.currency).thenAnswer((_) => "USD"); + when(mockPrefs.externalCalls).thenAnswer((_) => true); + when(mockPriceService.getPrice(Coin.firo)) + .thenAnswer((realInvocation) => Tuple2(Decimal.ten, 0.00)); + + when(wallet.coin).thenAnswer((_) => Coin.firo); + + when(wallets.getManager("wallet-id")) + .thenAnswer((realInvocation) => Manager(wallet)); + // + await tester.pumpWidget( + ProviderScope( + overrides: [ + walletsChangeNotifierProvider.overrideWithValue(wallets), + localeServiceChangeNotifierProvider + .overrideWithValue(mockLocaleService), + prefsChangeNotifierProvider.overrideWithValue(mockPrefs), + priceAnd24hChangeNotifierProvider.overrideWithValue(mockPriceService) + ], + child: MaterialApp( + theme: ThemeData( + extensions: [ + StackColors.fromStackColorTheme( + LightColors(), + ), + ], + ), + home: TransactionCard(transaction: tx, walletId: "wallet-id"), + ), + ), + ); + + // + final title = find.text("Anonymized"); + // final price1 = find.text("0.00 USD"); + final amount = find.text("1.00000000 FIRO"); + + final icon = find.byIcon(FeatherIcons.arrowUp); + + expect(title, findsOneWidget); + // expect(price1, findsOneWidget); + expect(amount, findsOneWidget); + // expect(icon, findsOneWidget); + // + await tester.pumpAndSettle(Duration(seconds: 2)); + // + // final price2 = find.text("\$10.00"); + // expect(price2, findsOneWidget); + // + // verify(mockManager.addListener(any)).called(1); + verify(mockLocaleService.addListener(any)).called(1); + + verify(mockPrefs.currency).called(1); + verify(mockPriceService.getPrice(Coin.firo)).called(1); + verify(wallet.coin.ticker).called(1); + + verify(mockLocaleService.locale).called(1); + + verifyNoMoreInteractions(mockManager); + verifyNoMoreInteractions(mockLocaleService); + }); + testWidgets("Received unconfirmed tx displays correctly", (tester) async { final mockManager = MockManager(); final mockLocaleService = MockLocaleService();