Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transmission.Options.UseSink #133

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
79 changes: 79 additions & 0 deletions src/SparkPost.Tests/DataMapperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,85 @@ public void It_should_set_the_recipients()
["email"].ShouldEqual(recipient2.Address.Email);
}

[TestCaseSource("SinkifyCases")]
public void It_should_sinkify_addresses(string email, string headerTo,
string expectedEmail, string expectedHeaderTo)
{
var address = new Address() { Email = email, HeaderTo = headerTo };
transmission.Recipients.Add(new Recipient() { Address = address });
transmission.Options.Sink = true;

var result = mapper.ToDictionary(transmission)["recipients"] as IEnumerable<IDictionary<string, object>>;

result.Count().ShouldEqual(1);
var resultAddress = result.Single()["address"].CastAs<IDictionary<string, object>>();

foreach (var fieldToTest in new Dictionary<string, string>() {
{ "email", expectedEmail }, { "header_to", expectedHeaderTo} })
{
if (fieldToTest.Value == null)
resultAddress.ContainsKey(fieldToTest.Key).ShouldBeFalse();
else
resultAddress[fieldToTest.Key].ShouldEqual(fieldToTest.Value);
}
}

static object[] SinkifyCases =
{
new string[]
{
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
},
new string[]
{
"[email protected]",
null,
"[email protected]",
null
},
new string[]
{
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
},
new string[]
{
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
},
new string[]
{
null, null, null, null
},
};

[TestCase(true, true, true)]
[TestCase(true, false, true)]
[TestCase(false, true, true)]
[TestCase(false, false, false)]
public void Client_sink_setting_should_override_transmission(bool clientUseSink,
bool transmissionUseSink, bool shouldSinkify)
{
var address = new Address() { Email = Guid.NewGuid().ToString() };
transmission.Recipients.Add(new Recipient() { Address = address });
transmission.Options.Sink = transmissionUseSink;

var result = mapper.ToDictionary(transmission, clientUseSink)["recipients"] as IEnumerable<IDictionary<string, object>>;
var resultAddress = result.Single()["address"].CastAs<IDictionary<string, object>>();

resultAddress["email"]
.CastAs<string>()
.EndsWith(".sink.sparkpostmail.com")
.ShouldEqual(shouldSinkify);
}

[Test]
public void It_should_set_the_recipients_to_a_list_id_if_a_list_id_is_provided()
{
Expand Down
1 change: 1 addition & 0 deletions src/SparkPost/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ public Settings()
}

public SendingModes SendingMode { get; set; }
public bool SinkAllTransmissions { get; set; }

public HttpClient CreateANewHttpClient()
{
Expand Down
15 changes: 14 additions & 1 deletion src/SparkPost/DataMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public interface IDataMapper
IDictionary<string, object> ToDictionary(SendingDomainStatus sendingDomainStatus);
IDictionary<string, object> ToDictionary(VerifySendingDomain verifySendingDomain);
IDictionary<string, object> ToDictionary(Transmission transmission);
IDictionary<string, object> ToDictionary(Transmission transmission, bool useSink);
IDictionary<string, object> ToDictionary(Recipient recipient);
IDictionary<string, object> ToDictionary(Address address);
IDictionary<string, object> ToDictionary(Options options);
Expand Down Expand Up @@ -81,6 +82,11 @@ public virtual IDictionary<string, object> ToDictionary(VerifySendingDomain veri
}

public virtual IDictionary<string, object> ToDictionary(Transmission transmission)
{
return ToDictionary(transmission, false);
}

public virtual IDictionary<string, object> ToDictionary(Transmission transmission, bool sink)
{
var data = new Dictionary<string, object>
{
Expand All @@ -95,6 +101,8 @@ public virtual IDictionary<string, object> ToDictionary(Transmission transmissio

var result = WithCommonConventions(transmission, data);

if (sink || transmission.Options.Sink)
SinkHandling.AddSinkDomainToAddresses(result);
CcHandling.Process(transmission, result);

return result;
Expand Down Expand Up @@ -129,7 +137,12 @@ public virtual IDictionary<string, object> ToDictionary(Address address)

public virtual IDictionary<string, object> ToDictionary(Options options)
{
return AnyValuesWereSetOn(options) ? WithCommonConventions(options) : null;
var result = WithCommonConventions(options, new Dictionary<string, object>()
{
["sink"] = null,
});

return result.Any() ? result : null;
}

public virtual IDictionary<string, object> ToDictionary(Content content)
Expand Down
1 change: 1 addition & 0 deletions src/SparkPost/Options.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public class Options
public bool? SkipSuppression { get; set; }
public bool? InlineCss { get; set; }
public string IpPool { get; set; }
public bool Sink { get; set; }
}
}
39 changes: 39 additions & 0 deletions src/SparkPost/SinkHandling.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace SparkPost
{
internal static class SinkHandling
{
private static readonly string SINK_DOMAIN = ".sink.sparkpostmail.com";

internal static void AddSinkDomainToAddresses(IDictionary<string, object> result)
{
if (result.ContainsKey("recipients"))
{
var recipients = (result["recipients"] as IEnumerable<IDictionary<string, object>>).ToList();
foreach (var address in recipients
.Where(r => r.ContainsKey("address"))
.Select(r => r["address"])
.Cast<IDictionary<string, object>>())
{
AddSinkDomainToAddress(address, "email");
AddSinkDomainToAddress(address, "header_to");
}
result["recipients"] = recipients;
}
}

private static void AddSinkDomainToAddress(IDictionary<string, object> address, string fieldName)
{
if (address.ContainsKey(fieldName))
{
var currentAddress = (string)address[fieldName];
if (!String.IsNullOrWhiteSpace(currentAddress) && !currentAddress.EndsWith(SINK_DOMAIN, true, null))
address[fieldName] = currentAddress + SINK_DOMAIN;

}
}
}
}
1 change: 1 addition & 0 deletions src/SparkPost/SparkPost.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
<Compile Include="SendingDomains.cs" />
<Compile Include="SendingDomainStatus.cs" />
<Compile Include="SendRecipientListsResponse.cs" />
<Compile Include="SinkHandling.cs" />
<Compile Include="UpdateRecipientListResponse.cs" />
<Compile Include="UpdateSendingDomainResponse.cs" />
<Compile Include="Utilities\Jsonification.cs" />
Expand Down
4 changes: 2 additions & 2 deletions src/SparkPost/Transmissions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public Transmissions(Client client, IRequestSender requestSender, DataMapper dat
}

public async Task<SendTransmissionResponse> Send(Transmission transmission)
{
{
var request = new Request
{
Url = $"api/{client.Version}/transmissions",
Method = "POST",
Data = dataMapper.ToDictionary(transmission)
Data = dataMapper.ToDictionary(transmission, client.CustomSettings.SinkAllTransmissions)
};

var response = await requestSender.Send(request);
Expand Down