public HttpResponseMessage Confirmations(string msDCorrelationId, IntegrationLayerResponse ilResponse) { try { Guid entityCacheMessageId; if (string.IsNullOrWhiteSpace(msDCorrelationId)) { return(Request.CreateResponse(HttpStatusCode.BadRequest, Messages.MissingMsdCorrelationId)); } if (!Guid.TryParse(msDCorrelationId, out entityCacheMessageId)) { return(Request.CreateResponse(HttpStatusCode.BadRequest, Messages.IncorrectMsdCorrelationId)); } if (ilResponse == null) { return(Request.CreateResponse(HttpStatusCode.BadRequest, Messages.ConfirmationDataPassedIsNullOrCouldNotBeParsed)); } if (string.IsNullOrWhiteSpace(ilResponse.CorrelationId)) { return(Request.CreateResponse(HttpStatusCode.BadRequest, Messages.MissingCorrelationId)); } var confirmationResponse = confirmationService.ProcessResponse(entityCacheMessageId, ilResponse); return(Request.CreateResponse(confirmationResponse.StatusCode, confirmationResponse.Message)); } catch (Exception ex) { Trace.TraceError("Unexpected error Survey.Create::Message:{0}||Trace:{1}", ex.Message, ex.StackTrace.ToString()); return(Request.CreateResponse(HttpStatusCode.InternalServerError, Messages.UnexpectedError)); } }
public void TestIntegrationResponseStatusOkEntityCacheMessageDoesNotExist() { var entityCacheMessageId = Guid.NewGuid(); var sourceSystemId = "source system id"; var serviceResponse = new IntegrationLayerResponse { SourceSystemEntityID = sourceSystemId, SourceSystemStatusCode = HttpStatusCode.OK }; var crmService = A.Fake <ICrmService>(); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.EndtoEndSuccess, null)).Returns(Guid.Empty); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(Guid.Empty)).DoesNothing(); A.CallTo(() => crmService.ProcessEntityCache(Guid.Empty, Status.Inactive, EntityCacheStatusReason.Succeeded, true, null)).DoesNothing(); var confirmationService = new ConfirmationService(crmService); var response = confirmationService.ProcessResponse(entityCacheMessageId, serviceResponse); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.EndtoEndSuccess, null)).MustHaveHappened(); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(Guid.Empty)).MustNotHaveHappened(); A.CallTo(() => crmService.ProcessEntityCache(Guid.Empty, Status.Inactive, EntityCacheStatusReason.Succeeded, true, null)).MustNotHaveHappened(); Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); Assert.AreEqual(string.Format(Messages.MsdCorrelationIdDoesNotExist, entityCacheMessageId), response.Message); }
public void TestCrmServiceThrowsError() { var entityCacheMessageId = Guid.NewGuid(); var entityCacheId = Guid.NewGuid(); var sourceSystemId = "source system id"; var serviceResponse = new IntegrationLayerResponse { SourceSystemEntityID = sourceSystemId, SourceSystemStatusCode = HttpStatusCode.OK, SourceSystemRequest = "SourceSystemRequest", SourceSystemResponse = "SourceSystemResponse" }; var crmService = A.Fake <ICrmService>(); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.EndtoEndSuccess, null)).Throws(new Exception("exception")); var confirmationService = new ConfirmationService(crmService); var response = confirmationService.ProcessResponse(entityCacheMessageId, serviceResponse); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.EndtoEndSuccess, null)).MustHaveHappened(); Assert.AreEqual(HttpStatusCode.GatewayTimeout, response.StatusCode); Assert.AreEqual(Messages.FailedToUpdateEntityCacheMessage, response.Message); }
public void TestConfirmationServiceReturnsNotOkResponse() { var guid = Guid.NewGuid(); var requestBody = new IntegrationLayerResponse { CorrelationId = guid.ToString(), SourceSystemEntityID = "entity id", SourceSystemStatusCode = HttpStatusCode.OK }; var confirmationService = A.Fake <IConfirmationService>(); A.CallTo(() => confirmationService.ProcessResponse(guid, requestBody)).Returns(new ConfirmationResponse() { StatusCode = HttpStatusCode.BadRequest, Message = "message" }); controller = new ConfirmationController(confirmationService); controller.Request = new System.Net.Http.HttpRequestMessage(); controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); var response = controller.Confirmations(guid.ToString(), requestBody); Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); Assert.AreEqual("message", ((System.Net.Http.ObjectContent)response.Content).Value); }
public void TestIntegrationResponseStatusNotOkRetryNeeded() { var entityCacheMessageId = Guid.NewGuid(); var entityCacheId = Guid.NewGuid(); var sourceSystemId = "source system id"; var serviceResponse = new IntegrationLayerResponse { SourceSystemEntityID = sourceSystemId, SourceSystemStatusCode = HttpStatusCode.InternalServerError, SourceSystemRequest = "SourceSystemRequest", SourceSystemResponse = "SourceSystemResponse" }; var builder = new StringBuilder(); builder.AppendLine("SourceSystemStatusCode: " + serviceResponse.SourceSystemStatusCode); if (!string.IsNullOrWhiteSpace(serviceResponse.SourceSystemRequest)) { builder.AppendLine("SourceSystemRequest: " + serviceResponse.SourceSystemRequest); } if (!string.IsNullOrWhiteSpace(serviceResponse.SourceSystemResponse)) { builder.AppendLine("SourceSystemResponse: " + serviceResponse.SourceSystemResponse); } var notes = builder.ToString(); var crmService = A.Fake <ICrmService>(); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.Failed, notes)).Returns(entityCacheId); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(entityCacheId)).DoesNothing(); A.CallTo(() => crmService.ProcessEntityCache(entityCacheId, Status.Active, EntityCacheStatusReason.InProgress, false, null)).DoesNothing(); A.CallTo(() => crmService.GetEntityCacheMessageCount(entityCacheId)).Returns(1); A.CallTo(() => crmService.GetConfiguration(Configuration.OutboundSynchronisationMaxRetries)).Returns("5,10"); var confirmationService = new ConfirmationService(crmService); var response = confirmationService.ProcessResponse(entityCacheMessageId, serviceResponse); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.Failed, notes)).MustHaveHappened(); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(entityCacheId)).MustNotHaveHappened(); A.CallTo(() => crmService.ProcessEntityCache(entityCacheId, Status.Active, EntityCacheStatusReason.InProgress, false, A <DateTime> .That.Matches(d => d > DateTime.UtcNow && d < DateTime.UtcNow.AddMinutes(5)))).MustHaveHappened(); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(string.Empty, response.Message); }
private string PrepareEntityCacheMessageNotes(IntegrationLayerResponse ilResponse) { var notes = new StringBuilder(); if (ilResponse == null) { return(notes.ToString()); } notes.AppendLine("SourceSystemStatusCode: " + ilResponse.SourceSystemStatusCode); if (!string.IsNullOrWhiteSpace(ilResponse.SourceSystemRequest)) { notes.AppendLine("SourceSystemRequest: " + ilResponse.SourceSystemRequest); } if (!string.IsNullOrWhiteSpace(ilResponse.SourceSystemResponse)) { notes.AppendLine("SourceSystemResponse: " + ilResponse.SourceSystemResponse); } return(notes.ToString()); }
public void TestIntegrationResponseStatusNotOkNoRetryAvailable() { var entityCacheMessageId = Guid.NewGuid(); var entityCacheId = Guid.NewGuid(); var sourceSystemId = "source system id"; var serviceResponse = new IntegrationLayerResponse { SourceSystemEntityID = sourceSystemId, SourceSystemStatusCode = HttpStatusCode.InternalServerError, SourceSystemRequest = "SourceSystemRequest", SourceSystemResponse = "SourceSystemResponse" }; var builder = new StringBuilder(); builder.AppendLine("SourceSystemStatusCode: " + serviceResponse.SourceSystemStatusCode); if (!string.IsNullOrWhiteSpace(serviceResponse.SourceSystemRequest)) { builder.AppendLine("SourceSystemRequest: " + serviceResponse.SourceSystemRequest); } if (!string.IsNullOrWhiteSpace(serviceResponse.SourceSystemResponse)) { builder.AppendLine("SourceSystemResponse: " + serviceResponse.SourceSystemResponse); } var notes = builder.ToString(); var crmService = A.Fake <ICrmService>(); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.Failed, notes)).Returns(entityCacheId); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(entityCacheId)).DoesNothing(); A.CallTo(() => crmService.ProcessEntityCache(entityCacheId, Status.Active, EntityCacheStatusReason.InProgress, false, null)).DoesNothing(); var confirmationService = new ConfirmationService(crmService); var response = confirmationService.ProcessResponse(entityCacheMessageId, serviceResponse); A.CallTo(() => crmService.ProcessEntityCacheMessage(entityCacheMessageId, sourceSystemId, Status.Inactive, EntityCacheMessageStatusReason.Failed, notes)).MustHaveHappened(); A.CallTo(() => crmService.ActivateRelatedPendingEntityCache(entityCacheId)).MustNotHaveHappened(); A.CallTo(() => crmService.ProcessEntityCache(entityCacheId, Status.Inactive, EntityCacheStatusReason.Failed, false, null)).MustHaveHappened(); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(string.Empty, response.Message); }
public ConfirmationResponse ProcessResponse(Guid entityCacheMessageId, IntegrationLayerResponse ilResponse) { try { var entityCacheId = Guid.Empty; if (entityCacheMessageId == Guid.Empty) { throw new ArgumentNullException(Parameters.EntityCacheMessageId); } if (ilResponse == null) { throw new ArgumentNullException(Parameters.DataJson); } if (crmService == null) { throw new ArgumentNullException(Parameters.CrmService); } var successStatus = new List <HttpStatusCode> { HttpStatusCode.OK, HttpStatusCode.Created, HttpStatusCode.Accepted, HttpStatusCode.NonAuthoritativeInformation, HttpStatusCode.NoContent, HttpStatusCode.ResetContent, HttpStatusCode.PartialContent }; var isSuccess = successStatus.Contains(ilResponse.SourceSystemStatusCode); entityCacheId = crmService.ProcessEntityCacheMessage(entityCacheMessageId, ilResponse.SourceSystemEntityID, Status.Inactive, isSuccess ? EntityCacheMessageStatusReason.EndtoEndSuccess : EntityCacheMessageStatusReason.Failed, isSuccess ? null : PrepareEntityCacheMessageNotes(ilResponse)); if (entityCacheId != Guid.Empty) { // activate pending entity cache before putting to success to elimitate possibility plugin will create active request in between Status status; EntityCacheStatusReason statusReason; DateTime?eligibleRetryTime = null; if (isSuccess) { status = Status.Inactive; statusReason = EntityCacheStatusReason.Succeeded; crmService.ActivateRelatedPendingEntityCache(entityCacheId); } else { var count = crmService.GetEntityCacheMessageCount(entityCacheId); var schedule = GetRetrySchedule(); var hasMoreRetries = count <= schedule.Length; eligibleRetryTime = hasMoreRetries ? GetEligibleRetryTime(schedule, count - 1) : (DateTime?)null; status = hasMoreRetries ? Status.Active : Status.Inactive; statusReason = hasMoreRetries ? EntityCacheStatusReason.InProgress : EntityCacheStatusReason.Failed; } crmService.ProcessEntityCache(entityCacheId, status, statusReason, isSuccess, eligibleRetryTime); return(new ConfirmationResponse { StatusCode = HttpStatusCode.OK, Message = string.Empty }); } return(new ConfirmationResponse { Message = string.Format(Messages.MsdCorrelationIdDoesNotExist, entityCacheMessageId), StatusCode = HttpStatusCode.BadRequest }); } catch (Exception ex) { Trace.TraceError("Unexpected error occured at ProcessResponse::Message:{0}||Trace:{1}", ex.Message, ex.StackTrace.ToString()); return(new ConfirmationResponse { Message = Messages.FailedToUpdateEntityCacheMessage, StatusCode = HttpStatusCode.GatewayTimeout }); } }