Skip to content

Commit 41eae29

Browse files
authored
Merge pull request #12 from hmlendea/tests
Wrote unit tests
2 parents 889a76f + fe9ca29 commit 41eae29

10 files changed

Lines changed: 193 additions & 0 deletions
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Net.Http;
2+
using System.Threading.Tasks;
3+
using Moq;
4+
using NUnit.Framework;
5+
6+
namespace NuciWeb.HTTP.UnitTests;
7+
8+
[TestFixture]
9+
public class HttpClientCreatorTests
10+
{
11+
[Test]
12+
public void GivenUserAgent_WhenCreate_ThenClientContainsUserAgentHeader()
13+
{
14+
string userAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0";
15+
16+
HttpClient client = HttpClientCreator.Create(userAgent);
17+
18+
Assert.That(client.DefaultRequestHeaders.UserAgent.ToString(), Is.EqualTo(userAgent));
19+
}
20+
21+
[Test]
22+
public async Task GivenUserAgentFetcher_WhenCreateAsync_ThenUsesFetchedUserAgent()
23+
{
24+
string fetchedUserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0";
25+
Mock<IUserAgentFetcher> userAgentFetcherMock = new();
26+
userAgentFetcherMock
27+
.Setup(x => x.GetUserAgent())
28+
.ReturnsAsync(fetchedUserAgent);
29+
30+
HttpClient client = await HttpClientCreator.CreateAsync(userAgentFetcherMock.Object);
31+
32+
Assert.That(client.DefaultRequestHeaders.UserAgent.ToString(), Is.EqualTo(fetchedUserAgent));
33+
userAgentFetcherMock.Verify(x => x.GetUserAgent(), Times.Once);
34+
}
35+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Net.Http;
3+
using System.Reflection;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using NUnit.Framework;
7+
8+
namespace NuciWeb.HTTP.UnitTests;
9+
10+
[TestFixture]
11+
public class NetworkUtilsTests
12+
{
13+
[Test]
14+
public void GivenZeroTimeout_WhenWaitForInternetAccess_ThenThrowsTimeoutException()
15+
=> Assert.Throws<TimeoutException>(() => NetworkUtils.WaitForInternetAccess(TimeSpan.Zero));
16+
17+
[Test]
18+
public async Task GivenCancelledToken_WhenTryPingAsync_ThenReturnsFalse()
19+
{
20+
using CancellationTokenSource cts = new();
21+
cts.Cancel();
22+
23+
bool result = await InvokePrivateNetworkCheckAsync("TryPingAsync", cts.Token);
24+
25+
Assert.That(result, Is.False);
26+
}
27+
28+
[Test]
29+
public async Task GivenCancelledToken_WhenTryTcpAsync_ThenReturnsFalse()
30+
{
31+
using CancellationTokenSource cts = new();
32+
cts.Cancel();
33+
34+
bool result = await InvokePrivateNetworkCheckAsync("TryTcpAsync", cts.Token);
35+
36+
Assert.That(result, Is.False);
37+
}
38+
39+
[Test]
40+
public async Task GivenCancelledToken_WhenTryHttpAsync_ThenReturnsFalse()
41+
{
42+
using CancellationTokenSource cts = new();
43+
cts.Cancel();
44+
45+
bool result = await InvokePrivateNetworkCheckAsync("TryHttpAsync", cts.Token);
46+
47+
Assert.That(result, Is.False);
48+
}
49+
50+
[Test]
51+
public void GivenCreateHttpClient_WhenInvoked_ThenClientHasExpectedDefaults()
52+
{
53+
MethodInfo method = typeof(NetworkUtils).GetMethod("CreateHttpClient", BindingFlags.NonPublic | BindingFlags.Static)!;
54+
55+
HttpClient client = (HttpClient)method.Invoke(null, null)!;
56+
57+
Assert.Multiple(() =>
58+
{
59+
Assert.That(client.Timeout, Is.EqualTo(Timeout.InfiniteTimeSpan));
60+
Assert.That(client.DefaultRequestHeaders.UserAgent.ToString(), Is.EqualTo("InternetAccessCheck/1.0"));
61+
});
62+
}
63+
64+
private static async Task<bool> InvokePrivateNetworkCheckAsync(string methodName, CancellationToken cancellationToken)
65+
{
66+
MethodInfo method = typeof(NetworkUtils).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Static)!;
67+
Task<bool> task = (Task<bool>)method.Invoke(null, [cancellationToken])!;
68+
69+
return await task;
70+
}
71+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<Nullable>enable</Nullable>
6+
<IsPackable>false</IsPackable>
7+
<ImplicitUsings>disable</ImplicitUsings>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<FrameworkReference Include="Microsoft.AspNetCore.App" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
16+
<PackageReference Include="Moq" Version="4.20.72" />
17+
<PackageReference Include="NUnit" Version="4.5.1" />
18+
<PackageReference Include="NUnit3TestAdapter" Version="6.2.0" />
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<ProjectReference Include="..\NuciWeb.HTTP\NuciWeb.HTTP.csproj" />
23+
</ItemGroup>
24+
25+
</Project>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Reflection;
2+
using System.Threading.Tasks;
3+
using NUnit.Framework;
4+
5+
namespace NuciWeb.HTTP.UnitTests;
6+
7+
[TestFixture]
8+
public class UserAgentFetcherTests
9+
{
10+
[Test]
11+
public void GivenUserAgentFetcher_WhenInspectingType_ThenImplementsIUserAgentFetcher()
12+
=> Assert.That(typeof(IUserAgentFetcher).IsAssignableFrom(typeof(UserAgentFetcher)), Is.True);
13+
14+
[Test]
15+
public async Task GivenCachedUserAgent_WhenGetUserAgent_ThenReturnsCachedValue()
16+
{
17+
string cachedUserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0";
18+
UserAgentFetcher fetcher = new();
19+
FieldInfo cachedValueField = typeof(UserAgentFetcher).GetField("cachedValue", BindingFlags.Instance | BindingFlags.NonPublic)!;
20+
cachedValueField.SetValue(fetcher, cachedUserAgent);
21+
22+
string userAgent = await fetcher.GetUserAgent();
23+
24+
Assert.That(userAgent, Is.EqualTo(cachedUserAgent));
25+
}
26+
}

NuciWeb.HTTP.sln

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
VisualStudioVersion = 15.0.27130.2020
4+
MinimumVisualStudioVersion = 10.0.40219.1
5+
Project("{0DF67A06-159D-4FEF-99B1-F109B812D550}") = "NuciWeb.HTTP", "NuciWeb.HTTP\NuciWeb.HTTP.csproj", "{980810B1-BDC5-4BA0-960F-977A23FE3B44}"
6+
EndProject
7+
Project("{E5E3F86C-A40D-49B9-9D7A-F82CA63F7C5A}") = "NuciWeb.HTTP.UnitTests", "NuciWeb.HTTP.UnitTests\NuciWeb.HTTP.UnitTests.csproj", "{23EAD7F8-6830-4069-8F1A-E970A66D48F9}"
8+
EndProject
9+
EndProject
10+
Global
11+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
12+
Debug|Any CPU = Debug|Any CPU
13+
Release|Any CPU = Release|Any CPU
14+
EndGlobalSection
15+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
16+
{980810B1-BDC5-4BA0-960F-977A23FE3B44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17+
{980810B1-BDC5-4BA0-960F-977A23FE3B44}.Debug|Any CPU.Build.0 = Debug|Any CPU
18+
{980810B1-BDC5-4BA0-960F-977A23FE3B44}.Release|Any CPU.ActiveCfg = Release|Any CPU
19+
{980810B1-BDC5-4BA0-960F-977A23FE3B44}.Release|Any CPU.Build.0 = Release|Any CPU
20+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|x64.ActiveCfg = Debug|Any CPU
23+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|x64.Build.0 = Debug|Any CPU
24+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|x86.ActiveCfg = Debug|Any CPU
25+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Debug|x86.Build.0 = Debug|Any CPU
26+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
27+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|Any CPU.Build.0 = Release|Any CPU
28+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|x64.ActiveCfg = Release|Any CPU
29+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|x64.Build.0 = Release|Any CPU
30+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|x86.ActiveCfg = Release|Any CPU
31+
{23EAD7F8-6830-4069-8F1A-E970A66D48F9}.Release|x86.Build.0 = Release|Any CPU
32+
EndGlobalSection
33+
GlobalSection(SolutionProperties) = preSolution
34+
HideSolutionNode = FALSE
35+
EndGlobalSection
36+
EndGlobal

0 commit comments

Comments
 (0)