Skip to content

Commit a47047a

Browse files
authored
MailTarget - Internal constructor with delegate as mock (#252)
1 parent bba2146 commit a47047a

3 files changed

Lines changed: 156 additions & 52 deletions

File tree

src/NLog.MailKit/MailTarget.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ namespace NLog.MailKit
8383
[Target("MailKit")]
8484
public class MailTarget : TargetWithLayoutHeaderAndFooter
8585
{
86+
private readonly Action<MimeMessage, LogEventInfo> _mailSender;
8687
private static readonly Encoding DefaultEncoding = System.Text.Encoding.UTF8;
8788
private const SecureSocketOptions DefaultSecureSocketOption = SecureSocketOptions.StartTlsWhenAvailable;
8889

@@ -95,6 +96,7 @@ public class MailTarget : TargetWithLayoutHeaderAndFooter
9596
/// The default value of the Body-Layout is: <code>${message}${newline}</code>
9697
/// </remarks>
9798
public MailTarget()
99+
:this(default(Action<MimeMessage, LogEventInfo>?))
98100
{
99101
Body = "${message}${newline}";
100102
}
@@ -111,6 +113,14 @@ public MailTarget(string name) : this()
111113
Name = name;
112114
}
113115

116+
/// <summary>
117+
/// Initializes a new instance of the <see cref="MailTarget" /> class.
118+
/// </summary>
119+
internal MailTarget(Action<MimeMessage, LogEventInfo>? mailSender)
120+
{
121+
_mailSender = mailSender ?? SendMailMessage;
122+
}
123+
114124
/// <summary>
115125
/// Gets or sets sender's email address (e.g. joe@domain.com).
116126
/// </summary>
@@ -358,7 +368,7 @@ private void ProcessSingleMailMessage(IEnumerable<AsyncLogEventInfo> events)
358368
}
359369
else
360370
{
361-
SendMailMessage(message, lastEvent);
371+
_mailSender(message, lastEvent);
362372
}
363373

364374
foreach (var ev in events)

test/NLog.MailKit.Tests/IntegrationTests/MailTargetIntegrationTests.cs

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -39,56 +39,6 @@ public void SendMailWihAuthentication()
3939
}, 1);
4040
}
4141

42-
[Fact]
43-
public void SendMailWithCC()
44-
{
45-
var transactions = SendTest(port =>
46-
{
47-
var mailTarget = CreateNLogConfig(port);
48-
mailTarget.Cc = "no reply <do_not_reply@domain.com>";
49-
}, 2);
50-
51-
// 2nd is cc
52-
AssertMailBox("do_not_reply@domain.com", transactions[0].To[1]);
53-
}
54-
55-
[Fact]
56-
public void SendMailWithPriority()
57-
{
58-
SendTest(port =>
59-
{
60-
var mailTarget = CreateNLogConfig(port);
61-
mailTarget.Priority = MimeKit.MessagePriority.Urgent.ToString();
62-
}, 1);
63-
}
64-
65-
[Fact]
66-
public void SendMailWithHeader()
67-
{
68-
SendTest(port =>
69-
{
70-
var mailTarget = CreateNLogConfig(port);
71-
mailTarget.MailHeaders.Add(new Targets.MethodCallParameter("FooHeader", ""));
72-
}, 1);
73-
}
74-
75-
[Fact]
76-
public void SendMailWithHeaderFooter()
77-
{
78-
var transactions = SendTest(port =>
79-
{
80-
var mailTarget = CreateNLogConfig(port);
81-
mailTarget.Header = " *** Begin *** ";
82-
mailTarget.Footer = " *** End *** ";
83-
}, 1);
84-
85-
var receivedMessage = transactions.LastOrDefault();
86-
Assert.NotNull(receivedMessage);
87-
var mailBody = receivedMessage.GetBodyAsString();
88-
Assert.NotNull(mailBody);
89-
Assert.Contains("*** Begin ***", mailBody);
90-
Assert.Contains("*** End ***", mailBody);
91-
}
9242

9343
[Fact]
9444
public void SendMailWitPickupFolder()

test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using MimeKit;
34
using Xunit;
45

@@ -31,7 +32,6 @@ public void ParseMessagePriorityTests(string input, MessagePriority expected)
3132
Assert.Equal(expected, result);
3233
}
3334

