diff --git a/pubspec.yaml b/pubspec.yaml index 71feb47e2..2b5766182 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -131,6 +131,8 @@ dev_dependencies: build_runner: 2.0.5 + test: 1.16.8 + mockito: 5.0.10 hive_generator: 1.1.1 diff --git a/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart b/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart new file mode 100644 index 000000000..7875acae5 --- /dev/null +++ b/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart @@ -0,0 +1,66 @@ +import 'dart:async'; + +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:model/extensions/mailbox_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_response.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; + +import '../../../../fixtures/account_fixtures.dart'; +import '../../../../fixtures/mailbox_fixtures.dart'; +import '../../../../fixtures/state_fixtures.dart'; +import 'refresh_all_mailbox_interactor_test.mocks.dart'; + +@GenerateMocks([MailboxRepository]) +void main() { + late MailboxRepository mailboxRepository; + late RefreshAllMailboxInteractor refreshAllMailboxInteractor; + + group('[RefreshAllMailboxInteractor]', () { + + setUp(() { + mailboxRepository = MockMailboxRepository(); + refreshAllMailboxInteractor = RefreshAllMailboxInteractor(mailboxRepository); + }); + + test('refreshAllMailboxInteractor should execute to get all mailbox from cache and combine with network changed', () async { + when(mailboxRepository.refresh(AccountFixtures.aliceAccountId, StateFixtures.currentMailboxState)) + .thenAnswer((_) => Stream.fromIterable({ + MailboxResponse( + mailboxes: { + MailboxFixtures.inboxMailbox, + MailboxFixtures.sentMailbox, + MailboxFixtures.folder1, + MailboxFixtures.folder1_1 + }.toList(), + state: jmap.State('s1')) + })); + + final streamStates = refreshAllMailboxInteractor.execute(AccountFixtures.aliceAccountId, StateFixtures.currentMailboxState); + + final states = await streamStates.toList(); + + expect(states.length, equals(2)); + expect(states, containsAllInOrder({ + Right(LoadingState()), + Right(GetAllMailboxSuccess( + defaultMailboxList: { + MailboxFixtures.inboxMailbox.toPresentationMailbox(), + MailboxFixtures.sentMailbox.toPresentationMailbox() + }.toList(), + folderMailboxList: { + MailboxFixtures.folder1.toPresentationMailbox(), + MailboxFixtures.folder1_1.toPresentationMailbox() + }.toList(), + currentMailboxState: jmap.State('s1')) + ) + })); + }); + }); +} \ No newline at end of file diff --git a/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.mocks.dart b/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.mocks.dart new file mode 100644 index 000000000..e895e3147 --- /dev/null +++ b/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.mocks.dart @@ -0,0 +1,45 @@ +// Mocks generated by Mockito 5.0.10 from annotations +// in tmail_ui_user/test/features/mailbox/domain/usecases/refresh_all_mailbox_interactor_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart' as _i6; +import 'package:jmap_dart_client/jmap/core/state.dart' as _i7; +import 'package:mockito/mockito.dart' as _i1; +import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_response.dart' + as _i4; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart' + as _i2; + +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: comment_references +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis + +/// A class which mocks [MailboxRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockMailboxRepository extends _i1.Mock implements _i2.MailboxRepository { + MockMailboxRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Stream<_i4.MailboxResponse> getAllMailbox(_i5.AccountId? accountId, + {_i6.Properties? properties}) => + (super.noSuchMethod( + Invocation.method( + #getAllMailbox, [accountId], {#properties: properties}), + returnValue: Stream<_i4.MailboxResponse>.empty()) + as _i3.Stream<_i4.MailboxResponse>); + @override + _i3.Stream<_i4.MailboxResponse> refresh( + _i5.AccountId? accountId, _i7.State? currentState) => + (super.noSuchMethod( + Invocation.method(#refresh, [accountId, currentState]), + returnValue: Stream<_i4.MailboxResponse>.empty()) + as _i3.Stream<_i4.MailboxResponse>); +} diff --git a/test/features/mailbox/mock/mock_mailbox_repository.dart b/test/features/mailbox/mock/mock_mailbox_repository.dart deleted file mode 100644 index 717d8d88b..000000000 --- a/test/features/mailbox/mock/mock_mailbox_repository.dart +++ /dev/null @@ -1,4 +0,0 @@ -import 'package:mockito/mockito.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; - -class MockMailboxRepository extends Mock implements MailboxRepository {} \ No newline at end of file diff --git a/test/fixtures/account_fixtures.dart b/test/fixtures/account_fixtures.dart new file mode 100644 index 000000000..90dda2517 --- /dev/null +++ b/test/fixtures/account_fixtures.dart @@ -0,0 +1,6 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; + +class AccountFixtures { + static final aliceAccountId = AccountId(Id('411ce')); +} \ No newline at end of file diff --git a/test/fixtures/mailbox_fixtures.dart b/test/fixtures/mailbox_fixtures.dart new file mode 100644 index 000000000..42cc2723f --- /dev/null +++ b/test/fixtures/mailbox_fixtures.dart @@ -0,0 +1,98 @@ +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox_rights.dart'; + +class MailboxFixtures { + static final inboxMailbox = Mailbox( + MailboxId(Id('1')), + MailboxName('Inbox'), + null, + Role('inbox'), + SortOrder(sortValue: 10), + TotalEmails(UnsignedInt(2758)), + UnreadEmails(UnsignedInt(34)), + TotalThreads(UnsignedInt(2758)), + UnreadThreads(UnsignedInt(34)), + MailboxRights( + true, + true, + true, + true, + true, + true, + true, + true, + true), + IsSubscribed(true) + ); + + static final sentMailbox = Mailbox( + MailboxId(Id('2')), + MailboxName('Sent'), + null, + Role('sent'), + SortOrder(sortValue: 3), + TotalEmails(UnsignedInt(123)), + UnreadEmails(UnsignedInt(12)), + TotalThreads(UnsignedInt(123)), + UnreadThreads(UnsignedInt(12)), + MailboxRights( + true, + true, + true, + true, + true, + true, + true, + true, + true), + IsSubscribed(true) + ); + + static final folder1 = Mailbox( + MailboxId(Id('b1')), + MailboxName('folder 1'), + null, + null, + SortOrder(sortValue: 1000), + TotalEmails(UnsignedInt(123)), + UnreadEmails(UnsignedInt(12)), + TotalThreads(UnsignedInt(123)), + UnreadThreads(UnsignedInt(12)), + MailboxRights( + true, + true, + true, + true, + true, + true, + true, + true, + true), + IsSubscribed(true) + ); + + static final folder1_1 = Mailbox( + MailboxId(Id('b11')), + MailboxName('folder 1_1'), + MailboxId(Id("b1")), + null, + SortOrder(sortValue: 1000), + TotalEmails(UnsignedInt(123)), + UnreadEmails(UnsignedInt(12)), + TotalThreads(UnsignedInt(123)), + UnreadThreads(UnsignedInt(12)), + MailboxRights( + true, + true, + true, + true, + true, + true, + true, + true, + true), + IsSubscribed(true) + ); +} diff --git a/test/fixtures/state_fixtures.dart b/test/fixtures/state_fixtures.dart new file mode 100644 index 000000000..19a6e1004 --- /dev/null +++ b/test/fixtures/state_fixtures.dart @@ -0,0 +1,6 @@ + +import 'package:jmap_dart_client/jmap/core/state.dart'; + +class StateFixtures { + static final currentMailboxState = State('a1234'); +} \ No newline at end of file