Skip to content

Commit 9cb7d31

Browse files
authored
closes #71 (#72)
1 parent 9d44796 commit 9cb7d31

12 files changed

Lines changed: 76 additions & 54 deletions

File tree

src/OLT.Email/ArgBuilders/Common/OltEmailArgsWhitelist.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34

45
namespace OLT.Email
56
{
67
public abstract class OltEmailArgsWhitelist<T> : OltEmailArgsProduction<T>
78
where T : OltEmailArgsWhitelist<T>
89
{
9-
protected OltEmailConfigurationWhitelist Whitelist { get; set; } = new OltEmailConfigurationWhitelist();
10+
protected List<string> DomainWhitelist { get; set; } = new List<string>();
11+
protected List<string> EmailWhitelist { get; set; } = new List<string>();
1012

1113
protected OltEmailArgsWhitelist()
1214
{
@@ -25,14 +27,14 @@ public T WithWhitelist(OltEmailConfigurationWhitelist config)
2527
throw new ArgumentNullException(nameof(config));
2628
}
2729

28-
if (config.Domain != null)
30+
if (!string.IsNullOrWhiteSpace(config.Domain))
2931
{
30-
this.Whitelist.Domain.AddRange(config.Domain.Except(this.Whitelist.Domain));
32+
this.DomainWhitelist.AddRange(config.DomainParsed.Except(this.DomainWhitelist));
3133
}
3234

33-
if (config.Email != null)
35+
if (!string.IsNullOrWhiteSpace(config.Email))
3436
{
35-
this.Whitelist.Email.AddRange(config.Email.Except(this.Whitelist.Email));
37+
this.EmailWhitelist.AddRange(config.EmailParsed.Except(this.EmailWhitelist));
3638
}
3739

3840
return (T)this;
@@ -57,16 +59,16 @@ public T WithWhitelist(IOltEmailAddress emailAddress)
5759
throw new InvalidOperationException($"{nameof(emailAddress)}.{nameof(emailAddress.Email)} is null");
5860
}
5961

60-
if (!this.Whitelist.Email.Any(value => string.Equals(emailAddress.Email, value, StringComparison.OrdinalIgnoreCase)))
62+
if (!this.EmailWhitelist.Any(value => string.Equals(emailAddress.Email, value, StringComparison.OrdinalIgnoreCase)))
6163
{
62-
this.Whitelist.Email.Add(emailAddress.Email);
64+
this.EmailWhitelist.Add(emailAddress.Email);
6365
}
6466

6567
return (T)this;
6668
}
6769

6870
/// <summary>
69-
/// Determines if Email can be sent depending on EnableProductionEnvironment() is true or <see cref="Whitelist"/> and EnableProductionEnvironment() is false
71+
/// Determines if Email can be sent depending on EnableProductionEnvironment() is true or <see cref="OltEmailConfigurationWhitelist"/> and EnableProductionEnvironment() is false
7072
/// </summary>
7173
public override bool AllowSend(string emailAddress)
7274
{
@@ -75,8 +77,8 @@ public override bool AllowSend(string emailAddress)
7577
return true;
7678
}
7779

78-
return Whitelist.Domain.Any(p => emailAddress.EndsWith(p, StringComparison.OrdinalIgnoreCase)) ||
79-
Whitelist.Email.Any(p => emailAddress.Equals(p, StringComparison.OrdinalIgnoreCase));
80+
return DomainWhitelist.Any(p => emailAddress.EndsWith(p, StringComparison.OrdinalIgnoreCase)) ||
81+
EmailWhitelist.Any(p => emailAddress.Equals(p, StringComparison.OrdinalIgnoreCase));
8082
}
8183

8284
}
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23

34
namespace OLT.Email
45
{
@@ -8,19 +9,29 @@ namespace OLT.Email
89
public class OltEmailConfigurationWhitelist
910
{
1011
/// <summary>
11-
/// List of top-level domains for sending emails in non-production environments
12+
/// Semicolon delimited string of top-level domains for sending emails in non-production environments
1213
/// </summary>
1314
/// <example>
14-
/// outerlimitstech.com
15+
/// mydomain.com;mydomain.io
1516
/// </example>
16-
public List<string> Domain { get; set; } = new List<string>();
17+
public virtual string Domain { get; set; }
1718

1819
/// <summary>
19-
/// List of email addresses for sending emails in non-production environments
20+
/// Parsed <seealso cref="Domain"/>
21+
/// </summary>
22+
public virtual IEnumerable<string> DomainParsed => Domain?.Split(';').Where(s => !string.IsNullOrWhiteSpace(s)) ?? new List<string>();
23+
24+
/// <summary>
25+
/// Semicolon delimited string of email addresses for sending emails in non-production environments
2026
/// </summary>
2127
/// <example>
22-
28+
2329
/// </example>
24-
public List<string> Email { get; set; } = new List<string>();
30+
public virtual string Email { get; set; }
31+
32+
/// <summary>
33+
/// Parsed <seealso cref="Email"/>
34+
/// </summary>
35+
public virtual IEnumerable<string> EmailParsed => Email?.Split(';').Where(s => !string.IsNullOrWhiteSpace(s)) ?? new List<string>();
2536
}
2637
}