34-
3535
[Fact]
3636
public void MailTarget_WithEmptyTo_ThrowsConfigException()
3737
{
@@ -209,5 +209,149 @@ public void MailTargetInitialize_WithSmtpAuthenticationModeOAuth2_ThrowsConfigEx
209209
})
210210
);
211211
}
212+
213+
[Theory]
214+
[InlineData("Line 1\r\nLine 2", true)]
215+
[InlineData("Line 1\r\nLine 2", false)]
216+
[InlineData("Line 1\nLine 2", true)]
217+
[InlineData("Line 1\nLine 2", false)]
218+
[InlineData("Line 1\r\nLine 2\nLine 3", true)]
219+
[InlineData("Line 1\r\nLine 2\nLine 3", false)]
220+
public void MailTarget_ReplaceNewlineWithBrTagInHtml_ReplacesAllNewlineFormats(string body, bool replaceNewLine)
221+
{
222+
// Arrange
223+
MimeMessage sentMessage = null;
224+
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };
225+
var target = new MailTarget(mailSender)
226+
{
227+
From = "foo@bar.com",
228+
To = "bar@bar.com",
229+
Subject = "Test",
230+
SmtpServer = "does-not-matter",
231+
Body = "${message}",
232+
Html = true,
233+
ReplaceNewlineWithBrTagInHtml = replaceNewLine,
234+
};
235+
236+
// Act
237+
using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg =>
238+
{
239+
cfg.Configuration.AddRuleForAllLevels(target);
240+
}).LogFactory;
241+
var logger = logFactory.GetLogger("logger1");
242+
logger.Info(body);
243+
244+
// Assert
245+
Assert.NotNull(sentMessage);
246+
var textPart = Assert.IsType<TextPart>(sentMessage.Body);
247+
Assert.Equal(MimeKit.Text.TextFormat.Html, textPart.Format);
248+
if (replaceNewLine)
249+
{
250+
Assert.Contains("<br/>", textPart.Text);
251+
Assert.DoesNotContain("\n", textPart.Text);
252+
}
253+
else
254+
{
255+
Assert.DoesNotContain("<br/>", textPart.Text);
256+
Assert.Contains("\n", textPart.Text);
257+
}
258+
}
259+
260+
[Fact]
261+
public void SendMailWithCC()
262+
{
263+
// Arrange
264+
MimeMessage sentMessage = null;
265+
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };
266+
267+
var target = new MailTarget(mailSender)
268+
{
269+
From = "hi@unittest.com",
270+
To = "mock@mock.com",
271+
Cc = "no reply <do_not_reply@domain.com>",
272+
Subject = "Test",
273+
SmtpServer = "does-not-matter",
274+
};
275+
using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory;
276+
// Act
277+
logFactory.GetLogger("logger1").Info("hello first mail!");
278+
// Assert
279+
Assert.NotNull(sentMessage);
280+
Assert.Single(sentMessage.To);
281+
Assert.Single(sentMessage.Cc);
282+
Assert.Equal("mock@mock.com", sentMessage.To.Mailboxes.Single().Address);
283+
Assert.Equal("do_not_reply@domain.com", sentMessage.Cc.Mailboxes.Single().Address);
284+
}
285+
286+
[Fact]
287+
public void SendMailWithPriority()
288+
{
289+
// Arrange
290+
MimeMessage sentMessage = null;
291+
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };
292+
var target = new MailTarget(mailSender)
293+
{
294+
From = "hi@unittest.com",
295+
To = "mock@mock.com",
296+
Priority = MimeKit.MessagePriority.Urgent.ToString(),
297+
Subject = "Test",
298+
SmtpServer = "does-not-matter",
299+
};
300+
using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory;
301+
// Act
302+
logFactory.GetLogger("logger1").Info("hello first mail!");
303+
// Assert
304+
Assert.NotNull(sentMessage);
305+
Assert.Equal(MimeKit.MessagePriority.Urgent, sentMessage.Priority);
306+
}
307+
308+
[Fact]
309+
public void SendMailWithHeaderFooter()
310+
{
311+
// Arrange
312+
MimeMessage sentMessage = null;
313+
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };
314+
var target = new MailTarget(mailSender)
315+
{
316+
From = "hi@unittest.com",
317+
To = "mock@mock.com",
318+
Subject = "Test",
319+
Header = " *** Begin *** ",
320+
Footer = " *** End *** ",
321+
SmtpServer = "does-not-matter",
322+
};
323+
using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory;
324+
// Act
325+
logFactory.GetLogger("logger1").Info("hello first mail!");
326+
// Assert
327+
Assert.NotNull(sentMessage);
328+
var mailBody = sentMessage.Body.ToString();
329+
Assert.NotNull(mailBody);
330+
Assert.Contains("*** Begin ***", mailBody);
331+
Assert.Contains("hello first mail!", mailBody);
332+
Assert.Contains("*** End ***", mailBody);
333+
}
334+
335+
[Fact]
336+
public void SendMailWithHeaders()
337+
{
338+
// Arrange
339+
MimeMessage sentMessage = null;
340+
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };
341+
var target = new MailTarget(mailSender)
342+
{
343+
From = "hi@unittest.com",
344+
To = "mock@mock.com",
345+
Subject = "Test",
346+
SmtpServer = "does-not-matter",
347+
};
348+
target.MailHeaders.Add(new Targets.MethodCallParameter("FooHeader", "FooValue"));
349+
using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory;
350+
// Act
351+
logFactory.GetLogger("logger1").Info("hello first mail!");
352+
// Assert
353+
Assert.NotNull(sentMessage);
354+
Assert.Equal("FooValue", sentMessage.Headers["FooHeader"]);
355+
}
212356
}
213357
}

0 commit comments

Comments
 (0)