From a107ae58a4ff24e0a32e6e9625e7e77ae9f2931e Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Sun, 1 Mar 2020 13:27:52 +0200 Subject: [PATCH 1/7] Add MessageStream to Sending API --- src/Postmark.Tests/ClientTemplateTests.cs | 4 ++-- src/Postmark/Model/PostmarkMessage.cs | 5 +++-- src/Postmark/Model/PostmarkMessageBase.cs | 10 ++++++++++ src/Postmark/PostmarkClient.cs | 8 ++++++-- src/Postmark/PostmarkClientExtensions.cs | 11 ++++++----- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/Postmark.Tests/ClientTemplateTests.cs b/src/Postmark.Tests/ClientTemplateTests.cs index 145ab9f..f7e704c 100644 --- a/src/Postmark.Tests/ClientTemplateTests.cs +++ b/src/Postmark.Tests/ClientTemplateTests.cs @@ -204,7 +204,7 @@ public async void ClientCanUseLayoutTemplatesWhenValidating() public async void ClientCanSendWithTemplate() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, PostmarkMessageBase.DefaultTransactionalStream, false); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } @@ -212,7 +212,7 @@ public async void ClientCanSendWithTemplate() public async void ClientCanSendTemplateWithStringModel() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, PostmarkMessageBase.DefaultTransactionalStream, false); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } diff --git a/src/Postmark/Model/PostmarkMessage.cs b/src/Postmark/Model/PostmarkMessage.cs index 1033963..2d3d0d5 100644 --- a/src/Postmark/Model/PostmarkMessage.cs +++ b/src/Postmark/Model/PostmarkMessage.cs @@ -22,9 +22,9 @@ public PostmarkMessage() /// The HTML Body to be used for the message, this may be null if TextBody is set. /// A collection of additional mail headers to send with the message. (optional) /// A dictionary of metadata to send with the message. (optional) + /// The message stream used to send this message. If not provided, the default transactional stream "outbound" will be used. (optional) public PostmarkMessage(string from, string to, string subject, string textBody, string htmlBody, - HeaderCollection headers = null, - IDictionary metadata = null): base() + HeaderCollection headers = null, IDictionary metadata = null, string messageStream = null) : base() { From = from; To = to; @@ -33,6 +33,7 @@ public PostmarkMessage(string from, string to, string subject, string textBody, HtmlBody = htmlBody; Headers = headers ?? new HeaderCollection(); Metadata = metadata; + MessageStream = messageStream ?? DefaultTransactionalStream; } /// diff --git a/src/Postmark/Model/PostmarkMessageBase.cs b/src/Postmark/Model/PostmarkMessageBase.cs index 0e1d6e7..6ca207f 100644 --- a/src/Postmark/Model/PostmarkMessageBase.cs +++ b/src/Postmark/Model/PostmarkMessageBase.cs @@ -10,6 +10,11 @@ namespace PostmarkDotNet /// public abstract class PostmarkMessageBase { + /// + /// The default transactional stream available on each server. + /// + public static readonly string DefaultTransactionalStream = "outbound"; + /// /// Initializes a new instance of the class. /// @@ -19,6 +24,11 @@ public PostmarkMessageBase() TrackLinks = LinkTrackingOptions.None; } + /// + /// The message stream used to send this message. + /// + public string MessageStream { get; set; } = DefaultTransactionalStream; + /// /// The sender's email address. /// diff --git a/src/Postmark/PostmarkClient.cs b/src/Postmark/PostmarkClient.cs index 449f354..49fc454 100644 --- a/src/Postmark/PostmarkClient.cs +++ b/src/Postmark/PostmarkClient.cs @@ -858,6 +858,7 @@ public async Task SendEmailWithTemplateAsync(TemplatedPostmark public async Task SendEmailWithTemplateAsync(string templateAlias, T templateModel, string to, string from, + string messageStream = null, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, bool? trackOpens = null, @@ -865,12 +866,13 @@ public async Task SendEmailWithTemplateAsync(string templat IDictionary metadata = null, params PostmarkMessageAttachment[] attachments) { - return await InternalSendEmailWithTemplateAsync(templateAlias, templateModel, to, from, inlineCss, cc, + return await InternalSendEmailWithTemplateAsync(templateAlias, templateModel, messageStream, to, from, inlineCss, cc, bcc, replyTo, trackOpens, headers, metadata, attachments); } public async Task SendEmailWithTemplateAsync(long templateId, T templateModel, string to, string from, + string messageStream = null, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, bool? trackOpens = null, @@ -878,11 +880,12 @@ public async Task SendEmailWithTemplateAsync(long templateI IDictionary metadata = null, params PostmarkMessageAttachment[] attachments) { - return await InternalSendEmailWithTemplateAsync(templateId, templateModel, to, from, inlineCss, cc, + return await InternalSendEmailWithTemplateAsync(templateId, templateModel, messageStream, to, from, inlineCss, cc, bcc, replyTo, trackOpens, headers, metadata, attachments); } private async Task InternalSendEmailWithTemplateAsync(object templateReference, T templateModel, + string messageStream, string to, string from, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, @@ -902,6 +905,7 @@ private async Task InternalSendEmailWithTemplateAsync(objec email.TemplateAlias = (string)templateReference; } email.TemplateModel = templateModel; + email.MessageStream = messageStream; email.To = to; email.From = from; if (inlineCss.HasValue) diff --git a/src/Postmark/PostmarkClientExtensions.cs b/src/Postmark/PostmarkClientExtensions.cs index 435fe0a..507bb22 100644 --- a/src/Postmark/PostmarkClientExtensions.cs +++ b/src/Postmark/PostmarkClientExtensions.cs @@ -10,7 +10,6 @@ namespace PostmarkDotNet /// public static class PostmarkClientExtensions { - /// /// Sends a message through the Postmark API. /// All email addresses must be valid, and the sender must be @@ -25,14 +24,16 @@ public static class PostmarkClientExtensions /// The Plain Text Body to be used for the message, this may be null if HtmlBody is set. /// The HTML Body to be used for the message, this may be null if TextBody is set. /// A collection of additional mail headers to send with the message. + /// The message stream used to send this message /// A with details about the transaction. public static async Task SendMessageAsync(this PostmarkClient client, string from, string to, string subject, string textBody, string htmlBody, - IDictionary headers = null, - IDictionary metadata = null) + IDictionary headers = null, + IDictionary metadata = null, + string messageStream = null) { - var message = new PostmarkMessage(from, to, subject, textBody, htmlBody, - new HeaderCollection(headers), metadata); + var message = new PostmarkMessage(from, to, subject, textBody, htmlBody, + new HeaderCollection(headers), metadata, messageStream); return await client.SendMessageAsync(message); } From 8c5960a37e7a2df9b18f560974235a43e1c7b7f0 Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Wed, 18 Mar 2020 09:34:12 +0200 Subject: [PATCH 2/7] Refactor PostmarkClient.cs --- src/Postmark.Tests/ClientTemplateTests.cs | 4 ++-- src/Postmark/PostmarkClient.cs | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Postmark.Tests/ClientTemplateTests.cs b/src/Postmark.Tests/ClientTemplateTests.cs index f7e704c..71bd7b8 100644 --- a/src/Postmark.Tests/ClientTemplateTests.cs +++ b/src/Postmark.Tests/ClientTemplateTests.cs @@ -204,7 +204,7 @@ public async void ClientCanUseLayoutTemplatesWhenValidating() public async void ClientCanSendWithTemplate() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, PostmarkMessageBase.DefaultTransactionalStream, false); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } @@ -212,7 +212,7 @@ public async void ClientCanSendWithTemplate() public async void ClientCanSendTemplateWithStringModel() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, PostmarkMessageBase.DefaultTransactionalStream, false); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } diff --git a/src/Postmark/PostmarkClient.cs b/src/Postmark/PostmarkClient.cs index 49fc454..e568e0b 100644 --- a/src/Postmark/PostmarkClient.cs +++ b/src/Postmark/PostmarkClient.cs @@ -858,40 +858,40 @@ public async Task SendEmailWithTemplateAsync(TemplatedPostmark public async Task SendEmailWithTemplateAsync(string templateAlias, T templateModel, string to, string from, - string messageStream = null, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, bool? trackOpens = null, IDictionary headers = null, IDictionary metadata = null, + string messageStream = null, params PostmarkMessageAttachment[] attachments) { - return await InternalSendEmailWithTemplateAsync(templateAlias, templateModel, messageStream, to, from, inlineCss, cc, - bcc, replyTo, trackOpens, headers, metadata, attachments); + return await InternalSendEmailWithTemplateAsync(templateAlias, templateModel, to, from, inlineCss, cc, + bcc, replyTo, trackOpens, headers, metadata, messageStream, attachments); } public async Task SendEmailWithTemplateAsync(long templateId, T templateModel, string to, string from, - string messageStream = null, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, bool? trackOpens = null, IDictionary headers = null, IDictionary metadata = null, + string messageStream = null, params PostmarkMessageAttachment[] attachments) { - return await InternalSendEmailWithTemplateAsync(templateId, templateModel, messageStream, to, from, inlineCss, cc, - bcc, replyTo, trackOpens, headers, metadata, attachments); + return await InternalSendEmailWithTemplateAsync(templateId, templateModel, to, from, inlineCss, cc, + bcc, replyTo, trackOpens, headers, metadata, messageStream, attachments); } private async Task InternalSendEmailWithTemplateAsync(object templateReference, T templateModel, - string messageStream, string to, string from, bool? inlineCss = null, string cc = null, string bcc = null, string replyTo = null, bool? trackOpens = null, IDictionary headers = null, IDictionary metadata = null, + string messageStream = null, params PostmarkMessageAttachment[] attachments) { @@ -905,7 +905,7 @@ private async Task InternalSendEmailWithTemplateAsync(objec email.TemplateAlias = (string)templateReference; } email.TemplateModel = templateModel; - email.MessageStream = messageStream; + email.MessageStream = messageStream ?? PostmarkMessageBase.DefaultTransactionalStream; email.To = to; email.From = from; if (inlineCss.HasValue) From c0417f65b64df3f292cde4941164b0a6edb2c08e Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Wed, 18 Mar 2020 09:42:13 +0200 Subject: [PATCH 3/7] Reformat code in ClientTemplateTests --- src/Postmark.Tests/ClientTemplateTests.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Postmark.Tests/ClientTemplateTests.cs b/src/Postmark.Tests/ClientTemplateTests.cs index 71bd7b8..03d041a 100644 --- a/src/Postmark.Tests/ClientTemplateTests.cs +++ b/src/Postmark.Tests/ClientTemplateTests.cs @@ -204,7 +204,8 @@ public async void ClientCanUseLayoutTemplatesWhenValidating() public async void ClientCanSendWithTemplate() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, + WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } @@ -212,7 +213,8 @@ public async void ClientCanSendWithTemplate() public async void ClientCanSendTemplateWithStringModel() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", + WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } From 36015e1031f17bad37ce558333248b93d5de767d Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Wed, 18 Mar 2020 10:48:40 +0200 Subject: [PATCH 4/7] Add unit tests in ClientSendingTests around MessageStream sending --- src/Postmark.Tests/ClientSendingTests.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Postmark.Tests/ClientSendingTests.cs b/src/Postmark.Tests/ClientSendingTests.cs index 05cc7ae..c96a245 100644 --- a/src/Postmark.Tests/ClientSendingTests.cs +++ b/src/Postmark.Tests/ClientSendingTests.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using PostmarkDotNet.Exceptions; namespace Postmark.Tests { @@ -89,6 +90,23 @@ public async void Client_CanSendAPostmarkMessageWithEmptyTrackLinks() Assert.NotEqual(Guid.Empty, result.MessageID); } + [Fact] + public async void UnknownMessageStream_ThrowsException() + { + var inboundAddress = (await _client.GetServerAsync()).InboundAddress; + var message = ConstructMessage(inboundAddress, 0, null); + message.MessageStream = "outbound"; + + var result = await _client.SendMessageAsync(message); + Assert.Equal(PostmarkStatus.Success, result.Status); + Assert.Equal(0, result.ErrorCode); + Assert.NotEqual(Guid.Empty, result.MessageID); + + message.MessageStream = "unknown-stream"; + + await Assert.ThrowsAsync(() => _client.SendMessageAsync(message)); + } + private PostmarkMessage ConstructMessage(string inboundAddress, int number = 0, LinkTrackingOptions? trackLinks = LinkTrackingOptions.HtmlAndText) { var message = new PostmarkMessage() From 8d5f12545604b311951140f38efa2848637671f4 Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Wed, 18 Mar 2020 11:44:57 +0200 Subject: [PATCH 5/7] Add comments in ClientSendingTests --- src/Postmark.Tests/ClientSendingTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Postmark.Tests/ClientSendingTests.cs b/src/Postmark.Tests/ClientSendingTests.cs index c96a245..cda08da 100644 --- a/src/Postmark.Tests/ClientSendingTests.cs +++ b/src/Postmark.Tests/ClientSendingTests.cs @@ -97,11 +97,13 @@ public async void UnknownMessageStream_ThrowsException() var message = ConstructMessage(inboundAddress, 0, null); message.MessageStream = "outbound"; + // Testing the default transactional stream var result = await _client.SendMessageAsync(message); Assert.Equal(PostmarkStatus.Success, result.Status); Assert.Equal(0, result.ErrorCode); Assert.NotEqual(Guid.Empty, result.MessageID); + // Testing an invalid non-existing stream message.MessageStream = "unknown-stream"; await Assert.ThrowsAsync(() => _client.SendMessageAsync(message)); From b7847269708ff44d02005c6a6e56f2c549c189ec Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Wed, 18 Mar 2020 14:06:34 +0200 Subject: [PATCH 6/7] Refactor code around MessageStreams in Sending API --- src/Postmark.Tests/ClientTemplateTests.cs | 6 ++---- src/Postmark/Model/PostmarkMessage.cs | 2 +- src/Postmark/Model/PostmarkMessageBase.cs | 7 +------ src/Postmark/PostmarkClient.cs | 2 +- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/Postmark.Tests/ClientTemplateTests.cs b/src/Postmark.Tests/ClientTemplateTests.cs index 03d041a..145ab9f 100644 --- a/src/Postmark.Tests/ClientTemplateTests.cs +++ b/src/Postmark.Tests/ClientTemplateTests.cs @@ -204,8 +204,7 @@ public async void ClientCanUseLayoutTemplatesWhenValidating() public async void ClientCanSendWithTemplate() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, - WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, new { name = "Andrew" }, WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } @@ -213,8 +212,7 @@ public async void ClientCanSendWithTemplate() public async void ClientCanSendTemplateWithStringModel() { var template = await _client.CreateTemplateAsync("test template name", "test subject", "test html body"); - var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", - WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false, messageStream: PostmarkMessageBase.DefaultTransactionalStream); + var sendResult = await _client.SendEmailWithTemplateAsync(template.TemplateId, "{ \"name\" : \"Andrew\" }", WRITE_TEST_SENDER_EMAIL_ADDRESS, WRITE_TEST_SENDER_EMAIL_ADDRESS, false); Assert.NotEqual(Guid.Empty, sendResult.MessageID); } diff --git a/src/Postmark/Model/PostmarkMessage.cs b/src/Postmark/Model/PostmarkMessage.cs index 2d3d0d5..0405a22 100644 --- a/src/Postmark/Model/PostmarkMessage.cs +++ b/src/Postmark/Model/PostmarkMessage.cs @@ -33,7 +33,7 @@ public PostmarkMessage(string from, string to, string subject, string textBody, HtmlBody = htmlBody; Headers = headers ?? new HeaderCollection(); Metadata = metadata; - MessageStream = messageStream ?? DefaultTransactionalStream; + MessageStream = messageStream; } /// diff --git a/src/Postmark/Model/PostmarkMessageBase.cs b/src/Postmark/Model/PostmarkMessageBase.cs index b1c106c..c0fd8cf 100644 --- a/src/Postmark/Model/PostmarkMessageBase.cs +++ b/src/Postmark/Model/PostmarkMessageBase.cs @@ -10,11 +10,6 @@ namespace PostmarkDotNet /// public abstract class PostmarkMessageBase { - /// - /// The default transactional stream available on each server. - /// - public static readonly string DefaultTransactionalStream = "outbound"; - /// /// Initializes a new instance of the class. /// @@ -27,7 +22,7 @@ public PostmarkMessageBase() /// /// The message stream used to send this message. /// - public string MessageStream { get; set; } = DefaultTransactionalStream; + public string MessageStream { get; set; } /// /// The sender's email address. diff --git a/src/Postmark/PostmarkClient.cs b/src/Postmark/PostmarkClient.cs index e568e0b..0d02c5e 100644 --- a/src/Postmark/PostmarkClient.cs +++ b/src/Postmark/PostmarkClient.cs @@ -905,7 +905,7 @@ private async Task InternalSendEmailWithTemplateAsync(objec email.TemplateAlias = (string)templateReference; } email.TemplateModel = templateModel; - email.MessageStream = messageStream ?? PostmarkMessageBase.DefaultTransactionalStream; + email.MessageStream = messageStream; email.To = to; email.From = from; if (inlineCss.HasValue) From 68321119c3f3768160d2416d64decdd672011fff Mon Sep 17 00:00:00 2001 From: Vlad Sandu Date: Tue, 24 Mar 2020 12:43:31 +0200 Subject: [PATCH 7/7] Improve documentation in PostmarkClientExtensions --- src/Postmark/PostmarkClientExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Postmark/PostmarkClientExtensions.cs b/src/Postmark/PostmarkClientExtensions.cs index 507bb22..09775cb 100644 --- a/src/Postmark/PostmarkClientExtensions.cs +++ b/src/Postmark/PostmarkClientExtensions.cs @@ -24,7 +24,7 @@ public static class PostmarkClientExtensions /// The Plain Text Body to be used for the message, this may be null if HtmlBody is set. /// The HTML Body to be used for the message, this may be null if TextBody is set. /// A collection of additional mail headers to send with the message. - /// The message stream used to send this message + /// The message stream used to send this message. /// A with details about the transaction. public static async Task SendMessageAsync(this PostmarkClient client, string from, string to, string subject, string textBody, string htmlBody,