public async Task ShouldSendTaskSuccessWithSupersededTrueIfNewerCommitExists( string token, Request request, [Substitute] SQSEvent sqsEvent, [Frozen, Substitute] IAmazonStepFunctions stepFunctionsClient, [Frozen, Options] IOptions <Config> options, [Frozen, Substitute] RequestFactory requestFactory, [Frozen, Substitute] S3GetObjectFacade s3GetObjectFacade, [Target] Handler handler ) { request.Token = token; request.CommitTimestamp = DateTime.Now - TimeSpan.FromHours(1); requestFactory.CreateFromSqsEvent(Any <SQSEvent>()).Returns(request); s3GetObjectFacade.TryGetObject <StateInfo>(null, null).ReturnsForAnyArgs(new StateInfo { LastCommitTimestamp = DateTime.Now }); await handler.Handle(sqsEvent); var expectedOutput = Serialize(new { Superseded = true }); await stepFunctionsClient.Received().SendTaskSuccessAsync(Is <SendTaskSuccessRequest>(req => req.TaskToken == token && req.Output == expectedOutput )); }
public async Task <Response> Handle(SQSEvent sqsEvent, CancellationToken cancellationToken = default) { var request = requestFactory.CreateFromSqsEvent(sqsEvent); var bucket = config.StateStore; var getObjResponse = await s3GetObjectFacade.TryGetObject <StateInfo>(bucket, $"{request.Pipeline}/state.json"); var stateInfo = getObjResponse ?? new StateInfo { LastCommitTimestamp = DateTime.MinValue }; var superseded = request.CommitTimestamp < stateInfo.LastCommitTimestamp; var sendTaskRequest = new SendTaskSuccessRequest { TaskToken = request.Token, Output = Serialize(new { Superseded = superseded }) }; var sendTaskResponse = await stepFunctionsClient.SendTaskSuccessAsync(sendTaskRequest, cancellationToken); logger.LogInformation($"Got send task response: {Serialize(sendTaskResponse)}"); if (!superseded) { var putObjectRequest = new PutObjectRequest { BucketName = bucket, Key = $"{request.Pipeline}/state.json", ContentBody = Serialize(new StateInfo { LastCommitTimestamp = request.CommitTimestamp }) }; var putObjectResponse = await s3Client.PutObjectAsync(putObjectRequest, cancellationToken); logger.LogInformation($"Got put object response: {Serialize(putObjectResponse)}"); } return(new Response { Success = true }); }
public async Task ShouldPutUpdatedStateInfoIfNewerCommitDoesntExist( string bucket, string pipeline, string token, Request request, [Substitute] SQSEvent sqsEvent, [Frozen, Substitute] IAmazonS3 s3Client, [Frozen, Options] IOptions <Config> options, [Frozen, Substitute] RequestFactory requestFactory, [Frozen, Substitute] S3GetObjectFacade s3GetObjectFacade, [Target] Handler handler ) { options.Value.StateStore = bucket; request.Pipeline = pipeline; request.Token = token; request.CommitTimestamp = DateTime.Now - TimeSpan.FromHours(1); requestFactory.CreateFromSqsEvent(Any <SQSEvent>()).Returns(request); s3GetObjectFacade.TryGetObject <StateInfo>(Arg.Any <string>(), Arg.Any <string>()).Returns(new StateInfo { LastCommitTimestamp = DateTime.Now - TimeSpan.FromHours(2) }); await handler.Handle(sqsEvent); var expectedBody = Serialize(new StateInfo { LastCommitTimestamp = request.CommitTimestamp }); await s3Client.Received().PutObjectAsync(Arg.Is <PutObjectRequest>(req => req.BucketName == bucket && req.Key == $"{pipeline}/state.json" && req.ContentBody == expectedBody )); }