diff --git a/test/ui/edit_delete_user/view/edit_delete_user_view_test.dart b/test/ui/edit_delete_user/view/edit_delete_user_view_test.dart new file mode 100644 index 0000000..1a1b05f --- /dev/null +++ b/test/ui/edit_delete_user/view/edit_delete_user_view_test.dart @@ -0,0 +1,77 @@ +import 'package:aranduapp/core/network/token_manager/model/user_model.dart'; +import 'package:aranduapp/core/state/command.dart'; +import 'package:aranduapp/ui/edit_delete_user/view/edit_delete_user_view.dart'; +import 'package:aranduapp/ui/edit_delete_user/viewmode/edit_delte_user_viewmodel.dart'; +import 'package:aranduapp/ui/login/view/login_view.dart'; +import 'package:aranduapp/ui/login/viewmodel/login_viewmodel.dart'; +import 'package:aranduapp/ui/shared/command_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'edit_delete_user_view_test.mocks.dart'; + +@GenerateNiceMocks([MockSpec(), MockSpec()]) + +void main(){ + late MockEditDelteUserViewmodel mockEditDelteUserViewmodel; + late MockCommand0 mockdeleteUserCommand0; + + //final user = UserModel(id: '123456789', name: 'usertest', userName: 'usertest2', email: 'usertest@gmail.com', role: 'estudante'); + + setUp(() async { + mockEditDelteUserViewmodel = MockEditDelteUserViewmodel(); + mockdeleteUserCommand0 = MockCommand0(); + + when(mockEditDelteUserViewmodel.deleteUserCommand).thenReturn(mockdeleteUserCommand0); + + + when(mockdeleteUserCommand0.running).thenReturn(false); + when(mockdeleteUserCommand0.isError).thenReturn(false); + when(mockdeleteUserCommand0.isOk).thenReturn(false); + + await GetIt.instance.reset(); + GetIt.I.registerLazySingleton( + () => mockEditDelteUserViewmodel); + GetIt.I.registerLazySingleton(() => LoginViewModel()); + }); + + Widget createScreen() { + return const MaterialApp( + home: EditDeleteUser(), + ); + } + + testWidgets('Edit delete user screen display', (WidgetTester tester) async{ + await tester.pumpWidget(createScreen()); + await tester.pumpAndSettle(); + + expect(find.text('Tem certeza de que deseja excluir sua conta? Essa ação não pode ser desfeita.'), findsOneWidget); + expect(find.byType(CommandButton), findsOneWidget); + }); + + testWidgets('checks if when pressing the button is success', (WidgetTester tester) async{ + //when(mockEditDelteUserViewmodel.deleteUserCommand.isOk).thenReturn(true); + + await tester.pumpWidget(createScreen()); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Deletar')); + await tester.pump(); + + verify(mockdeleteUserCommand0.execute()).called(1); + + }); + + testWidgets('navigates to Login after successful delete', (WidgetTester tester) async { + when(mockdeleteUserCommand0.isOk).thenReturn(true); + + await tester.pumpWidget(createScreen()); + await tester.pumpAndSettle(); + + expect(find.byType(Login), findsOneWidget); + }); + +} \ No newline at end of file diff --git a/test/ui/edit_delete_user/view/edit_delete_user_view_test.mocks.dart b/test/ui/edit_delete_user/view/edit_delete_user_view_test.mocks.dart new file mode 100644 index 0000000..5b62e9a --- /dev/null +++ b/test/ui/edit_delete_user/view/edit_delete_user_view_test.mocks.dart @@ -0,0 +1,224 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in aranduapp/test/ui/edit_delete_user/view/edit_delete_user_view_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i6; +import 'dart:ui' as _i5; + +import 'package:aranduapp/core/state/command.dart' as _i2; +import 'package:aranduapp/ui/edit_delete_user/viewmode/edit_delte_user_viewmodel.dart' + as _i4; +import 'package:async/async.dart' as _i3; +import 'package:mockito/mockito.dart' as _i1; + +// 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: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// 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 _FakeCommand0_0 extends _i1.SmartFake implements _i2.Command0 { + _FakeCommand0_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeResult_1 extends _i1.SmartFake implements _i3.Result { + _FakeResult_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [EditDelteUserViewmodel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockEditDelteUserViewmodel extends _i1.Mock + implements _i4.EditDelteUserViewmodel { + @override + _i2.Command0 get deleteUserCommand => (super.noSuchMethod( + Invocation.getter(#deleteUserCommand), + returnValue: _FakeCommand0_0( + this, + Invocation.getter(#deleteUserCommand), + ), + returnValueForMissingStub: _FakeCommand0_0( + this, + Invocation.getter(#deleteUserCommand), + ), + ) as _i2.Command0); + + @override + set deleteUserCommand(_i2.Command0? _deleteUserCommand) => + super.noSuchMethod( + Invocation.setter( + #deleteUserCommand, + _deleteUserCommand, + ), + returnValueForMissingStub: null, + ); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void addListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i5.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 [Command0]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCommand0 extends _i1.Mock implements _i2.Command0 { + @override + _i6.Future<_i3.Result> Function() get action => (super.noSuchMethod( + Invocation.getter(#action), + returnValue: () => _i6.Future<_i3.Result>.value(_FakeResult_1( + this, + Invocation.getter(#action), + )), + returnValueForMissingStub: () => + _i6.Future<_i3.Result>.value(_FakeResult_1( + this, + Invocation.getter(#action), + )), + ) as _i6.Future<_i3.Result> Function()); + + @override + bool get isError => (super.noSuchMethod( + Invocation.getter(#isError), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get isOk => (super.noSuchMethod( + Invocation.getter(#isOk), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get running => (super.noSuchMethod( + Invocation.getter(#running), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i6.Future<_i3.Result> execute() => (super.noSuchMethod( + Invocation.method( + #execute, + [], + ), + returnValue: _i6.Future<_i3.Result>.value(_FakeResult_1( + this, + Invocation.method( + #execute, + [], + ), + )), + returnValueForMissingStub: + _i6.Future<_i3.Result>.value(_FakeResult_1( + this, + Invocation.method( + #execute, + [], + ), + )), + ) as _i6.Future<_i3.Result>); + + @override + void addListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i5.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, + ); +} diff --git a/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.dart b/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.dart new file mode 100644 index 0000000..cdaa4a2 --- /dev/null +++ b/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.dart @@ -0,0 +1,59 @@ +import 'package:aranduapp/core/network/token_manager/model/user_model.dart'; +import 'package:aranduapp/core/network/token_manager/repository/auth_repository.dart'; +import 'package:aranduapp/core/network/token_manager/service/auth_service.dart'; +import 'package:aranduapp/ui/edit_delete_user/service/edit_delete_user_service.dart'; +import 'package:aranduapp/ui/edit_delete_user/viewmode/edit_delte_user_viewmodel.dart'; +import 'package:async/async.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'edit_delete_user_viewmodel_test.mocks.dart'; + +@GenerateNiceMocks([MockSpec(), MockSpec()]) + +void main(){ + TestWidgetsFlutterBinding.ensureInitialized(); + late MockEditDeleteUserService mockEditDeleteUserService; + late MockAuthRepository mockAuthRepository; + late EditDelteUserViewmodel editDelteUserViewmodel; + + final user = UserModel(id: '123456789', name: 'usertest', userName: 'usertest2', email: 'usertest@gmail.com', role: 'estudante'); + + setUp(() async { + editDelteUserViewmodel = EditDelteUserViewmodel(); + mockEditDeleteUserService = MockEditDeleteUserService(); + mockAuthRepository = MockAuthRepository(); // Criando mock + + await GetIt.instance.reset(); + GetIt.I.registerLazySingleton(() => mockAuthRepository); + GetIt.I.registerLazySingleton(() => mockEditDeleteUserService); + + }); + + test('delete user should return isOk if service return success', () async { + + when(mockAuthRepository.getUser()).thenAnswer((_) async => user); + + when(mockEditDeleteUserService.deleteUser(user.id)) + .thenAnswer((_) async => Result.value(null)); + + await editDelteUserViewmodel.deleteUserCommand.execute(); + + expect(editDelteUserViewmodel.deleteUserCommand.isOk, isTrue); + verify(mockEditDeleteUserService.deleteUser(user.id)).called(1); + }); + + test('delete user should return error if service fails', () async{ + when(mockAuthRepository.getUser()).thenAnswer((_) async => user); + + when(mockEditDeleteUserService.deleteUser(user.id)) + .thenThrow(Exception('Failed to delete user')); + + await editDelteUserViewmodel.deleteUserCommand.execute(); + + expect(editDelteUserViewmodel.deleteUserCommand.isError, isTrue); + verify(mockEditDeleteUserService.deleteUser(user.id)).called(1); + }); +} \ No newline at end of file diff --git a/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.mocks.dart b/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.mocks.dart new file mode 100644 index 0000000..104d04a --- /dev/null +++ b/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.mocks.dart @@ -0,0 +1,91 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in aranduapp/test/ui/edit_delete_user/viewmodel/edit_delete_user_viewmodel_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:aranduapp/core/network/token_manager/model/user_model.dart' + as _i2; +import 'package:aranduapp/core/network/token_manager/repository/auth_repository.dart' + as _i3; +import 'package:aranduapp/ui/edit_delete_user/service/edit_delete_user_service.dart' + as _i5; +import 'package:mockito/mockito.dart' as _i1; + +// 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: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// 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 _FakeUserModel_0 extends _i1.SmartFake implements _i2.UserModel { + _FakeUserModel_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i3.AuthRepository { + @override + _i4.Future<_i2.UserModel> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i4.Future<_i2.UserModel>.value(_FakeUserModel_0( + this, + Invocation.method( + #getUser, + [], + ), + )), + returnValueForMissingStub: + _i4.Future<_i2.UserModel>.value(_FakeUserModel_0( + this, + Invocation.method( + #getUser, + [], + ), + )), + ) as _i4.Future<_i2.UserModel>); + + @override + _i4.Future clearUser() => (super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); +} + +/// A class which mocks [EditDeleteUserService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockEditDeleteUserService extends _i1.Mock + implements _i5.EditDeleteUserService { + @override + _i4.Future deleteUser(String? idUser) => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [idUser], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); +}