Widget tests for managed_favorite, node_card, transaction_card and node_card_details

This commit is contained in:
Likho 2022-10-18 16:19:18 +02:00
parent c8ec409efa
commit d22746be52
7 changed files with 1391 additions and 726 deletions

View file

@ -1,3 +1,5 @@
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
@ -7,9 +9,11 @@ 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/listenable_list.dart';
import 'package:stackwallet/widgets/managed_favorite.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/theme/light_colors.dart';
@ -20,17 +24,18 @@ import 'managed_favorite_test.mocks.dart';
@GenerateMocks([
Wallets,
WalletsService,
BitcoinWallet
BitcoinWallet,
LocaleService
], customMocks: [
MockSpec<NodeService>(returnNullOnMissingStub: true),
MockSpec<Manager>(returnNullOnMissingStub: true),
MockSpec<CoinServiceAPI>(returnNullOnMissingStub: true),
// MockSpec<WalletsService>(returnNullOnMissingStub: true),
])
void main() {
testWidgets("Test wallet info row displays correctly", (widgetTester) async {
final wallets = MockWallets();
final CoinServiceAPI wallet = MockBitcoinWallet();
when(wallet.coin).thenAnswer((_) => Coin.bitcoin);
when(wallet.walletName).thenAnswer((_) => "some wallet");
when(wallet.walletId).thenAnswer((_) => "some wallet id");
@ -63,4 +68,124 @@ void main() {
expect(find.byType(ManagedFavorite), findsOneWidget);
});
testWidgets("Button Pressed - wallet unfavorite", (widgetTester) async {
final wallets = MockWallets();
final CoinServiceAPI wallet = MockBitcoinWallet();
final mockLocaleService = MockLocaleService();
final mockWalletsService = MockWalletsService();
when(wallet.coin).thenAnswer((_) => Coin.bitcoin);
when(wallet.walletName).thenAnswer((_) => "some wallet");
when(wallet.walletId).thenAnswer((_) => "some wallet id");
final manager = Manager(wallet);
when(wallets.getManager("some wallet id"))
.thenAnswer((realInvocation) => manager);
when(manager.isFavorite).thenAnswer((realInvocation) => false);
when(mockLocaleService.locale).thenAnswer((_) => "en_US");
when(wallets.getManagerProvider("some wallet id")).thenAnswer(
(realInvocation) => ChangeNotifierProvider((ref) => manager));
const managedFavorite = ManagedFavorite(walletId: "some wallet id");
final ListenableList<ChangeNotifierProvider<Manager>> favorites =
ListenableList();
final ListenableList<ChangeNotifierProvider<Manager>> nonfavorites =
ListenableList();
await widgetTester.pumpWidget(
ProviderScope(
overrides: [
walletsChangeNotifierProvider.overrideWithValue(wallets),
localeServiceChangeNotifierProvider
.overrideWithValue(mockLocaleService),
favoritesProvider.overrideWithValue(favorites),
nonFavoritesProvider.overrideWithValue(nonfavorites),
walletsServiceChangeNotifierProvider
.overrideWithValue(mockWalletsService)
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const Material(
child: managedFavorite,
),
),
),
);
expect(find.byType(RawMaterialButton), findsOneWidget);
await widgetTester.tap(find.byType(RawMaterialButton));
await widgetTester.pump();
});
testWidgets("Button Pressed - wallet is favorite", (widgetTester) async {
final wallets = MockWallets();
final CoinServiceAPI wallet = MockBitcoinWallet();
final mockLocaleService = MockLocaleService();
final mockWalletsService = MockWalletsService();
when(wallet.coin).thenAnswer((_) => Coin.bitcoin);
when(wallet.walletName).thenAnswer((_) => "some wallet");
when(wallet.walletId).thenAnswer((_) => "some wallet id");
final manager = Manager(wallet);
when(wallets.getManager("some wallet id"))
.thenAnswer((realInvocation) => manager);
when(manager.isFavorite).thenAnswer((realInvocation) => true);
when(mockLocaleService.locale).thenAnswer((_) => "en_US");
when(wallets.getManagerProvider("some wallet id")).thenAnswer(
(realInvocation) => ChangeNotifierProvider((ref) => manager));
const managedFavorite = ManagedFavorite(walletId: "some wallet id");
final ListenableList<ChangeNotifierProvider<Manager>> favorites =
ListenableList();
final ListenableList<ChangeNotifierProvider<Manager>> nonfavorites =
ListenableList();
await widgetTester.pumpWidget(
ProviderScope(
overrides: [
walletsChangeNotifierProvider.overrideWithValue(wallets),
localeServiceChangeNotifierProvider
.overrideWithValue(mockLocaleService),
favoritesProvider.overrideWithValue(favorites),
nonFavoritesProvider.overrideWithValue(nonfavorites),
walletsServiceChangeNotifierProvider
.overrideWithValue(mockWalletsService)
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const Material(
child: managedFavorite,
),
),
),
);
expect(find.byType(RawMaterialButton), findsOneWidget);
await widgetTester.tap(find.byType(RawMaterialButton));
await widgetTester.pump();
});
}

View file

@ -13,10 +13,11 @@ import 'package:mockito/mockito.dart' as _i1;
import 'package:stackwallet/electrumx_rpc/cached_electrumx.dart' as _i11;
import 'package:stackwallet/electrumx_rpc/electrumx.dart' as _i10;
import 'package:stackwallet/models/models.dart' as _i8;
import 'package:stackwallet/models/node_model.dart' as _i20;
import 'package:stackwallet/models/node_model.dart' as _i21;
import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart' as _i19;
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 _i20;
import 'package:stackwallet/services/node_service.dart' as _i3;
import 'package:stackwallet/services/transaction_notification_tracker.dart'
as _i7;
@ -1312,6 +1313,68 @@ class MockBitcoinWallet extends _i1.Mock implements _i19.BitcoinWallet {
) 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 _i20.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 [NodeService].
///
/// See the documentation for Mockito's code generation for more information.
@ -1326,15 +1389,15 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
),
) as _i12.FlutterSecureStorageInterface);
@override
List<_i20.NodeModel> get primaryNodes => (super.noSuchMethod(
List<_i21.NodeModel> get primaryNodes => (super.noSuchMethod(
Invocation.getter(#primaryNodes),
returnValue: <_i20.NodeModel>[],
) as List<_i20.NodeModel>);
returnValue: <_i21.NodeModel>[],
) as List<_i21.NodeModel>);
@override
List<_i20.NodeModel> get nodes => (super.noSuchMethod(
List<_i21.NodeModel> get nodes => (super.noSuchMethod(
Invocation.getter(#nodes),
returnValue: <_i20.NodeModel>[],
) as List<_i20.NodeModel>);
returnValue: <_i21.NodeModel>[],
) as List<_i21.NodeModel>);
@override
bool get hasListeners => (super.noSuchMethod(
Invocation.getter(#hasListeners),
@ -1352,7 +1415,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
@override
_i16.Future<void> setPrimaryNodeFor({
required _i15.Coin? coin,
required _i20.NodeModel? node,
required _i21.NodeModel? node,
bool? shouldNotifyListeners = false,
}) =>
(super.noSuchMethod(
@ -1369,40 +1432,40 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
returnValueForMissingStub: _i16.Future<void>.value(),
) as _i16.Future<void>);
@override
_i20.NodeModel? getPrimaryNodeFor({required _i15.Coin? coin}) =>
_i21.NodeModel? getPrimaryNodeFor({required _i15.Coin? coin}) =>
(super.noSuchMethod(Invocation.method(
#getPrimaryNodeFor,
[],
{#coin: coin},
)) as _i20.NodeModel?);
)) as _i21.NodeModel?);
@override
List<_i20.NodeModel> getNodesFor(_i15.Coin? coin) => (super.noSuchMethod(
List<_i21.NodeModel> getNodesFor(_i15.Coin? coin) => (super.noSuchMethod(
Invocation.method(
#getNodesFor,
[coin],
),
returnValue: <_i20.NodeModel>[],
) as List<_i20.NodeModel>);
returnValue: <_i21.NodeModel>[],
) as List<_i21.NodeModel>);
@override
_i20.NodeModel? getNodeById({required String? id}) =>
_i21.NodeModel? getNodeById({required String? id}) =>
(super.noSuchMethod(Invocation.method(
#getNodeById,
[],
{#id: id},
)) as _i20.NodeModel?);
)) as _i21.NodeModel?);
@override
List<_i20.NodeModel> failoverNodesFor({required _i15.Coin? coin}) =>
List<_i21.NodeModel> failoverNodesFor({required _i15.Coin? coin}) =>
(super.noSuchMethod(
Invocation.method(
#failoverNodesFor,
[],
{#coin: coin},
),
returnValue: <_i20.NodeModel>[],
) as List<_i20.NodeModel>);
returnValue: <_i21.NodeModel>[],
) as List<_i21.NodeModel>);
@override
_i16.Future<void> add(
_i20.NodeModel? node,
_i21.NodeModel? node,
String? password,
bool? shouldNotifyListeners,
) =>
@ -1454,7 +1517,7 @@ class MockNodeService extends _i1.Mock implements _i3.NodeService {
) as _i16.Future<void>);
@override
_i16.Future<void> edit(
_i20.NodeModel? editedNode,
_i21.NodeModel? editedNode,
String? password,
bool? shouldNotifyListeners,
) =>

