diff --git a/TestUtils.Tests/HttpTests.cs b/TestUtils.Tests/HttpTests.cs new file mode 100644 index 0000000..d7c0658 --- /dev/null +++ b/TestUtils.Tests/HttpTests.cs @@ -0,0 +1,61 @@ +using NUnit.Framework; +using StoneAge.TestUtils; +using System.Net.Http; +using System.Threading.Tasks; + +namespace TestUtils.Tests; + +public class HttpTests +{ + [Test] + public void TestHttpClientBuilder_Create_ReturnsClientAndHandler() + { + // Arrange + var builder = new TestHttpClientBuilder(); + + // Act + var (client, handler) = builder.Create(); + + // Assert + Assert.That(client, Is.Not.Null); + Assert.That(handler, Is.Not.Null); + Assert.That(client.GetType(), Is.EqualTo(typeof(HttpClient))); + Assert.That(handler.GetType(), Is.EqualTo(typeof(TestHttpMessageHandler))); + } + + [Test] + public async Task TestHttpClientBuilder_WithPayload_SetsPayload() + { + // Arrange + var expectedPayload = "{\"name\":\"test\"}"; + var builder = new TestHttpClientBuilder(); + + // Act + var (client, handler) = builder.With_Payload(expectedPayload).Create(); + var response = await client.GetAsync("https://test.com"); + var actualPayload = await response.Content.ReadAsStringAsync(); + + // Assert + Assert.That(client, Is.Not.Null); + Assert.That(actualPayload, Is.EqualTo(expectedPayload)); + } + + [Test] + public async Task TestHttpMessageHandler_SendAsync_ReturnsResponseWithPayload() + { + // Arrange + var expectedPayload = "{\"name\":\"test\"}"; + var builder = new TestHttpClientBuilder().With_Payload(expectedPayload); + var (client, handler) = builder.Create(); + + // Act + var response = await client.GetAsync("https://example.com"); + var content = await response.Content.ReadAsStringAsync(); + + // Assert + Assert.That(response.IsSuccessStatusCode, Is.True); + Assert.That(content, Is.EqualTo(expectedPayload)); + Assert.That(handler.RequestMessage, Is.Not.Null); + Assert.That(handler.RequestMessage.RequestUri?.Host, Is.EqualTo("example.com")); + } +} \ No newline at end of file diff --git a/TestUtils.Tests/MockLoggerTests.cs b/TestUtils.Tests/MockLoggerTests.cs new file mode 100644 index 0000000..494d504 --- /dev/null +++ b/TestUtils.Tests/MockLoggerTests.cs @@ -0,0 +1,56 @@ +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using StoneAge.TestUtils; +using System.Collections.Generic; + +namespace TestUtils.Tests; + +public class MockLoggerTests +{ + private MockLogger _logger; + + [SetUp] + public void Setup() + { + _logger = new MockLogger(); + } + + [Test] + public void Log_WhenCalled_StoresLogEntry() + { + // Arrange + var logLevel = LogLevel.Information; + var message = "Test log message"; + + // Act + _logger.Log(logLevel, 0, message, null, (state, ex) => state.ToString()); + + // Assert + Assert.That(_logger.LogEntries.ContainsKey(logLevel), Is.True); + Assert.That(_logger.LogEntries[logLevel], Contains.Item(message)); + } + + [Test] + public void Fetch_Entries_For_WhenCalled_ReturnsEntriesForLevel() + { + // Arrange + var logLevel = LogLevel.Warning; + var message = "Warning message"; + _logger.Log(logLevel, 0, message, null, (state, ex) => state.ToString()); + + // Act + List entries = _logger.Fetch_Entries_For(logLevel); + + // Assert + Assert.That(entries, Contains.Item(message)); + } + + [Test] + public void IsEnabled_Always_ReturnsTrue() + { + // Act & Assert + Assert.That(_logger.IsEnabled(LogLevel.Information), Is.True); + Assert.That(_logger.IsEnabled(LogLevel.Error), Is.True); + Assert.That(_logger.IsEnabled(LogLevel.Debug), Is.True); + } +} \ No newline at end of file diff --git a/TestUtils.Tests/MockOptionsTests.cs b/TestUtils.Tests/MockOptionsTests.cs new file mode 100644 index 0000000..1efb307 --- /dev/null +++ b/TestUtils.Tests/MockOptionsTests.cs @@ -0,0 +1,65 @@ +using NUnit.Framework; +using StoneAge.TestUtils; + +namespace TestUtils.Tests; + +public class MockOptionsTests +{ + private class TestOptions + { + public string? Name { get; set; } + public int Value { get; set; } + } + + [Test] + public void Value_WhenAccessed_ReturnsProvidedValue() + { + // Arrange + var expectedOptions = new TestOptions { Name = "Test", Value = 42 }; + var mockOptions = new MockOptions(expectedOptions); + + // Act + var result = mockOptions.Value; + + // Assert + Assert.That(result, Is.EqualTo(expectedOptions)); + Assert.That(result.Name, Is.EqualTo("Test")); + Assert.That(result.Value, Is.EqualTo(42)); + } +} + +public class MockOptionsSnapshotTests +{ + private class TestOptions + { + public string? Name { get; set; } + public int Value { get; set; } + } + + [Test] + public void Value_WhenAccessed_ReturnsProvidedValue() + { + // Arrange + var expectedOptions = new TestOptions { Name = "Test", Value = 42 }; + var mockOptionsSnapshot = new MockOptionsSnapshot(expectedOptions); + + // Act + var result = mockOptionsSnapshot.Value; + + // Assert + Assert.That(result, Is.EqualTo(expectedOptions)); + Assert.That(result.Name, Is.EqualTo("Test")); + Assert.That(result.Value, Is.EqualTo(42)); + } + + [Test] + public void Get_WhenCalled_ThrowsNotImplementedException() + { + // Arrange + var options = new TestOptions(); + var mockOptionsSnapshot = new MockOptionsSnapshot(options); + + // Act & Assert + Assert.Throws(() => mockOptionsSnapshot.Get("name")); + } +} \ No newline at end of file diff --git a/TestUtils.Tests/TestUtils.Tests.csproj b/TestUtils.Tests/TestUtils.Tests.csproj new file mode 100644 index 0000000..1fa0cff --- /dev/null +++ b/TestUtils.Tests/TestUtils.Tests.csproj @@ -0,0 +1,27 @@ + + + + net8.0 + latest + enable + enable + false + + + + + + + + + + + + + + + + + + + diff --git a/TestUtils.sln b/TestUtils.sln index a8125a3..dd1b4a5 100644 --- a/TestUtils.sln +++ b/TestUtils.sln @@ -1,25 +1,51 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29009.5 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StoneAge.TestUtils", "TestUtils\StoneAge.TestUtils.csproj", "{5F82CAB0-84CF-43F2-8572-27A74D56DF20}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D0B5268A-049B-4892-96B6-A6F45F80032A} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29009.5 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StoneAge.TestUtils", "TestUtils\StoneAge.TestUtils.csproj", "{5F82CAB0-84CF-43F2-8572-27A74D56DF20}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestUtils.Tests", "TestUtils.Tests\TestUtils.Tests.csproj", "{99F70BC2-53DC-46CE-A496-545EFF81D144}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|x64.ActiveCfg = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|x64.Build.0 = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|x86.ActiveCfg = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Debug|x86.Build.0 = Debug|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|Any CPU.Build.0 = Release|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|x64.ActiveCfg = Release|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|x64.Build.0 = Release|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|x86.ActiveCfg = Release|Any CPU + {5F82CAB0-84CF-43F2-8572-27A74D56DF20}.Release|x86.Build.0 = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|x64.ActiveCfg = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|x64.Build.0 = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|x86.ActiveCfg = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Debug|x86.Build.0 = Debug|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|Any CPU.Build.0 = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|x64.ActiveCfg = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|x64.Build.0 = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|x86.ActiveCfg = Release|Any CPU + {99F70BC2-53DC-46CE-A496-545EFF81D144}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D0B5268A-049B-4892-96B6-A6F45F80032A} + EndGlobalSection +EndGlobal