tests/OLT.Email.SendGrid.Tests/App_Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public virtual void ConfigureServices(IServiceCollection services, HostBuilderCo
5454
opt.RunNumber = configuration.GetValue<string>("GITHUB_RUN_NUMBER") ?? Environment.GetEnvironmentVariable("GITHUB_RUN_NUMBER") ?? "[No Run Number]";
5555
opt.TestWhitelist = new OltEmailConfigurationWhitelist
5656
{
57-
Email = new List<string> { opt.ToEmail }
57+
Email = opt.ToEmail
5858
};
5959
});
6060
}

tests/OLT.Email.SendGrid.Tests/SendGridConfigurationTests.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.Extensions.Options;
33
using System;
44
using System.IO;
5+
using System.Linq;
56
using System.Text.Json;
67
using System.Threading.Tasks;
78
using Xunit;
@@ -34,9 +35,9 @@ public void EmailConfiguration()
3435
var whiteDomain = Faker.Internet.DomainName();
3536

3637
var config = new OltEmailConfigurationSendGrid();
37-
config.ApiKey = apiKey;
38-
config.TestWhitelist.Domain.Add(whiteDomain);
39-
config.TestWhitelist.Email.Add(whiteEmail);
38+
config.ApiKey = apiKey;
39+
config.TestWhitelist.Domain = whiteDomain;
40+
config.TestWhitelist.Email = $"{whiteEmail};";
4041
config.From.Name = fromName;
4142
config.From.Email = fromEmail;
4243

@@ -46,8 +47,8 @@ public void EmailConfiguration()
4647
Assert.Equal(fromEmail, config.From.Email);
4748
Assert.NotEmpty(config.TestWhitelist.Email);
4849
Assert.NotEmpty(config.TestWhitelist.Domain);
49-
Assert.Equal(whiteEmail, config.TestWhitelist.Email[0]);
50-
Assert.Equal(whiteDomain, config.TestWhitelist.Domain[0]);
50+
Assert.Equal(whiteEmail, config.TestWhitelist.EmailParsed.ToList()[0]);
51+
Assert.Equal(whiteDomain, config.TestWhitelist.DomainParsed.ToList()[0]);
5152

5253
config.Production = true;
5354
Assert.True(config.Production);

tests/OLT.Email.SendGrid.Tests/SendGridHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static IOltEmailAddress FakerEmailAddress()
2020
public static OltEmailConfigurationWhitelist BuildWhitelist(List<IOltEmailAddress> emailAddresses)
2121
{
2222
var config = new OltEmailConfigurationWhitelist();
23-
config.Email.AddRange(emailAddresses.Select(p => p.Email));
23+
config.Email = string.Join(';', emailAddresses.Select(p => p.Email));
2424
return config;
2525
}
2626

@@ -50,12 +50,12 @@ public static OltEmailConfigurationSendGrid FakerConfig(bool production, int num
5050

5151
for(int i = 0; i < numEmailWhitelist; i++)
5252
{
53-
result.TestWhitelist.Email.Add(FakerEmailAddress().Email);
53+
result.TestWhitelist.Email = FakerEmailAddress().Email;
5454
}
5555

5656
for (int i = 0; i < numDomainWhitelist; i++)
5757
{
58-
result.TestWhitelist.Email.Add(Faker.Internet.DomainName());
58+
result.TestWhitelist.Email = Faker.Internet.DomainName();
5959
}
6060

6161
return result;

tests/OLT.Email.SendGrid.Tests/SendGridSendTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public async Task SendJsonEmail()
5858

5959
var whitelist = new OltEmailConfigurationWhitelist
6060
{
61-
Email = new List<string> { _prodConfig.ToEmail },
62-
Domain = new List<string> { Faker.Internet.DomainName() },
61+
Email = _prodConfig.ToEmail,
62+
Domain = Faker.Internet.DomainName(),
6363
};
6464

6565
var recipients = new OltEmailRecipients

tests/OLT.Email.SendGrid.Tests/appsettings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"Production": false,
44
"ApiKey": "bogus",
55
"TestWhitelist": {
6-
"Domain": [ "oltech.io", "outerlimitstech.com" ],
7-
6+
"Domain": "oltech.io;outerlimitstech.com",
7+
88
},
99
"From": {
1010
"Name": "OLT-Unit-Test",

tests/OLT.Email.Tests/Common/CommonArgBuilderTests.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,36 +127,51 @@ public void Whitelist()
127127
Faker.Internet.FreeEmail(),
128128
Faker.Internet.Email(),
129129
Faker.Internet.FreeEmail(),
130+
"",
131+
" ",
132+
null
130133
};
131134

132135
var domainList = new List<string>
133136
{
134137
whiteDomain,
135138
Faker.Internet.DomainName(),
136139
Faker.Internet.DomainName(),
137-
Faker.Internet.DomainName()
140+
Faker.Internet.DomainName(),
141+
"",
142+
" ",
143+
null
138144
};
139145

146+
var config = new OltEmailConfigurationWhitelist { Domain = null, Email = null };
147+
config.DomainParsed.Should().BeEmpty();
148+
config.EmailParsed.Should().BeEmpty();
149+
150+
config = new OltEmailConfigurationWhitelist { Domain = string.Join(';', domainList), Email = string.Join(';', emailList) };
151+
config.DomainParsed.Should().HaveCount(domainList.Count - 3);
152+
config.EmailParsed.Should().HaveCount(emailList.Count - 3);
153+
154+
140155
var args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = null, Email = null });
141156
Assert.False(args.AllowSend(Faker.Internet.Email()));
142157
Assert.False(args.AllowSend(badDomainEmail));
143158
Assert.False(args.AllowSend(whiteEmail));
144-
Assert.False(args.AllowSend(whiteDomainEmail));
159+
Assert.False(args.AllowSend(whiteDomainEmail));
145160

