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