Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 5
0
        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());
        }
Esempio n. 7
0
        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
                });
            }
        }