146161

147-
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = null, Email = emailList });
162+
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = null, Email = string.Join(';', emailList) });
148163
Assert.False(args.AllowSend(Faker.Internet.Email()));
149164
Assert.False(args.AllowSend(badDomainEmail));
150165
Assert.True(args.AllowSend(whiteEmail));
151166
Assert.False(args.AllowSend(whiteDomainEmail));
152167

153-
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = domainList, Email = null });
168+
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = string.Join(';', domainList), Email = null });
154169
Assert.False(args.AllowSend(Faker.Internet.Email()));
155170
Assert.False(args.AllowSend(badDomainEmail));
156171
Assert.False(args.AllowSend(whiteEmail));
157172
Assert.True(args.AllowSend(whiteDomainEmail));
158173

159-
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = domainList, Email = emailList });
174+
args = new OltEmailClientSmtp().EnableProductionEnvironment(false).WithWhitelist(new OltEmailConfigurationWhitelist { Domain = string.Join(';', domainList), Email = string.Join(';', emailList) });
160175
Assert.False(args.AllowSend(Faker.Internet.Email()));
161176
Assert.False(args.AllowSend(badDomainEmail));
162177
Assert.True(args.AllowSend(whiteEmail));

tests/OLT.Email.Tests/Common/CommonConfigurationTests.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System;
44
using System.Collections.Generic;
55
using System.IO;
6+
using System.Linq;
67
using System.Text.Json;
78
using System.Threading.Tasks;
89
using Xunit;
@@ -36,18 +37,18 @@ public void EmailConfiguration()
3637
var whiteDomain = Faker.Internet.DomainName();
3738

3839
var config = new OltEmailConfiguration();
39-
config.TestWhitelist.Domain.Add(whiteDomain);
40-
config.TestWhitelist.Email.Add(whiteEmail);
40+
config.TestWhitelist.Domain = whiteDomain;
41+
config.TestWhitelist.Email = whiteEmail;
4142
config.From.Name = fromName;
4243
config.From.Email = fromEmail;
43-
44+
4445
Assert.False(config.Production);
4546
Assert.Equal(fromName, config.From.Name);
4647
Assert.Equal(fromEmail, config.From.Email);
4748
Assert.NotEmpty(config.TestWhitelist.Email);
4849
Assert.NotEmpty(config.TestWhitelist.Domain);
49-
Assert.Equal(whiteEmail, config.TestWhitelist.Email[0]);
50-
Assert.Equal(whiteDomain, config.TestWhitelist.Domain[0]);
50+
Assert.Equal(whiteEmail, config.TestWhitelist.EmailParsed.ToList()[0]);
51+
Assert.Equal(whiteDomain, config.TestWhitelist.DomainParsed.ToList()[0]);
5152
config.Production = true;
5253
Assert.True(config.Production);
5354
}
@@ -68,10 +69,5 @@ public async Task Options()
6869
}
6970

7071
}
71-
72-
73-
74-
75-
7672
}
7773
}

tests/OLT.Email.Tests/Smtp/SmtpArgBuilderTests.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,8 @@ public void AllowSendTests()
176176
var bccWhiteEmailDomain = $"{Faker.Internet.UserName()}@{bccWhiteDomain}";
177177

178178
var whitelist = new OltEmailConfigurationWhitelist();
179-
whitelist.Email.Add(whiteEmail);
180-
whitelist.Email.Add(bccWhiteEmail);
181-
182-
whitelist.Domain.Add(whiteDomain);
183-
whitelist.Domain.Add(bccWhiteDomain);
179+
whitelist.Email = $"{whiteEmail};{bccWhiteEmail};;"; //extra semicolon is intentional
180+
whitelist.Domain = $"{whiteDomain};{bccWhiteDomain}; ;"; //extra semicolon is intentional
184181

185182

186183
var server = new OltSmtpServer

0 commit comments

Comments
 (0)