View file

@ -1,586 +1,204 @@
// import 'package:flutter/material.dart';
// import 'package:flutter_svg/svg.dart';
// import 'package:flutter_test/flutter_test.dart';
// import 'package:mockingjay/mockingjay.dart' as mockingjay;
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:mockito/mockito.dart';
import 'package:stackwallet/models/node_model.dart';
import 'package:stackwallet/providers/providers.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/services/node_service.dart';
// import 'package:stackwallet/widgets/node_card.dart';
import 'package:stackwallet/widgets/node_card.dart';
import 'package:stackwallet/widgets/node_options_sheet.dart';
// import 'node_card_test.mocks.dart';
import 'node_card_test.mocks.dart';
@GenerateMocks([], customMocks: [
MockSpec<NodeService>(returnNullOnMissingStub: true),
])
@GenerateMocks([NodeService])
void main() {
// testWidgets("NodeCard builds inactive node correctly", (tester) async {
// final nodeService = MockNodeService();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "some other node");
//
// await tester.pumpWidget(
// MaterialApp(
// home: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "Campfire default",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("Campfire default"), findsOneWidget);
// expect(find.byType(Text), findsOneWidget);
// expect(find.byType(SvgPicture), findsOneWidget);
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
// });
//
// testWidgets("NodeCard builds active node correctly", (tester) async {
// final nodeService = MockNodeService();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// await tester.pumpWidget(
// MaterialApp(
// home: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "Campfire default",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("Campfire default"), findsOneWidget);
// expect(find.text("Connected"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(2));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
// });
//
// testWidgets("tap to open context menu on default node", (tester) async {
// final nodeService = MockNodeService();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// await tester.pumpWidget(
// MaterialApp(
// home: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "Campfire default",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("Campfire default"), findsOneWidget);
// expect(find.text("Connected"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(2));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(4));
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
// });
//
// testWidgets("tap to open context menu on any other node", (tester) async {
// final nodeService = MockNodeService();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// await tester.pumpWidget(
// MaterialApp(
// home: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
// });
//
// testWidgets("tap connect", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
// when(nodeService.setCurrentNode("some other node"))
// .thenAnswer((_) async {});
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Connect"));
// await tester.pumpAndSettle();
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
// verify(nodeService.setCurrentNode("some other node")).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(1);
// mockingjay.verifyNoMoreInteractions(navigator);
// });
//
// testWidgets("tap details", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
// mockingjay
// .when(() => navigator.push(mockingjay.any()))
// .thenAnswer((_) async {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Details"));
// await tester.pump();
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(1);
// mockingjay
// .verify(() => navigator.push(mockingjay.any(
// that: mockingjay.isRoute(whereName: equals("/nodedetailsview")))))
// .called(1);
//
// mockingjay.verifyNoMoreInteractions(navigator);
// });
//
// testWidgets("tap edit", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
// mockingjay
// .when(() => navigator.push(mockingjay.any()))
// .thenAnswer((_) async {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Edit"));
// await tester.pump();
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(1);
// mockingjay
// .verify(() => navigator.push(mockingjay.any(
// that:
// mockingjay.isRoute(whereName: equals("/editnodedetailsview")))))
// .called(1);
//
// mockingjay.verifyNoMoreInteractions(navigator);
// });
//
// testWidgets("tap delete and cancel", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Delete"));
// await tester.pumpAndSettle();
//
// expect(find.byType(ModalPopupDialog), findsOneWidget);
// expect(find.byType(SimpleButton), findsOneWidget);
// expect(find.byType(GradientButton), findsOneWidget);
// expect(find.text("CANCEL"), findsOneWidget);
// expect(find.text("DELETE"), findsOneWidget);
// expect(find.text("Do you want to delete some other node?"), findsOneWidget);
//
// await tester.tap(find.byType(SimpleButton));
// await tester.pumpAndSettle();
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(2);
//
// mockingjay.verifyNoMoreInteractions(navigator);
// });
//
// testWidgets("tap delete and confirm fails", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
// when(nodeService.deleteNode("some other node"))
// .thenAnswer((_) async => false);
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Delete"));
// await tester.pumpAndSettle();
//
// expect(find.byType(ModalPopupDialog), findsOneWidget);
// expect(find.byType(SimpleButton), findsOneWidget);
// expect(find.byType(GradientButton), findsOneWidget);
// expect(find.text("CANCEL"), findsOneWidget);
// expect(find.text("DELETE"), findsOneWidget);
// expect(find.text("Do you want to delete some other node?"), findsOneWidget);
//
// await tester.tap(find.byType(GradientButton));
// await tester.pumpAndSettle();
//
// expect(find.byType(CampfireAlert), findsOneWidget);
// expect(find.text("Error: Could not delete node named \"some other node\"!"),
// findsOneWidget);
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
// verify(nodeService.deleteNode("some other node")).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(2);
//
// mockingjay.verifyNoMoreInteractions(navigator);
// });
//
// testWidgets("tap delete and confirm succeeds", (tester) async {
// final nodeService = MockNodeService();
// final navigator = mockingjay.MockNavigator();
//
// when(nodeService.activeNodeName).thenAnswer((_) => "Campfire default");
// when(nodeService.deleteNode("some other node"))
// .thenAnswer((_) async => true);
//
// mockingjay.when(() => navigator.pop()).thenAnswer((_) {});
//
// await tester.pumpWidget(
// MaterialApp(
// home: mockingjay.MockNavigatorProvider(
// navigator: navigator,
// child: MultiProvider(
// providers: [
// ChangeNotifierProvider<NodeService>(
// create: (_) => nodeService,
// ),
// ],
// child: NodeCard(
// nodeName: "some other node",
// nodeData: {
// "port": "9000",
// "ipAddress": "some url",
// "useSSL": true,
// },
// ),
// ),
// ),
// ),
// );
// await tester.pumpAndSettle();
//
// expect(find.text("some other node"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(1));
// expect(find.byType(SvgPicture), findsOneWidget);
//
// await tester.tap(find.byType(NodeCard));
// await tester.pumpAndSettle();
//
// expect(find.text("Connect"), findsOneWidget);
// expect(find.text("Details"), findsOneWidget);
// expect(find.text("Edit"), findsOneWidget);
// expect(find.text("Delete"), findsOneWidget);
// expect(find.byType(Text), findsNWidgets(5));
//
// await tester.tap(find.text("Delete"));
// await tester.pumpAndSettle();
//
// expect(find.byType(ModalPopupDialog), findsOneWidget);
// expect(find.byType(SimpleButton), findsOneWidget);
// expect(find.byType(GradientButton), findsOneWidget);
// expect(find.text("CANCEL"), findsOneWidget);
// expect(find.text("DELETE"), findsOneWidget);
// expect(find.text("Do you want to delete some other node?"), findsOneWidget);
//
// await tester.tap(find.byType(GradientButton));
// await tester.pumpAndSettle();
//
// expect(find.byType(CampfireAlert), findsNothing);
// expect(find.text("Error: Could not delete node named \"some other node\"!"),
// findsNothing);
//
// verify(nodeService.activeNodeName).called(1);
// verify(nodeService.addListener(any)).called(1);
// verify(nodeService.deleteNode("some other node")).called(1);
//
// verifyNoMoreInteractions(nodeService);
//
// mockingjay.verify(() => navigator.pop()).called(2);
//
// mockingjay.verifyNoMoreInteractions(navigator);
// });
testWidgets("NodeCard builds inactive node correctly", (tester) async {
final nodeService = MockNodeService();
when(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
when(nodeService.getNodeById(id: "node id")).thenAnswer((realInvocation) =>
NodeModel(
host: "127.0.0.1",
port: 2000,
name: "some other name",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
await tester.pumpWidget(
ProviderScope(
overrides: [
nodeServiceChangeNotifierProvider.overrideWithValue(nodeService),
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const NodeCard(
nodeId: "node id", coin: Coin.bitcoin, popBackToRoute: ""),
),
),
);
await tester.pumpAndSettle();
expect(find.text("some other name"), findsOneWidget);
expect(find.text("Disconnected"), findsOneWidget);
expect(find.byType(SvgPicture), findsWidgets);
verify(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).called(1);
verify(nodeService.getNodeById(id: "node id")).called(1);
verify(nodeService.addListener(any)).called(1);
verifyNoMoreInteractions(nodeService);
});
testWidgets("NodeCard builds active node correctly", (tester) async {
final nodeService = MockNodeService();
when(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
when(nodeService.getNodeById(id: "node id")).thenAnswer((realInvocation) =>
NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
await tester.pumpWidget(
ProviderScope(
overrides: [
nodeServiceChangeNotifierProvider.overrideWithValue(nodeService),
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const NodeCard(
nodeId: "node id", coin: Coin.bitcoin, popBackToRoute: ""),
),
),
);
await tester.pumpAndSettle();
expect(find.text("Stack Default"), findsOneWidget);
expect(find.text("Connected"), findsOneWidget);
expect(find.byType(Text), findsNWidgets(2));
expect(find.byType(SvgPicture), findsWidgets);
verify(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).called(1);
verify(nodeService.getNodeById(id: "node id")).called(1);
verify(nodeService.addListener(any)).called(1);
verifyNoMoreInteractions(nodeService);
});
testWidgets("tap to open context menu on default node", (tester) async {
final nodeService = MockNodeService();
when(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
when(nodeService.getNodeById(id: "node id")).thenAnswer((realInvocation) =>
NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
await tester.pumpWidget(
ProviderScope(
overrides: [
nodeServiceChangeNotifierProvider.overrideWithValue(nodeService),
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const NodeCard(
nodeId: "node id", coin: Coin.bitcoin, popBackToRoute: ""),
),
),
);
await tester.pumpAndSettle();
expect(find.text("Stack Default"), findsOneWidget);
expect(find.text("Connected"), findsOneWidget);
expect(find.byType(Text), findsNWidgets(2));
expect(find.byType(SvgPicture), findsNWidgets(2));
await tester.tap(find.byType(NodeCard));
await tester.pumpAndSettle();
expect(find.text("Connect"), findsOneWidget);
expect(find.text("Details"), findsOneWidget);
expect(find.byType(NodeOptionsSheet), findsOneWidget);
expect(find.byType(Text), findsNWidgets(7));
verify(nodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).called(2);
verify(nodeService.getNodeById(id: "node id")).called(2);
verify(nodeService.addListener(any)).called(1);
verifyNoMoreInteractions(nodeService);
});
}

View file

@ -39,6 +39,10 @@ class _FakeFlutterSecureStorageInterface_0 extends _i1.SmartFake
///
/// See the documentation for Mockito's code generation for more information.
class MockNodeService extends _i1.Mock implements _i3.NodeService {
MockNodeService() {
_i1.throwOnMissingStub(this);
}
@override
_i2.FlutterSecureStorageInterface get secureStorageInterface =>
(super.noSuchMethod(

View file

@ -0,0 +1,154 @@
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/node_model.dart';
import 'package:mockingjay/mockingjay.dart' as mockingjay;
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/wallets.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 'package:stackwallet/services/node_service.dart';
import 'package:stackwallet/widgets/node_options_sheet.dart';
import 'package:tuple/tuple.dart';
import 'node_options_sheet_test.mocks.dart';
@GenerateMocks([Wallets, Prefs, NodeService])
void main() {
testWidgets("Load Node Options widget", (tester) async {
final mockWallets = MockWallets();
final mockPrefs = MockPrefs();
final mockNodeService = MockNodeService();
when(mockNodeService.getNodeById(id: "node id")).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
when(mockNodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
await tester.pumpWidget(
ProviderScope(
overrides: [
walletsChangeNotifierProvider.overrideWithValue(mockWallets),
prefsChangeNotifierProvider.overrideWithValue(mockPrefs),
nodeServiceChangeNotifierProvider.overrideWithValue(mockNodeService)
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(
LightColors(),
),
],
),
home: const NodeOptionsSheet(
nodeId: "node id", coin: Coin.bitcoin, popBackToRoute: ""),
),
),
);
await tester.pumpAndSettle();
expect(find.text("Node options"), findsOneWidget);
expect(find.text("Stack Default"), findsOneWidget);
expect(find.text("Connected"), findsOneWidget);
expect(find.byType(SvgPicture), findsNWidgets(2));
expect(find.text("Details"), findsOneWidget);
expect(find.text("Connect"), findsOneWidget);
verify(mockNodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).called(1);
verify(mockNodeService.getNodeById(id: "node id")).called(1);
verify(mockNodeService.addListener(any)).called(1);
verifyNoMoreInteractions(mockNodeService);
});
testWidgets("Details tap", (tester) async {
final mockWallets = MockWallets();
final mockPrefs = MockPrefs();
final mockNodeService = MockNodeService();
final navigator = mockingjay.MockNavigator();
when(mockNodeService.getNodeById(id: "node id")).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
when(mockNodeService.getPrimaryNodeFor(coin: Coin.bitcoin)).thenAnswer(
(realInvocation) => NodeModel(
host: "127.0.0.1",
port: 2000,
name: "Stack Default",
id: "node id",
useSSL: true,
enabled: true,
coinName: "Bitcoin",
isFailover: false,
isDown: false));
mockingjay
.when(() => navigator.pushNamed("/nodeDetails",
arguments: const Tuple3(Coin.bitcoin, "node id", "coinNodes")))
.thenAnswer((_) async => {});
await tester.pumpWidget(
ProviderScope(
overrides: [
walletsChangeNotifierProvider.overrideWithValue(mockWallets),
prefsChangeNotifierProvider.overrideWithValue(mockPrefs),
nodeServiceChangeNotifierProvider.overrideWithValue(mockNodeService)
],
child: MaterialApp(
theme: ThemeData(
extensions: [
StackColors.fromStackColorTheme(LightColors()),
],
),
home: mockingjay.MockNavigatorProvider(
navigator: navigator,
child: const NodeOptionsSheet(
nodeId: "node id",
coin: Coin.bitcoin,
popBackToRoute: "coinNodes")),
),
),
);
await tester.tap(find.text("Details"));
await tester.pumpAndSettle();
mockingjay.verify(() => navigator.pop()).called(1);
mockingjay
.verify(() => navigator.pushNamed("/nodeDetails",
arguments: const Tuple3(Coin.bitcoin, "node id", "coinNodes")))
.called(1);
});
}

View file

@ -0,0 +1,812 @@
// Mocks generated by Mockito 5.3.2 from annotations
// in stackwallet/test/widget_tests/node_options_sheet_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i10;
import 'dart:ui' as _i12;
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/models/node_model.dart' as _i16;
import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet.dart'
as _i14;
import 'package:stackwallet/services/coins/manager.dart' as _i6;
import 'package:stackwallet/services/node_service.dart' as _i3;
import 'package:stackwallet/services/wallets.dart' as _i8;
import 'package:stackwallet/services/wallets_service.dart' as _i2;
import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i15;
import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i9;
import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i13;
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart'
as _i7;
import 'package:stackwallet/utilities/prefs.dart' as _i11;
// 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,
);
}
/// A class which mocks [Wallets].
///
/// See the documentation for Mockito's code generation for more information.
class MockWallets extends _i1.Mock implements _i8.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 _i9.Coin? coin}) =>
(super.noSuchMethod(
Invocation.method(
#getWalletIdsFor,
[],
{#coin: coin},
),
returnValue: <String>[],
) as List<String>);
@override
Map<_i9.Coin, List<_i5.ChangeNotifierProvider<_i6.Manager>>>
getManagerProvidersByCoin() => (super.noSuchMethod(
Invocation.method(
#getManagerProvidersByCoin,
[],
),
returnValue: <_i9.Coin,
List<_i5.ChangeNotifierProvider<_i6.Manager>>>{},
) as Map<_i9.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
_i10.Future<void> load(_i11.Prefs? prefs) => (super.noSuchMethod(
Invocation.method(
#load,
[prefs],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> loadAfterStackRestore(
_i11.Prefs? prefs,
List<_i6.Manager>? managers,
) =>
(super.noSuchMethod(
Invocation.method(
#loadAfterStackRestore,
[
prefs,
managers,
],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
void addListener(_i12.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(
#addListener,
[listener],
),
returnValueForMissingStub: null,
);
@override
void removeListener(_i12.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(
#removeListener,
[listener],
),
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 _i11.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
_i13.SyncingType get syncType => (super.noSuchMethod(
Invocation.getter(#syncType),
returnValue: _i13.SyncingType.currentWalletOnly,
) as _i13.SyncingType);
@override
set syncType(_i13.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
_i14.ExchangeRateType get exchangeRateType => (super.noSuchMethod(
Invocation.getter(#exchangeRateType),
returnValue: _i14.ExchangeRateType.estimated,
) as _i14.ExchangeRateType);
@override
set exchangeRateType(_i14.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
_i15.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod(
Invocation.getter(#backupFrequencyType),
returnValue: _i15.BackupFrequencyType.everyTenMinutes,
) as _i15.BackupFrequencyType);
@override
set backupFrequencyType(_i15.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
_i10.Future<void> init() => (super.noSuchMethod(
Invocation.method(
#init,
[],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> incrementCurrentNotificationIndex() => (super.noSuchMethod(
Invocation.method(
#incrementCurrentNotificationIndex,
[],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
void addListener(_i12.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(
#addListener,
[listener],
),
returnValueForMissingStub: null,
);
@override
void removeListener(_i12.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<_i16.NodeModel> get primaryNodes => (super.noSuchMethod(
Invocation.getter(#primaryNodes),
returnValue: <_i16.NodeModel>[],
) as List<_i16.NodeModel>);
@override
List<_i16.NodeModel> get nodes => (super.noSuchMethod(
Invocation.getter(#nodes),
returnValue: <_i16.NodeModel>[],
) as List<_i16.NodeModel>);
@override
bool get hasListeners => (super.noSuchMethod(
Invocation.getter(#hasListeners),
returnValue: false,
) as bool);
@override
_i10.Future<void> updateDefaults() => (super.noSuchMethod(
Invocation.method(
#updateDefaults,
[],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> setPrimaryNodeFor({
required _i9.Coin? coin,
required _i16.NodeModel? node,
bool? shouldNotifyListeners = false,
}) =>
(super.noSuchMethod(
Invocation.method(
#setPrimaryNodeFor,
[],
{
#coin: coin,
#node: node,
#shouldNotifyListeners: shouldNotifyListeners,
},
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i16.NodeModel? getPrimaryNodeFor({required _i9.Coin? coin}) =>
(super.noSuchMethod(Invocation.method(
#getPrimaryNodeFor,
[],
{#coin: coin},
)) as _i16.NodeModel?);
@override
List<_i16.NodeModel> getNodesFor(_i9.Coin? coin) => (super.noSuchMethod(
Invocation.method(
#getNodesFor,
[coin],
),
returnValue: <_i16.NodeModel>[],
) as List<_i16.NodeModel>);
@override
_i16.NodeModel? getNodeById({required String? id}) =>
(super.noSuchMethod(Invocation.method(
#getNodeById,
[],
{#id: id},
)) as _i16.NodeModel?);
@override
List<_i16.NodeModel> failoverNodesFor({required _i9.Coin? coin}) =>
(super.noSuchMethod(
Invocation.method(
#failoverNodesFor,
[],
{#coin: coin},
),
returnValue: <_i16.NodeModel>[],
) as List<_i16.NodeModel>);
@override
_i10.Future<void> add(
_i16.NodeModel? node,
String? password,
bool? shouldNotifyListeners,
) =>
(super.noSuchMethod(
Invocation.method(
#add,
[
node,
password,
shouldNotifyListeners,
],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> delete(
String? id,
bool? shouldNotifyListeners,
) =>
(super.noSuchMethod(
Invocation.method(
#delete,
[
id,
shouldNotifyListeners,
],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> setEnabledState(
String? id,
bool? enabled,
bool? shouldNotifyListeners,
) =>
(super.noSuchMethod(
Invocation.method(
#setEnabledState,
[
id,
enabled,
shouldNotifyListeners,
],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> edit(
_i16.NodeModel? editedNode,
String? password,
bool? shouldNotifyListeners,
) =>
(super.noSuchMethod(
Invocation.method(
#edit,
[
editedNode,
password,
shouldNotifyListeners,
],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
_i10.Future<void> updateCommunityNodes() => (super.noSuchMethod(
Invocation.method(
#updateCommunityNodes,
[],
),
returnValue: _i10.Future<void>.value(),
returnValueForMissingStub: _i10.Future<void>.value(),
) as _i10.Future<void>);
@override
void addListener(_i12.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(
#addListener,
[listener],
),
returnValueForMissingStub: null,
);
@override
void removeListener(_i12.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,
);
}

View file

@ -2,27 +2,18 @@ import 'package:decimal/decimal.dart';
import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hive/hive.dart';
import 'package:hive_test/hive_test.dart';
import 'package:mockingjay/mockingjay.dart' as mockingjay;
import 'package:mockito/annotations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mockito/mockito.dart';
import 'package:stackwallet/hive/db.dart';
import 'package:stackwallet/models/models.dart';
import 'package:stackwallet/models/node_model.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/firo/firo_wallet.dart';
// import 'package:mockito/mockito.dart';
// import 'package:stackwallet/models/models.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/notes_service.dart';
import 'package:stackwallet/services/price_service.dart';
import 'package:stackwallet/services/transaction_notification_tracker.dart';
import 'package:stackwallet/services/wallets.dart';
import 'package:stackwallet/utilities/default_nodes.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
@ -111,7 +102,7 @@ void main() {
//
final title = find.text("Sent");
// final price1 = find.text("0.00");
// final price1 = find.text("0.00 USD");
final amount = find.text("1.00000000 FIRO");
final icon = find.byIcon(FeatherIcons.arrowUp);
@ -202,20 +193,12 @@ void main() {
);
final title = find.text("Receiving");
// final price1 = find.text("0.00");
final amount = find.text("1.00000000 FIRO");
//
// final icon = find.byIcon(FeatherIcons.arrowDown);
//
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(mockLocaleService.addListener(any)).called(1);
@ -229,89 +212,8 @@ void main() {
verifyNoMoreInteractions(mockLocaleService);
});
// testWidgets("bad tx displays correctly", (tester) async {
// final mockManager = MockManager();
// final mockNotesService = MockNotesService();
// final mockLocaleService = MockLocaleService();
//
// final tx = Transaction(
// txid: "some txid",
// confirmedStatus: false,
// timestamp: 1648595998,
// txType: "ahhhhhh",
// amount: 100000000,
// aliens: [],
// worthNow: "0.01",
// worthAtBlockTimestamp: "0.01",
// fees: 3794,
// inputSize: 1,
// outputSize: 1,
// inputs: [],
// outputs: [],
// address: "",
// height: null,
// subType: null,
// );
//
// when(mockManager.coinTicker).thenAnswer((_) => "FIRO");
// when(mockManager.fiatPrice).thenAnswer((_) async => Decimal.ten);
// when(mockManager.fiatCurrency).thenAnswer((_) => "USD");
//
// when(mockLocaleService.locale).thenAnswer((_) => "en_US");
//
// await tester.pumpWidget(
// MaterialApp(
// home: MultiProvider(
// providers: [
// ChangeNotifierProvider<NotesService>(
// create: (context) => mockNotesService,
// ),
// ChangeNotifierProvider<Manager>(
// create: (context) => mockManager,
// ),
// ChangeNotifierProvider<LocaleService>(
// create: (context) => mockLocaleService,
// ),
// ],
// child: TransactionCard(transaction: tx),
// ),
// ),
// );
//
// final title = find.text("Unknown");
// final price1 = find.text("0.00");
// final amount = find.text("1.00000000 FIRO");
//
// final icon = find.byIcon(Icons.warning_rounded);
//
// 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(mockNotesService.addListener(any)).called(1);
//
// verify(mockManager.fiatCurrency).called(1);
// verify(mockManager.fiatPrice).called(1);
// verify(mockManager.coinTicker).called(1);
//
// verify(mockLocaleService.locale).called(2);
//
// verifyNoMoreInteractions(mockNotesService);
// verifyNoMoreInteractions(mockManager);
// verifyNoMoreInteractions(mockLocaleService);
// });
//
testWidgets("Tap gesture", (tester) async {
final mockManager = MockManager();
final mockNotesService = MockNotesService();
final mockLocaleService = MockLocaleService();
final wallets = MockWallets();
final mockPrefs = MockPrefs();
@ -338,9 +240,6 @@ void main() {
confirmations: 10,
);
when(mockNotesService.getNoteFor(txid: "some txid"))
.thenAnswer((_) async => "some note");
final CoinServiceAPI wallet = MockFiroWallet();
when(wallet.coin.ticker).thenAnswer((_) => "FIRO");
@ -386,28 +285,18 @@ void main() {
await tester.tap(find.byType(GestureDetector));
await tester.pump();
// verify(mockManager.addListener(any)).called(1);
verify(mockLocaleService.addListener(any)).called(1);
// verify(mockNotesService.addListener(any)).called(1);
// verify(mockNotesService.getNoteFor(txid: "some txid")).called(1);
//
// verify(mockManager.fiatCurrency).called(1);
// verify(mockManager.fiatPrice).called(1);
// verify(mockManager.coinTicker).called(1);
//
// verify(mockLocaleService.locale).called(2);
//
// verifyNoMoreInteractions(mockNotesService);
// verifyNoMoreInteractions(mockManager);
// verifyNoMoreInteractions(mockLocaleService);
//
// mockingjay
// .verify(() => navigator.push(mockingjay.any(
// that:
// mockingjay.isRoute(whereName: equals("/transactionDetails"), whereArguments: equals(Tuple3(item1, item2, item3))))))
// .called(1);
verify(mockPrefs.currency).called(1);
verify(mockLocaleService.locale).called(1);
verify(wallet.coin.ticker).called(1);
// mockingjay.verifyNoMoreInteractions(navigator);
verifyNoMoreInteractions(wallet);
verifyNoMoreInteractions(mockLocaleService);
mockingjay
.verify(() => navigator.pushNamed("/transactionDetails",
arguments: Tuple3(tx, Coin.firo, "wallet id")))
.called(1);
});
}