Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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[]
{
"bob@example.com",
"larry@example.com",
"bob@example.com.sink.sparkpostmail.com",
"larry@example.com.sink.sparkpostmail.com"
},
new string[]
{
"bob@example.com",
null,
"bob@example.com.sink.sparkpostmail.com",
null
},
new string[]
{
"bob@example.com.sink.sparkpostmail.com",
"larry@example.com",
"bob@example.com.sink.sparkpostmail.com",
"larry@example.com.sink.sparkpostmail.com"
},
new string[]
{
"bob@example.com.SINK.SPARKPOSTMAIL.COM",
"larry@example.com",
"bob@example.com.SINK.SPARKPOSTMAIL.COM",
"larry@example.com.sink.sparkpostmail.com"
},
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