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();