66
77namespace PosInformatique . Foundations . Emailing . Tests
88{
9+ using System . Reflection ;
910 using Microsoft . Extensions . Options ;
1011 using PosInformatique . Foundations . EmailAddresses ;
1112 using PosInformatique . Foundations . MediaTypes ;
@@ -130,16 +131,11 @@ public async Task SendAsync()
130131 var emailAddressRecipient1 = EmailAddress . Parse ( "email1@domain.com" ) ;
131132 var emailAddressRecipient2 = EmailAddress . Parse ( "email2@domain.com" ) ;
132133
133- var content1 = new Mock < Stream > ( MockBehavior . Strict ) ;
134- content1 . Setup ( c => c . CanRead )
135- . Returns ( true ) ;
134+ var content1 = new MemoryStream ( [ 1 , 2 ] ) ;
135+ var content2 = new MemoryStream ( [ 3 , 4 ] ) ;
136136
137- var content2 = new Mock < Stream > ( MockBehavior . Strict ) ;
138- content2 . Setup ( c => c . CanRead )
139- . Returns ( true ) ;
140-
141- var attachment1 = new EmailAttachment ( "Attachment1" , MimeTypes . Application . Pdf , content1 . Object ) ;
142- var attachment2 = new EmailAttachment ( "Attachment2" , MimeTypes . Application . Docx , content2 . Object ) ;
137+ var attachment1 = new EmailAttachment ( "Attachment1" , MimeTypes . Application . Pdf , content1 ) ;
138+ var attachment2 = new EmailAttachment ( "Attachment2" , MimeTypes . Application . Docx , content2 ) ;
143139
144140 var email = new Email < Model > ( template )
145141 {
@@ -161,38 +157,66 @@ public async Task SendAsync()
161157 var options = new EmailingOptions ( ) ;
162158 options . SenderEmailAddress = sender ;
163159
160+ var contentStreams = new List < Stream > ( ) ;
161+
164162 var provider = new Mock < IEmailProvider > ( MockBehavior . Strict ) ;
165163 provider . Setup ( p => p . SendAsync ( It . Is < EmailMessage > ( m => m . To . Email == emailAddressRecipient1 ) , cancellationToken ) )
166164 . Callback ( ( EmailMessage m , CancellationToken _ ) =>
167165 {
168- m . Attachments . Should ( ) . Equal ( attachment1 , attachment2 ) ;
166+ m . Attachments [ 0 ] . Content . As < MemoryStream > ( ) . Position . Should ( ) . Be ( 0 ) ;
167+ m . Attachments [ 0 ] . Content . As < MemoryStream > ( ) . ToArray ( ) . Should ( ) . Equal ( 1 , 2 ) ;
168+ m . Attachments [ 0 ] . ContentType . Should ( ) . Be ( MimeTypes . Application . Pdf ) ;
169+ m . Attachments [ 0 ] . FileName . Should ( ) . Be ( "Attachment1" ) ;
170+ m . Attachments [ 1 ] . Content . As < MemoryStream > ( ) . Position . Should ( ) . Be ( 0 ) ;
171+ m . Attachments [ 1 ] . Content . As < MemoryStream > ( ) . ToArray ( ) . Should ( ) . Equal ( 3 , 4 ) ;
172+ m . Attachments [ 1 ] . ContentType . Should ( ) . Be ( MimeTypes . Application . Docx ) ;
173+ m . Attachments [ 1 ] . FileName . Should ( ) . Be ( "Attachment2" ) ;
169174 m . From . Email . Should ( ) . BeSameAs ( sender ) ;
170175 m . From . DisplayName . Should ( ) . BeEmpty ( ) ;
171176 m . Importance . Should ( ) . Be ( EmailImportance . High ) ;
172177 m . Subject . Should ( ) . Be ( "Subject 1" ) ;
173178 m . HtmlContent . Should ( ) . Be ( "HTML Content 1" ) ;
174179 m . To . DisplayName . Should ( ) . Be ( "The display name 1" ) ;
180+
181+ contentStreams . Add ( m . Attachments [ 0 ] . Content ) ;
182+ contentStreams . Add ( m . Attachments [ 1 ] . Content ) ;
175183 } )
176184 . Returns ( Task . CompletedTask ) ;
177185 provider . Setup ( p => p . SendAsync ( It . Is < EmailMessage > ( m => m . To . Email == emailAddressRecipient2 ) , cancellationToken ) )
178186 . Callback ( ( EmailMessage m , CancellationToken _ ) =>
179187 {
180- m . Attachments . Should ( ) . Equal ( attachment1 , attachment2 ) ;
188+ m . Attachments [ 0 ] . Content . As < MemoryStream > ( ) . Position . Should ( ) . Be ( 0 ) ;
189+ m . Attachments [ 0 ] . Content . As < MemoryStream > ( ) . ToArray ( ) . Should ( ) . Equal ( 1 , 2 ) ;
190+ m . Attachments [ 0 ] . ContentType . Should ( ) . Be ( MimeTypes . Application . Pdf ) ;
191+ m . Attachments [ 0 ] . FileName . Should ( ) . Be ( "Attachment1" ) ;
192+ m . Attachments [ 1 ] . Content . As < MemoryStream > ( ) . Position . Should ( ) . Be ( 0 ) ;
193+ m . Attachments [ 1 ] . Content . As < MemoryStream > ( ) . ToArray ( ) . Should ( ) . Equal ( 3 , 4 ) ;
194+ m . Attachments [ 1 ] . ContentType . Should ( ) . Be ( MimeTypes . Application . Docx ) ;
195+ m . Attachments [ 1 ] . FileName . Should ( ) . Be ( "Attachment2" ) ;
181196 m . From . Email . Should ( ) . BeSameAs ( sender ) ;
182197 m . From . DisplayName . Should ( ) . BeEmpty ( ) ;
183198 m . Importance . Should ( ) . Be ( EmailImportance . High ) ;
184199 m . Subject . Should ( ) . Be ( "Subject 2" ) ;
185200 m . HtmlContent . Should ( ) . Be ( "HTML Content 2" ) ;
186201 m . To . DisplayName . Should ( ) . Be ( "The display name 2" ) ;
202+
203+ contentStreams . Add ( m . Attachments [ 0 ] . Content ) ;
204+ contentStreams . Add ( m . Attachments [ 1 ] . Content ) ;
187205 } )
188206 . Returns ( Task . CompletedTask ) ;
189207
190208 var manager = new EmailManager ( Options . Create ( options ) , provider . Object , serviceProvider ) ;
191209
192210 await manager . SendAsync ( email , cancellationToken ) ;
193211
194- content1 . VerifyAll ( ) ;
195- content2 . VerifyAll ( ) ;
212+ foreach ( var contentStream in contentStreams )
213+ {
214+ IsOpen ( contentStream ) . Should ( ) . BeFalse ( ) ;
215+ }
216+
217+ IsOpen ( email . Attachments [ 0 ] . Content ) . Should ( ) . BeTrue ( ) ;
218+ IsOpen ( email . Attachments [ 1 ] . Content ) . Should ( ) . BeTrue ( ) ;
219+
196220 htmlBody . VerifyAll ( ) ;
197221 provider . VerifyAll ( ) ;
198222 subject . VerifyAll ( ) ;
@@ -211,6 +235,13 @@ await manager.Invoking(m => m.SendAsync<Model>(null, default))
211235 . WithParameterName ( "email" ) ;
212236 }
213237
238+ private static bool IsOpen ( Stream stream )
239+ {
240+ var fieldIsOpen = typeof ( MemoryStream ) . GetField ( "_isOpen" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
241+
242+ return ( bool ) fieldIsOpen . GetValue ( stream ) ;
243+ }
244+
214245 internal sealed class Model
215246 {
216247 }
0 commit comments