using Xunit; using Amazon.Lambda.TestUtilities; using Amazon.Lambda.APIGatewayEvents; using Moq; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.ApiGatewayManagementApi; using Amazon.ApiGatewayManagementApi.Model; namespace BlueprintBaseName._1.Tests; public class FunctionsTest { public FunctionsTest() { } [Fact] public async Task TestConnect() { Mock _mockDDBClient = new Mock(); Mock _mockApiGatewayClient = new Mock(); string tableName = "mocktable"; string connectionId = "test-id"; _mockDDBClient.Setup(client => client.PutItemAsync(It.IsAny(), It.IsAny())) .Callback((request, token) => { Assert.Equal(tableName, request.TableName); Assert.Equal(connectionId, request.Item[Functions.ConnectionIdField].S); }); var functions = new Functions(_mockDDBClient.Object, (endpoint) => _mockApiGatewayClient.Object, tableName); var lambdaContext = new TestLambdaContext(); var request = new APIGatewayProxyRequest { RequestContext = new APIGatewayProxyRequest.ProxyRequestContext { ConnectionId = connectionId } }; var response = await functions.OnConnectHandler(request, lambdaContext); Assert.Equal(200, response.StatusCode); } [Fact] public async Task TestDisconnect() { Mock _mockDDBClient = new Mock(); Mock _mockApiGatewayClient = new Mock(); string tableName = "mocktable"; string connectionId = "test-id"; _mockDDBClient.Setup(client => client.DeleteItemAsync(It.IsAny(), It.IsAny())) .Callback((request, token) => { Assert.Equal(tableName, request.TableName); Assert.Equal(connectionId, request.Key[Functions.ConnectionIdField].S); }); var functions = new Functions(_mockDDBClient.Object, (endpoint) => _mockApiGatewayClient.Object, tableName); var lambdaContext = new TestLambdaContext(); var request = new APIGatewayProxyRequest { RequestContext = new APIGatewayProxyRequest.ProxyRequestContext { ConnectionId = connectionId } }; var response = await functions.OnDisconnectHandler(request, lambdaContext); Assert.Equal(200, response.StatusCode); } [Fact] public async Task TestSendMessage() { Mock _mockDDBClient = new Mock(); Mock _mockApiGatewayClient = new Mock(); string tableName = "mocktable"; string connectionId = "test-id"; string message = "hello world"; _mockDDBClient.Setup(client => client.ScanAsync(It.IsAny(), It.IsAny())) .Callback((request, token) => { Assert.Equal(tableName, request.TableName); Assert.Equal(Functions.ConnectionIdField, request.ProjectionExpression); }) .Returns((ScanRequest r, CancellationToken token) => { return Task.FromResult(new ScanResponse { Items = new List> { { new Dictionary{ {Functions.ConnectionIdField, new AttributeValue { S = connectionId } } } } } }); }); Func apiGatewayFactory = ((endpoint) => { Assert.Equal("https://test-domain/test-stage", endpoint); return _mockApiGatewayClient.Object; }); _mockApiGatewayClient.Setup(client => client.PostToConnectionAsync(It.IsAny(), It.IsAny())) .Callback((request, token) => { var actualMessage = new StreamReader(request.Data).ReadToEnd(); Assert.Equal(message, actualMessage); }); var functions = new Functions(_mockDDBClient.Object, apiGatewayFactory, tableName); var lambdaContext = new TestLambdaContext(); var request = new APIGatewayProxyRequest { RequestContext = new APIGatewayProxyRequest.ProxyRequestContext { ConnectionId = connectionId, DomainName = "test-domain", Stage = "test-stage" }, Body = "{\"message\":\"sendmessage\", \"data\":\"" + message + "\"}" }; var response = await functions.SendMessageHandler(request, lambdaContext); Assert.Equal(200, response.StatusCode); } }