Skip to content

Commit 663baad

Browse files
Merge pull request #29 from IowaComputerGurus/feature/async
Adjusted project to use Async Properly Fixes #28
2 parents 412fb57 + ab6e020 commit 663baad

File tree

8 files changed

+222
-264
lines changed

8 files changed

+222
-264
lines changed

.github/workflows/ci-build.yml

Lines changed: 10 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -37,61 +37,14 @@ jobs:
3737
- name: Build
3838
run: dotnet build "${{ env.solution-path }}" --no-restore --configuration Release -p:version=${{ steps.gitversion.outputs.majorMinorPatch }}
3939
- name: Test
40-
run: dotnet test "${{ env.solution-path }}" --no-build --configuration Release
41-
42-
43-
code-quality:
44-
if: github.actor != 'dependabot[bot]'
45-
runs-on: windows-latest
46-
name: Analyze Code Quality
47-
env:
48-
solution-path: './src/NetCore.Utilities.Email.SendGrid.sln'
49-
steps:
50-
- name: Set up JDK 11
51-
uses: actions/setup-java@v3
52-
with:
53-
java-version: 11
54-
distribution: zulu
55-
- uses: actions/checkout@v4
56-
with:
57-
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
58-
- name: Cache SonarCloud packages
59-
uses: actions/[email protected]
60-
with:
61-
path: ~\sonar\cache
62-
key: ${{ runner.os }}-sonar
63-
restore-keys: ${{ runner.os }}-sonar
64-
- name: Cache SonarCloud scanner
65-
id: cache-sonar-scanner
66-
uses: actions/[email protected]
67-
with:
68-
path: .\.sonar\scanner
69-
key: ${{ runner.os }}-sonar-scanner
70-
restore-keys: ${{ runner.os }}-sonar-scanner
71-
- name: Install SonarCloud scanner
72-
if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
73-
shell: powershell
74-
run: |
75-
New-Item -Path .\.sonar\scanner -ItemType Directory
76-
dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner
77-
78-
- name: Install GitVersion
79-
run: dotnet tool install --global GitVersion.Tool
80-
81-
- name: Determine Version
82-
id: gitversion
83-
uses: gittools/actions/gitversion/[email protected]
84-
with:
85-
useConfigFile: true
40+
run: dotnet test "${{ env.solution-path }}" --no-build --configuration Release --collect "XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover --logger "trx;LogFileName=unittests.trx"
8641

