TF-2628 Create states & interactor for viewing attachment for web
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
|
||||
class StartViewAttachmentForWeb extends StartDownloadAttachmentForWeb {
|
||||
StartViewAttachmentForWeb(super.taskId, super.attachment);
|
||||
}
|
||||
|
||||
class ViewingAttachmentForWeb extends DownloadingAttachmentForWeb {
|
||||
ViewingAttachmentForWeb(
|
||||
super.taskId,
|
||||
super.attachment,
|
||||
super.progress,
|
||||
super.downloaded,
|
||||
super.total,
|
||||
);
|
||||
}
|
||||
|
||||
class ViewAttachmentForWebSuccess extends DownloadAttachmentForWebSuccess {
|
||||
ViewAttachmentForWebSuccess(super.taskId, super.attachment, super.bytes);
|
||||
}
|
||||
|
||||
class ViewAttachmentForWebFailure extends DownloadAttachmentForWebFailure {
|
||||
ViewAttachmentForWebFailure({super.taskId, super.exception});
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:model/download/download_task_id.dart';
|
||||
import 'package:model/email/attachment.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
|
||||
|
||||
class ViewAttachmentForWebInteractor {
|
||||
ViewAttachmentForWebInteractor(this._downloadAttachmentForWebInteractor);
|
||||
|
||||
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
DownloadTaskId taskId,
|
||||
Attachment attachment,
|
||||
AccountId accountId,
|
||||
String baseDownloadUrl,
|
||||
StreamController<Either<Failure, Success>> onReceiveController,
|
||||
) =>
|
||||
_downloadAttachmentForWebInteractor
|
||||
.execute(
|
||||
taskId,
|
||||
attachment,
|
||||
accountId,
|
||||
baseDownloadUrl,
|
||||
onReceiveController)
|
||||
.map(
|
||||
(result) => result.fold(
|
||||
(failure) {
|
||||
if (failure is DownloadAttachmentForWebFailure) {
|
||||
return Left(ViewAttachmentForWebFailure(
|
||||
taskId: failure.taskId,
|
||||
exception: failure.exception,
|
||||
));
|
||||
}
|
||||
|
||||
return Left(failure);
|
||||
},
|
||||
(success) {
|
||||
if (success is StartDownloadAttachmentForWeb) {
|
||||
return Right(StartViewAttachmentForWeb(
|
||||
success.taskId,
|
||||
success.attachment,
|
||||
));
|
||||
}
|
||||
|
||||
if (success is DownloadingAttachmentForWeb) {
|
||||
return Right(ViewingAttachmentForWeb(
|
||||
success.taskId,
|
||||
success.attachment,
|
||||
success.progress,
|
||||
success.downloaded,
|
||||
success.total,
|
||||
));
|
||||
}
|
||||
|
||||
if (success is DownloadAttachmentForWebSuccess) {
|
||||
return Right(ViewAttachmentForWebSuccess(
|
||||
success.taskId,
|
||||
success.attachment,
|
||||
success.bytes,
|
||||
));
|
||||
}
|
||||
|
||||
return Right(success);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:model/download/download_task_id.dart';
|
||||
import 'package:model/email/attachment.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/view_attachment_for_web_interactor.dart';
|
||||
|
||||
import 'view_attachment_for_web_interactor_test.mocks.dart';
|
||||
|
||||
@GenerateNiceMocks([
|
||||
MockSpec<DownloadAttachmentForWebInteractor>(),
|
||||
MockSpec<Failure>(),
|
||||
MockSpec<Success>(),
|
||||
])
|
||||
void main() {
|
||||
final testDownloadAttachmentForWebInteractor =
|
||||
MockDownloadAttachmentForWebInteractor();
|
||||
final viewAttachmentForWebInteractor =
|
||||
ViewAttachmentForWebInteractor(testDownloadAttachmentForWebInteractor);
|
||||
|
||||
final testDownloadTaskId = DownloadTaskId('123');
|
||||
final testAttachment = Attachment();
|
||||
final testAccountId = AccountId(Id('id'));
|
||||
final testException = TimeoutException('321');
|
||||
const testBaseDownloadUrl = 'base_download_url';
|
||||
final testReceiveController = StreamController<Either<Failure, Success>>();
|
||||
final testFailure = MockFailure();
|
||||
final testSuccess = MockSuccess();
|
||||
final testBytes = Uint8List(12);
|
||||
|
||||
group('View attachment for web interactor', () {
|
||||
test(
|
||||
'should yield ViewAttachmentForWebFailure '
|
||||
'when downloadAttachmentForWebInteractor yield DownloadAttachmentForWebFailure',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer(
|
||||
(_) => Stream.value(
|
||||
Left(
|
||||
DownloadAttachmentForWebFailure(
|
||||
taskId: testDownloadTaskId,
|
||||
exception: testException,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([
|
||||
Left(
|
||||
ViewAttachmentForWebFailure(
|
||||
taskId: testDownloadTaskId,
|
||||
exception: testException,
|
||||
),
|
||||
)
|
||||
]),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'should yield Failure '
|
||||
'when downloadAttachmentForWebInteractor doesn\'t yield DownloadAttachmentForWebFailure',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer((_) => Stream.value(Left(testFailure)));
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([Left(testFailure)]),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'should yield StartViewAttachmentForWeb '
|
||||
'when downloadAttachmentForWebInteractor yield StartDownloadAttachmentForWeb',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer((_) => Stream.value(
|
||||
Right(StartDownloadAttachmentForWeb(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
)),
|
||||
));
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([
|
||||
Right(StartViewAttachmentForWeb(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
))
|
||||
]),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'should yield ViewingAttachmentForWeb '
|
||||
'when downloadAttachmentForWebInteractor yield DownloadingAttachmentForWeb',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer(
|
||||
(_) => Stream.fromIterable([
|
||||
Right(DownloadingAttachmentForWeb(testDownloadTaskId, testAttachment, 0.5, 1, 2)),
|
||||
Right(DownloadingAttachmentForWeb(testDownloadTaskId, testAttachment, 1, 1, 2)),
|
||||
Right(DownloadingAttachmentForWeb(testDownloadTaskId, testAttachment, 1, 2, 2)),
|
||||
]),
|
||||
);
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([
|
||||
Right(ViewingAttachmentForWeb(testDownloadTaskId, testAttachment, 0.5, 1, 2)),
|
||||
Right(ViewingAttachmentForWeb(testDownloadTaskId, testAttachment, 1, 1, 2)),
|
||||
Right(ViewingAttachmentForWeb(testDownloadTaskId, testAttachment, 1, 2, 2)),
|
||||
]),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'should yield ViewAttachmentForWebSuccess '
|
||||
'when downloadAttachmentForWebInteractor yield DownloadAttachmentForWebSuccess',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer((_) => Stream.value(
|
||||
Right(DownloadAttachmentForWebSuccess(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testBytes,
|
||||
)),
|
||||
));
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([
|
||||
Right(ViewAttachmentForWebSuccess(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testBytes,
|
||||
)),
|
||||
]),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'should yield Success '
|
||||
'when downloadAttachmentForWebInteractor yield state doesn\'t match any of the above',
|
||||
() {
|
||||
// arrange
|
||||
when(testDownloadAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
)).thenAnswer((_) => Stream.value(Right(testSuccess)));
|
||||
|
||||
// assert
|
||||
expect(
|
||||
viewAttachmentForWebInteractor.execute(
|
||||
testDownloadTaskId,
|
||||
testAttachment,
|
||||
testAccountId,
|
||||
testBaseDownloadUrl,
|
||||
testReceiveController,
|
||||
),
|
||||
emitsInOrder([Right(testSuccess)]),
|
||||
);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user