From 8652f4b90ae1b44f0ec5738cc1d3b00f0f8ac813 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Thu, 14 Sep 2023 15:23:30 +0600 Subject: [PATCH] Add sample how to use inside unit tests --- Examples/SampleTests/SampleMailClient.cs | 46 ++++++++++++++++++++ Examples/SampleTests/SampleTests.csproj | 23 ++++++++++ Examples/SampleTests/SendingEmailTests.cs | 51 +++++++++++++++++++++++ Examples/SampleTests/Usings.cs | 1 + Src/SmtpServer.sln | 11 ++++- 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 Examples/SampleTests/SampleMailClient.cs create mode 100644 Examples/SampleTests/SampleTests.csproj create mode 100644 Examples/SampleTests/SendingEmailTests.cs create mode 100644 Examples/SampleTests/Usings.cs diff --git a/Examples/SampleTests/SampleMailClient.cs b/Examples/SampleTests/SampleMailClient.cs new file mode 100644 index 0000000..ae66c16 --- /dev/null +++ b/Examples/SampleTests/SampleMailClient.cs @@ -0,0 +1,46 @@ +using MailKit.Net.Smtp; +using MimeKit; + +namespace SampleTests; + +public static class SampleMailClient +{ + public static void Send( + string from = null, + string to = null, + string subject = null, + string user = null, + string password = null, + MimeEntity body = null, + int count = 1, + bool useSsl = false, + int port = 9025) + { + //var message = MimeMessage.Load(@"C:\Dev\Cain\Temp\message.eml"); + var message = new MimeMessage(); + + message.From.Add(MailboxAddress.Parse(from ?? "from@sample.com")); + message.To.Add(MailboxAddress.Parse(to ?? "to@sample.com")); + message.Subject = subject ?? "Hello"; + message.Body = body ?? new TextPart("plain") + { + Text = "Hello World" + }; + + using var client = new SmtpClient(); + + client.Connect("localhost", port, useSsl); + + if (user != null && password != null) + { + client.Authenticate(user, password); + } + + while (count-- > 0) + { + client.Send(message); + } + + client.Disconnect(true); + } +} \ No newline at end of file diff --git a/Examples/SampleTests/SampleTests.csproj b/Examples/SampleTests/SampleTests.csproj new file mode 100644 index 0000000..bbd4951 --- /dev/null +++ b/Examples/SampleTests/SampleTests.csproj @@ -0,0 +1,23 @@ + + + + net6.0 + enable + enable + + false + + + + + + + + + + + + + + + diff --git a/Examples/SampleTests/SendingEmailTests.cs b/Examples/SampleTests/SendingEmailTests.cs new file mode 100644 index 0000000..e901841 --- /dev/null +++ b/Examples/SampleTests/SendingEmailTests.cs @@ -0,0 +1,51 @@ +using SmtpServer; +using SmtpServer.ComponentModel; +using SmtpServer.Tests.Mocks; + +namespace SampleTests +{ + [TestClass] + public class SendingEmailTests + { + MockMessageStore TestMessageStore = new MockMessageStore(); + + [TestMethod] + public void SendEmail() + { + // Arrange + var cancellationTokenSource = new CancellationTokenSource(); + + var options = new SmtpServerOptionsBuilder() + .ServerName("SmtpServer SampleApp") + .Port(25) + .Build(); + + var serviceProvider = new ServiceProvider(); + serviceProvider.Add(TestMessageStore); + + var server = new SmtpServer.SmtpServer(options, serviceProvider); + var serverTask = server.StartAsync(cancellationTokenSource.Token); + + // Act + SampleMailClient.Send(port: 25); + + // Assert + cancellationTokenSource.Cancel(); + try + { + serverTask.Wait(); + } + catch (AggregateException e) + { + e.Handle(exception => exception is OperationCanceledException); + } + + Assert.AreEqual(1, this.TestMessageStore.Messages.Count); + var message = this.TestMessageStore.Messages.First(); + Assert.AreEqual(1, message.MimeMessage.From.Count); + var fromAddress = message.MimeMessage.From.Mailboxes.Single(); + Assert.AreEqual("", fromAddress.Name); + Assert.AreEqual("from@sample.com", fromAddress.Address); + } + } +} \ No newline at end of file diff --git a/Examples/SampleTests/Usings.cs b/Examples/SampleTests/Usings.cs new file mode 100644 index 0000000..ab67c7e --- /dev/null +++ b/Examples/SampleTests/Usings.cs @@ -0,0 +1 @@ +global using Microsoft.VisualStudio.TestTools.UnitTesting; \ No newline at end of file diff --git a/Src/SmtpServer.sln b/Src/SmtpServer.sln index 56ec235..ff39130 100644 --- a/Src/SmtpServer.sln +++ b/Src/SmtpServer.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34004.107 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmtpServer", "SmtpServer\SmtpServer.csproj", "{0A7CFC3D-305C-4018-9052-3A7A8B5DD104}" EndProject @@ -15,6 +15,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{6B EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleApp", "..\Examples\SampleApp\SampleApp.csproj", "{DB671922-7280-4854-9C4F-0BA073B5F1E2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleTests", "..\Examples\SampleTests\SampleTests.csproj", "{121B7063-DB75-48E2-86B4-9B2956C9A12C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,10 @@ Global {DB671922-7280-4854-9C4F-0BA073B5F1E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {DB671922-7280-4854-9C4F-0BA073B5F1E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {DB671922-7280-4854-9C4F-0BA073B5F1E2}.Release|Any CPU.Build.0 = Release|Any CPU + {121B7063-DB75-48E2-86B4-9B2956C9A12C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {121B7063-DB75-48E2-86B4-9B2956C9A12C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {121B7063-DB75-48E2-86B4-9B2956C9A12C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {121B7063-DB75-48E2-86B4-9B2956C9A12C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -48,6 +54,7 @@ Global GlobalSection(NestedProjects) = preSolution {EE0C474F-8404-4FB6-865F-A034B5DB77FE} = {6BAD2430-FA6B-4929-8BD7-66663CA02207} {DB671922-7280-4854-9C4F-0BA073B5F1E2} = {6BAD2430-FA6B-4929-8BD7-66663CA02207} + {121B7063-DB75-48E2-86B4-9B2956C9A12C} = {6BAD2430-FA6B-4929-8BD7-66663CA02207} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3050CFB6-1836-4A06-8AA4-C9E75A9B9147}