diff --git a/model/lib/email/attachment.dart b/model/lib/email/attachment.dart index 4a8c690ee6..90b727089a 100644 --- a/model/lib/email/attachment.dart +++ b/model/lib/email/attachment.dart @@ -49,7 +49,7 @@ class Attachment with EquatableMixin { 'name' : name ?? '', 'type' : type?.mimeType ?? '', }); - return Uri.decodeFull(downloadUri); + return downloadUri; } String generateFileName() { diff --git a/model/test/email/attachment_test.dart b/model/test/email/attachment_test.dart new file mode 100644 index 0000000000..b4f43a0024 --- /dev/null +++ b/model/test/email/attachment_test.dart @@ -0,0 +1,67 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:model/email/attachment.dart'; + +void main() { + final accountId = AccountId(Id('1')); + const baseDownloadUrl = 'http://localhost/download/{accountId}/{blobId}/{name}?name={name}&type={type}'; + + group('attachment test:', () { + group('getDownloadUrl:', () { + test( + 'should return download url with blobId, name and type', + () { + // arrange + final attachment = Attachment( + blobId: Id('some-blob-id'), + name: 'some-name', + type: MediaType.parse('application/octet-stream'), + ); + + // act + final result = attachment.getDownloadUrl(baseDownloadUrl, accountId); + + // assert + expect(result, 'http://localhost/download/1/some-blob-id/some-name?name=some-name&type=application%2Foctet-stream'); + }); + + test( + 'should return download url with blobId, name and type ' + 'when attachment name contains question mark character', + () { + // arrange + final attachment = Attachment( + blobId: Id('some-blob-id'), + name: 'some-name?', + type: MediaType.parse('application/octet-stream'), + ); + + // act + final result = attachment.getDownloadUrl(baseDownloadUrl, accountId); + + // assert + expect(result, 'http://localhost/download/1/some-blob-id/some-name%3F?name=some-name%3F&type=application%2Foctet-stream'); + }); + + test( + 'should return download url with blobId, name and type ' + 'when attachment name is Vietnamese', + () { + // arrange + final attachment = Attachment( + blobId: Id('some-blob-id'), + name: 'tiêu đề attachment', + type: MediaType.parse('application/octet-stream'), + ); + + // act + final result = attachment.getDownloadUrl(baseDownloadUrl, accountId); + + // assert + expect(result, 'http://localhost/download/1/some-blob-id/ti%C3%AAu%20%C4%91%E1%BB%81%20attachment?name=ti%C3%AAu%20%C4%91%E1%BB%81%20attachment&type=application%2Foctet-stream'); + }); + }); + }); +} \ No newline at end of file