Skip to content

Commit

Permalink
UnitTests project
Browse files Browse the repository at this point in the history
  • Loading branch information
cruikshj committed May 19, 2024
1 parent 833ff97 commit 31fea3a
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 1 deletion.
9 changes: 9 additions & 0 deletions ServerManager.DiscordBot.sln
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F777902F-D75
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.DiscordBot", "src\ServerManager.DiscordBot\ServerManager.DiscordBot.csproj", "{624BF89C-5541-4BD5-AB7E-B50758AE3172}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4EF12ECF-89F6-4EC1-9536-B5980616BF71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerManager.DiscordBot.UnitTests", "tests\ServerManager.DiscordBot.UnitTests\ServerManager.DiscordBot.UnitTests.csproj", "{3EDD60CC-A637-434B-844D-4027D1BD798C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -17,12 +21,17 @@ Global
{624BF89C-5541-4BD5-AB7E-B50758AE3172}.Debug|Any CPU.Build.0 = Debug|Any CPU
{624BF89C-5541-4BD5-AB7E-B50758AE3172}.Release|Any CPU.ActiveCfg = Release|Any CPU
{624BF89C-5541-4BD5-AB7E-B50758AE3172}.Release|Any CPU.Build.0 = Release|Any CPU
{3EDD60CC-A637-434B-844D-4027D1BD798C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3EDD60CC-A637-434B-844D-4027D1BD798C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3EDD60CC-A637-434B-844D-4027D1BD798C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3EDD60CC-A637-434B-844D-4027D1BD798C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{624BF89C-5541-4BD5-AB7E-B50758AE3172} = {F777902F-D759-4843-8F54-6786E1FC59CA}
{3EDD60CC-A637-434B-844D-4027D1BD798C} = {4EF12ECF-89F6-4EC1-9536-B5980616BF71}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FEC634BC-8A0C-46CD-9602-D82CC28A6E3D}
Expand Down
2 changes: 1 addition & 1 deletion src/ServerManager.DiscordBot/AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ public class AppSettings
{
public required string BotToken { get; set; }

public required List<ulong> GuildIds { get; set; } = [];
public List<ulong> GuildIds { get; set; } = [];

public Uri? HostUri { get; set; }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>

<RootNamespace>ServerManager.DiscordBot</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>

<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\ServerManager.DiscordBot\ServerManager.DiscordBot.csproj" />
</ItemGroup>

</Project>
92 changes: 92 additions & 0 deletions tests/ServerManager.DiscordBot.UnitTests/ServerManagerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using Moq;

public class ServerManagerTests
{
private readonly IOptions<AppSettings> _appSettings;
private readonly IMemoryCache _memoryCache;
private readonly IEnumerable<IServerInfoProvider> _serverInfoProviders;
private readonly IServiceProvider _serviceProvider;

public ServerManagerTests()
{
_appSettings = Options.Create(new AppSettings() {
BotToken = "BotToken"
});
_memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
_serverInfoProviders = new List<IServerInfoProvider>();
_serviceProvider = Mock.Of<IServiceProvider>();
}

[Fact]
public async Task GetServersAsync_ReturnsCachedServers()
{
// Arrange
object? servers = new Dictionary<string, ServerInfo>
{
{ "Server1", new ServerInfo() },
{ "Server2", new ServerInfo() }
};
var cancellationToken = CancellationToken.None;
var memoryCacheMock = new Mock<IMemoryCache>();
memoryCacheMock.Setup(m => m.TryGetValue(It.IsAny<object>(), out servers)).Returns(true);
var serverManager = new ServerManager(_appSettings, memoryCacheMock.Object, _serverInfoProviders, _serviceProvider);

// Act
var result = await serverManager.GetServersAsync(cancellationToken);

// Assert
Assert.Equal(servers, result);
}

[Fact]
public async Task GetServersAsync_ReturnsFreshServers()
{
// Arrange
object? servers = new Dictionary<string, ServerInfo>
{
{ "Server1", new ServerInfo() },
{ "Server2", new ServerInfo() }
};
var cancellationToken = CancellationToken.None;
var memoryCacheMock = new Mock<IMemoryCache>();
memoryCacheMock.Setup(m => m.TryGetValue(It.IsAny<object>(), out servers)).Returns(false);
memoryCacheMock.Setup(m => m.CreateEntry(It.IsAny<object>())).Returns(Mock.Of<ICacheEntry>());
var serverInfoProviderMock = new Mock<IServerInfoProvider>();
serverInfoProviderMock.Setup(p => p.GetServerInfoAsync(cancellationToken)).ReturnsAsync((Dictionary<string, ServerInfo>)servers);
var serverInfoProviders = new List<IServerInfoProvider> { serverInfoProviderMock.Object };
var serverManager = new ServerManager(_appSettings, memoryCacheMock.Object, serverInfoProviders, _serviceProvider);

// Act
var result = await serverManager.GetServersAsync(cancellationToken);

// Assert
Assert.Equal(servers, result);
memoryCacheMock.Verify(m => m.CreateEntry(It.IsAny<object>()), Times.Once);
}

[Fact]
public async Task GetServerInfoAsync_ThrowsArgumentException_WhenServerNotFound()
{
// Arrange
var serverName = "Server1";
var cancellationToken = CancellationToken.None;
var serverManager = new ServerManager(_appSettings, _memoryCache, _serverInfoProviders, _serviceProvider);

// Act & Assert
await Assert.ThrowsAsync<ArgumentException>(() => serverManager.GetServerInfoAsync(serverName, cancellationToken));
}

[Fact]
public async Task StartServerAsync_ThrowsArgumentException_WhenServerNotFound()
{
// Arrange
var serverName = "Server1";
var cancellationToken = CancellationToken.None;
var serverManager = new ServerManager(_appSettings, _memoryCache, _serverInfoProviders, _serviceProvider);

// Act & Assert
await Assert.ThrowsAsync<ArgumentException>(() => serverManager.StartServerAsync(serverName, cancellationToken: cancellationToken));
}
}

0 comments on commit 31fea3a

Please sign in to comment.