87-
- name: Build and analyze
88-
env:
89-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
90-
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
91-
shell: powershell
92-
run: |
93-
.\.sonar\scanner\dotnet-sonarscanner begin /k:"IowaComputerGurus_netcore.utilities.email.sendgrid" /o:"iowacomputergurus-github" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io"
94-
dotnet restore "${{ env.solution-path }}"
95-
dotnet build "${{ env.solution-path }}" --no-restore --configuration Release -p:version=${{ steps.gitversion.outputs.majorMinorPatch }}
96-
dotnet test "${{ env.solution-path }}" --no-build --configuration Release --collect "XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover --logger "trx;LogFileName=unittests.trx"
97-
.\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
42+
- name: Push Coverage to Codacy
43+
shell: bash
44+
env:
45+
CODACY_ORGANIZATION_PROVIDER: ${{ secrets.CODACY_ORGANIZATION_PROVIDER }}
46+
CODACY_USERNAME: ${{ secrets.CODACY_USERNAME }}
47+
CODACY_PROJECT_NAME: ${{ secrets.CODACY_PROJECT_NAME }}
48+
CODACY_API_TOKEN: ${{ secrets.CODACY_API_TOKEN }}
49+
run: |
50+
bash <(curl -Ls https://coverage.codacy.com/get.sh) report $(find . -name '*.opencover.xml' -printf '-r %p ')

.github/workflows/release-build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ jobs:
3333

3434
- name: Restore Packages
3535
run: dotnet restore "${{ env.solution-path }}"
36+
3637
- name: Build
3738
run: dotnet build "${{ env.solution-path }}" --no-restore --configuration Release -p:version=${{ steps.gitversion.outputs.majorMinorPatch }}
3839

README.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@ This library provides an easy to use implementation of SendGrid based email deli
88

99
This package depends on the ICG.NetCore.Utilities.Email project for template implementation
1010

11-
## SonarCloud Analysis
12-
13-
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=IowaComputerGurus_netcore.utilities.email.sendgrid&metric=alert_status)](https://sonarcloud.io/dashboard?id=IowaComputerGurus_netcore.utilities.email.sendgrid)
14-
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=IowaComputerGurus_netcore.utilities.email.sendgrid&metric=coverage)](https://sonarcloud.io/dashboard?id=IowaComputerGurus_netcore.utilities.email.sendgrid)
15-
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=IowaComputerGurus_netcore.utilities.email.sendgrid&metric=security_rating)](https://sonarcloud.io/dashboard?id=IowaComputerGurus_netcore.utilities.email.sendgrid)
16-
[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=IowaComputerGurus_netcore.utilities.email.sendgrid&metric=sqale_index)](https://sonarcloud.io/dashboard?id=IowaComputerGurus_netcore.utilities.email.sendgrid)
11+
## Breaking Changes
1712

13+
Version 7.0 has a breaking change transitioning to Async for all methods!
1814

1915
## Dependencies
2016
The following additional NuGet packages are installed with this extension.

src/NetCore.Utilities.Email.SendGrid.Tests/NetCore.Utilities.Email.SendGrid.Tests.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="coverlet.collector" Version="3.1.2">
10+
<PackageReference Include="coverlet.collector" Version="6.0.2">
1111
<PrivateAssets>all</PrivateAssets>
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
</PackageReference>
1414
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
1515
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
1616
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
17-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
18-
<PackageReference Include="Moq" Version="4.18.2" />
19-
<PackageReference Include="xunit" Version="2.4.2" />
20-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
17+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
18+
<PackageReference Include="Moq" Version="4.20.70" />
19+
<PackageReference Include="xunit" Version="2.7.0" />
20+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
2121
<PrivateAssets>all</PrivateAssets>
2222
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
2323
</PackageReference>

src/NetCore.Utilities.Email.SendGrid.Tests/SmtpServiceTests.cs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,48 +84,48 @@ public void AdminName_ShouldReturnNullWhenNoConfiguration()
8484
}
8585

8686
[Fact]
87-
public void SendToAdministrator_ShouldSend_DefaultingFromAndToAddress()
87+
public void SendToAdministratorAsync_ShouldSend_DefaultingFromAndToAddress()
8888
{
8989
//Arrange
9090
var subject = "Test";
9191
var message = "Message";
9292

9393
//Act
94-
_service.SendMessageToAdministrator(subject, message);
94+
_service.SendMessageToAdministratorAsync(subject, message);
9595

9696
//Verify
9797
}
9898

9999
[Fact]
100-
public void SendToAdministrator_ShouldSend_DefaultingFromAndToAddress_WithCCRecipients()
100+
public void SendToAdministratorAsync_ShouldSend_DefaultingFromAndToAddress_WithCCRecipients()
101101
{
102102
//Arrange
103103
var subject = "Test";
104104
var message = "Message";
105105
var cc = new List<string> {"[email protected]"};
106106

107107
//Act
108-
_service.SendMessageToAdministrator(cc, subject, message);
108+
_service.SendMessageToAdministratorAsync(cc, subject, message);
109109

110110
//Verify
111111
}
112112

113113
[Fact]
114-
public void SendMessage_WithoutCCRecipients_ShouldSend_DefaultingFromAddress()
114+
public void SendMessageAsync_WithoutCCRecipients_ShouldSend_DefaultingFromAddress()
115115
{
116116
//Arrange
117117
var to = "[email protected]";
118118
var subject = "test";
119119
var message = "message";
120120

121121
//Act
122-
_service.SendMessage(to, subject, message);
122+
_service.SendMessageAsync(to, subject, message);
123123

124124
//Verify
125125
}
126126

127127
[Fact]
128-
public void SendMessage_WithCCRecipients_ShouldSend_DefaultingFromAddress()
128+
public void SendMessageAsync_WithCCRecipients_ShouldSend_DefaultingFromAddress()
129129
{
130130
//Arrange
131131
var to = "[email protected]";
@@ -134,13 +134,13 @@ public void SendMessage_WithCCRecipients_ShouldSend_DefaultingFromAddress()
134134
var message = "message";
135135

136136
//Act
137-
_service.SendMessage(to, cc, subject, message);
137+
_service.SendMessageAsync(to, cc, subject, message);
138138

139139
//Verify
140140
}
141141

