Skip to content

Commit 3688e74

Browse files
committed
feat(tests): add unit tests for ConsoleWrapper and Metrics middleware extensions
1 parent 3b090f7 commit 3688e74

File tree

2 files changed

+157
-0
lines changed

2 files changed

+157
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
using System.IO;
3+
using Xunit;
4+
5+
namespace AWS.Lambda.Powertools.Common.Tests;
6+
7+
public class ConsoleWrapperTests
8+
{
9+
[Fact]
10+
public void WriteLine_Should_Write_To_Console()
11+
{
12+
// Arrange
13+
var consoleWrapper = new ConsoleWrapper();
14+
var writer = new StringWriter();
15+
Console.SetOut(writer);
16+
17+
// Act
18+
consoleWrapper.WriteLine("test message");
19+
20+
// Assert
21+
Assert.Equal($"test message{Environment.NewLine}", writer.ToString());
22+
}
23+
24+
[Fact]
25+
public void Error_Should_Write_To_Error_Console()
26+
{
27+
// Arrange
28+
var consoleWrapper = new ConsoleWrapper();
29+
var writer = new StringWriter();
30+
Console.SetError(writer);
31+
32+
// Act
33+
consoleWrapper.Error("error message");
34+
35+
// Assert
36+
Assert.Equal($"error message{Environment.NewLine}", writer.ToString());
37+
}
38+
39+
[Fact]
40+
public void ReadLine_Should_Read_From_Console()
41+
{
42+
// Arrange
43+
var consoleWrapper = new ConsoleWrapper();
44+
var reader = new StringReader("input text");
45+
Console.SetIn(reader);
46+
47+
// Act
48+
var result = consoleWrapper.ReadLine();
49+
50+
// Assert
51+
Assert.Equal("input text", result);
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using Amazon.Lambda.TestUtilities;
2+
using AWS.Lambda.Powertools.Common;
3+
using AWS.Lambda.Powertools.Metrics.AspNetCore.Http;
4+
using Microsoft.AspNetCore.Builder;
5+
using Microsoft.AspNetCore.Http;
6+
using Microsoft.AspNetCore.TestHost;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using NSubstitute;
9+
using Xunit;
10+
11+
namespace AWS.Lambda.Powertools.Metrics.AspNetCore.Tests;
12+
13+
public class MetricsMiddlewareExtensionsTests : IDisposable
14+
{
15+
[Fact]
16+
public async Task When_UseMetrics_Should_Add_ColdStart()
17+
{
18+
// Arrange
19+
var options = new MetricsOptions
20+
{
21+
CaptureColdStart = true,
22+
Namespace = "TestNamespace",
23+
Service = "TestService"
24+
};
25+
26+
var conf = Substitute.For<IPowertoolsConfigurations>();
27+
var consoleWrapper = Substitute.For<IConsoleWrapper>();
28+
var metrics = new Metrics(conf, consoleWrapper: consoleWrapper, options: options);
29+
30+
var builder = WebApplication.CreateBuilder();
31+
builder.Services.AddSingleton<IMetrics>(metrics);
32+
builder.WebHost.UseTestServer();
33+
34+
var app = builder.Build();
35+
app.UseMetrics();
36+
app.MapGet("/test", () => Results.Ok());
37+
38+
await app.StartAsync();
39+
var client = app.GetTestClient();
40+
41+
// Act
42+
var response = await client.GetAsync("/test");
43+
44+
// Assert
45+
Assert.Equal(200, (int)response.StatusCode);
46+
consoleWrapper.Received(1).WriteLine(
47+
Arg.Is<string>(s => s.Contains("CloudWatchMetrics\":[{\"Namespace\":\"TestNamespace\",\"Metrics\":[{\"Name\":\"ColdStart\",\"Unit\":\"Count\"}],\"Dimensions\":[[]]}]},\"ColdStart\":1}"))
48+
);
49+
50+
await app.StopAsync();
51+
}
52+
53+
[Fact]
54+
public async Task When_UseMetrics_Should_Add_ColdStart_With_LambdaContext()
55+
{
56+
// Arrange
57+
var options = new MetricsOptions
58+
{
59+
CaptureColdStart = true,
60+
Namespace = "TestNamespace",
61+
Service = "TestService"
62+
};
63+
64+
var conf = Substitute.For<IPowertoolsConfigurations>();
65+
var consoleWrapper = Substitute.For<IConsoleWrapper>();
66+
var metrics = new Metrics(conf, consoleWrapper: consoleWrapper, options: options);
67+
68+
var builder = WebApplication.CreateBuilder();
69+
builder.Services.AddSingleton<IMetrics>(metrics);
70+
builder.WebHost.UseTestServer();
71+
72+
var app = builder.Build();
73+
app.Use(async (context, next) =>
74+
{
75+
var lambdaContext = new TestLambdaContext
76+
{
77+
FunctionName = "TestFunction"
78+
};
79+
context.Items["LambdaContext"] = lambdaContext;
80+
await next();
81+
});
82+
app.UseMetrics();
83+
app.MapGet("/test", () => Results.Ok());
84+
85+
await app.StartAsync();
86+
var client = app.GetTestClient();
87+
88+
// Act
89+
var response = await client.GetAsync("/test");
90+
91+
// Assert
92+
Assert.Equal(200, (int)response.StatusCode);
93+
consoleWrapper.Received(1).WriteLine(
94+
Arg.Is<string>(s => s.Contains("CloudWatchMetrics\":[{\"Namespace\":\"TestNamespace\",\"Metrics\":[{\"Name\":\"ColdStart\",\"Unit\":\"Count\"}],\"Dimensions\":[[\"FunctionName\"]]}]},\"FunctionName\":\"TestFunction\",\"ColdStart\":1}"))
95+
);
96+
97+
await app.StopAsync();
98+
}
99+
100+
public void Dispose()
101+
{
102+
MetricsHelper.ResetColdStart();
103+
}
104+
}

0 commit comments

Comments
 (0)