142142
[Fact]
143-
public void SendMessageWithAttachment_ShouldSend_DefaultingFromAddress()
143+
public void SendMessageWithAttachmentAsync_ShouldSend_DefaultingFromAddress()
144144
{
145145
//Arrange
146146
var to = "[email protected]";
@@ -151,13 +151,13 @@ public void SendMessageWithAttachment_ShouldSend_DefaultingFromAddress()
151151
var message = "message";
152152

153153
//Act
154-
_service.SendMessageWithAttachment(to, cc, subject, fileContent, fileName, message, null);
154+
_service.SendMessageWithAttachmentAsync(to, cc, subject, fileContent, fileName, message, null);
155155

156156
//Assets
157157
}
158158

159159
[Fact]
160-
public void SendMessage_ShouldPassOptionalTemplateName_ToMessageMethods()
160+
public void SendMessageAsync_ShouldPassOptionalTemplateName_ToMessageMethods()
161161
{
162162
//Arrange
163163
var to = "[email protected]";
@@ -167,13 +167,13 @@ public void SendMessage_ShouldPassOptionalTemplateName_ToMessageMethods()
167167
var requestedTemplate = "Test";
168168

169169
//Act
170-
_service.SendMessage(to, cc, subject, message, null, requestedTemplate);
170+
_service.SendMessageAsync(to, cc, subject, message, null, requestedTemplate);
171171

172172
//Assets
173173
}
174174

175175
[Fact]
176-
public void SendMessageWithAttachment_ShouldPassOptionalTemplateName_ToMessageMethods()
176+
public void SendMessageWithAttachmentAsync_ShouldPassOptionalTemplateName_ToMessageMethods()
177177
{
178178
//Arrange
179179
var to = "[email protected]";
@@ -185,25 +185,25 @@ public void SendMessageWithAttachment_ShouldPassOptionalTemplateName_ToMessageMe
185185
var requestedTemplate = "Test";
186186

187187
//Act
188-
_service.SendMessageWithAttachment(to, cc, subject, fileContent, fileName, message, null, requestedTemplate);
188+
_service.SendMessageWithAttachmentAsync(to, cc, subject, fileContent, fileName, message, null, requestedTemplate);
189189

190190
//Assets
191191
}
192192

193193
[Fact]
194-
public void SendWithReplyTo_ShouldThrowArgumentException_WhenReplyToMissing()
194+
public async void SendWithReplyToAsync_ShouldThrowArgumentException_WhenReplyToMissing()
195195
{
196196
//Arrange
197197
var to = "[email protected]";
198198
var subject = "test";
199199
var message = "message";
200200

201201
//Act/Assert
202-
Assert.Throws<ArgumentNullException>(() => _service.SendWithReplyTo("", "", to, subject, message));
202+
var result = await Assert.ThrowsAsync<ArgumentNullException>(() => _service.SendWithReplyToAsync("", "", to, subject, message));
203203
}
204204

205205
[Fact]
206-
public void SendWithReplyTo_WithoutCCRecipients_ShouldSend_DefaultingFromAddress()
206+
public void SendWithReplyToAsync_WithoutCCRecipients_ShouldSend_DefaultingFromAddress()
207207
{
208208
//Arrange
209209
var replyTo = "[email protected]";
@@ -216,13 +216,13 @@ public void SendWithReplyTo_WithoutCCRecipients_ShouldSend_DefaultingFromAddress
216216
"")).Returns(returnMessage).Verifiable();
217217

218218
//Act
219-
_service.SendWithReplyTo(replyTo, "", to, subject, message);
219+
_service.SendWithReplyToAsync(replyTo, "", to, subject, message);
220220

221221
//Verify
222222
}
223223

224224
[Fact]
225-
public void SendWithReplyTo_WithCCRecipients_ShouldSend_DefaultingFromAddress()
225+
public void SendWithReplyToAsync_WithCCRecipients_ShouldSend_DefaultingFromAddress()
226226
{
227227
//Arrange
228228
var replyTo = "[email protected]";
@@ -235,14 +235,14 @@ public void SendWithReplyTo_WithCCRecipients_ShouldSend_DefaultingFromAddress()
235235
.Setup(s => s.CreateMessage(_options.AdminEmail, _options.AdminName, to, cc, subject, message, "")).Returns(returnMessage).Verifiable();
236236

237237
//Act
238-
_service.SendWithReplyTo(replyTo, "", to, cc, subject, message);
238+
_service.SendWithReplyToAsync(replyTo, "", to, cc, subject, message);
239239

240240
//Verify
241241
_sendGridMessageBuilderMock.Verify();
242242
}
243243

244244
[Fact]
245-
public void SendWithReplyTo_ShouldPassOptionalTemplateName_ToMessageMethods()
245+
public void SendWithReplyToAsync_ShouldPassOptionalTemplateName_ToMessageMethods()
246246
{
247247
//Arrange
248248
var replyTo = "[email protected]";
@@ -257,7 +257,7 @@ public void SendWithReplyTo_ShouldPassOptionalTemplateName_ToMessageMethods()
257257
requestedTemplate)).Returns(returnMessage).Verifiable();
258258

259259
//Act
260-
_service.SendWithReplyTo(replyTo, "", to, cc, subject, message, null, requestedTemplate);
260+
_service.SendWithReplyToAsync(replyTo, "", to, cc, subject, message, null, requestedTemplate);
261261

262262
//Assets
263263
_sendGridMessageBuilderMock.Verify();

src/NetCore.Utilities.Email.SendGrid/NetCore.Utilities.Email.SendGrid.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
</ItemGroup>
3535

3636
<ItemGroup>
37-
<PackageReference Include="icg.netcore.utilities.email" Version="6.2.0" />
37+
<PackageReference Include="icg.netcore.utilities.email" Version="7.0.0" />
3838
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
3939
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
4040
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
@@ -44,7 +44,7 @@
4444
<PrivateAssets>all</PrivateAssets>
4545
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4646
</PackageReference>
47-
<PackageReference Include="SendGrid" Version="9.28.1" />
47+
<PackageReference Include="SendGrid" Version="9.29.2" />
4848
</ItemGroup>
4949

5050
</Project>

src/NetCore.Utilities.Email.SendGrid/SendGridSender.cs

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,31 @@
22
using SendGrid;
33
using SendGrid.Helpers.Mail;
44

5-
namespace ICG.NetCore.Utilities.Email.SendGrid
5+
namespace ICG.NetCore.Utilities.Email.SendGrid;
6+
7+
/// <summary>
8+
/// Internal service to abstract the actual SendGrid implementation to allow for proper unit testing of the remainder
9+
/// of the project. Not intended for external usage
10+
/// </summary>
11+
public interface ISendGridSender
612
{
713
/// <summary>
8-
/// Internal service to abstract the actual SendGrid implementation to allow for proper unit testing of the remainder
9-
/// of the project. Not intended for external usage
14+
/// Sends a mail message using the provided API key
1015
/// </summary>
11-
public interface ISendGridSender
12-
{
13-
/// <summary>
14-
/// Sends a mail message using the provided API key
15-
/// </summary>
16-
/// <param name="apiKey"></param>
17-
/// <param name="message"></param>
18-
/// <returns></returns>
19-
Task<bool> SendMessage(string apiKey, SendGridMessage message);
20-
}
16+
/// <param name="apiKey"></param>
17+
/// <param name="message"></param>
18+
/// <returns></returns>
19+
Task<bool> SendMessage(string apiKey, SendGridMessage message);
20+
}
2121

22+
/// <inheritdoc />
23+
public class SendGridSender : ISendGridSender
24+
{
2225
/// <inheritdoc />
23-
public class SendGridSender : ISendGridSender
26+
public async Task<bool> SendMessage(string apiKey, SendGridMessage message)
2427
{
25-
/// <inheritdoc />
26-
public async Task<bool> SendMessage(string apiKey, SendGridMessage message)
27-
{
28-
var client = new SendGridClient(apiKey);
29-
var result = await client.SendEmailAsync(message);
30-
return result.IsSuccessStatusCode;
31-
}
28+
var client = new SendGridClient(apiKey);
29+
var result = await client.SendEmailAsync(message);
30+
return result.IsSuccessStatusCode;
3231
}
3332
}

0 commit comments

Comments
 (0)