示例#1
0
        public void WhenTypeIsCINAndEndDateAndStartDateAreNotProvidedItDoesNotUpdateOtherDataColumnsThanTheNote()
        {
            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);

            caseStatus.Type    = "CIN";
            caseStatus.EndDate = null;
            DatabaseContext.SaveChanges();

            var request = TestHelpers.CreateUpdateCaseStatusRequest();

            request.EndDate      = null;
            request.StartDate    = null;
            request.Notes        = "New note";
            request.CaseStatusId = caseStatus.Id;

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            updatedCaseStatus.PersonId.Should().Be(caseStatus.PersonId);
            updatedCaseStatus.EndDate.Should().Be(caseStatus.EndDate);
            updatedCaseStatus.Type.Should().Be(caseStatus.Type);
            updatedCaseStatus.StartDate.Should().Be(caseStatus.StartDate);
            updatedCaseStatus.Notes.Should().Be(request.Notes);
            updatedCaseStatus.LastModifiedBy.Should().Be(request.EditedBy);
        }
示例#2
0
        public void WhenTypeIsCPAndEndDateIsNotProvidedItCopiesTheCaseStatusAnswersEndDateWhenThereIsOneActiveSetOfAnswersAndAlsoScheduledAnswers()
        {
            var activeGroupId    = Guid.NewGuid().ToString();
            var scheduledGroupId = Guid.NewGuid().ToString();

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);
            caseStatus.Type       = "CP";
            caseStatus.EndDate    = null;
            caseStatus.StartDate  = new DateTime(2021, 11, 01);

            var activeAnswers    = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-20), endDate: DateTime.Today.AddDays(50), groupId: activeGroupId);
            var scheduledAnswers = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(50), endDate: null, groupId: scheduledGroupId);

            caseStatus.Answers = new List <CaseStatusAnswer>();
            caseStatus.Answers.AddRange(activeAnswers);
            caseStatus.Answers.AddRange(scheduledAnswers);
            DatabaseContext.SaveChanges();

            var request = TestHelpers.CreateUpdateCaseStatusRequest(min: 1, max: 1);

            request.EndDate      = null;
            request.CaseStatusId = caseStatus.Id;
            request.StartDate    = DateTime.Today.AddDays(-17);

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            updatedCaseStatus.StartDate.Should().Be(request.StartDate.Value);
            var newCaseStatusAnswers = updatedCaseStatus.Answers.Where(x => x.GroupId != activeGroupId && x.GroupId != scheduledGroupId && x.StartDate <= DateTime.Today);

            newCaseStatusAnswers.All(x => x.EndDate == activeAnswers.FirstOrDefault().EndDate).Should().BeTrue();
        }
示例#3
0
        public void AddsNewEpisodeReasonAnswerUsingTheStartAndEndDateOfTheCurrentAnswers()
        {
            var personId = 123;
            var groupId  = Guid.NewGuid().ToString();
            var currentActiveAnswersStartDate = DateTime.Today.AddDays(-10);

            var caseStatus = TestHelpers.CreateCaseStatus(type: "LAC", personId: personId);

            var currentActiveAnswers = TestHelpers.CreateCaseStatusAnswers(caseStatusId: caseStatus.Id, startDate: currentActiveAnswersStartDate, min: 2, max: 2, groupId: groupId);

            caseStatus.Answers = new List <CaseStatusAnswerInfrastructure>();
            caseStatus.Answers.AddRange(currentActiveAnswers);
            DatabaseContext.CaseStatuses.Add(caseStatus);
            DatabaseContext.SaveChanges();

            var requestAnswer = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: 1, max: 1);

            var request = CaseStatusHelper.CreateCaseStatusAnswerRequest(caseStatusId: caseStatus.Id, answers: requestAnswer, startDate: DateTime.Today.AddDays(-2));

            _caseStatusGateway.ReplaceCaseStatusAnswers(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault();

            updatedCaseStatus.Answers.Where(x => x.GroupId == groupId).Count().Should().Be(3);

            var episodeEndReasonAnswer = updatedCaseStatus.Answers.Where(x => x.GroupId == groupId && x.Option == CaseStatusAnswerOption.EpisodeReason && x.Value == CaseStatusAnswerValue.X1).FirstOrDefault();

            episodeEndReasonAnswer.Should().NotBeNull();
            episodeEndReasonAnswer.StartDate.Should().Be(currentActiveAnswersStartDate);
            episodeEndReasonAnswer.EndDate.Should().Be(request.StartDate);
            episodeEndReasonAnswer.CreatedBy = request.CreatedBy;
        }
示例#4
0
        public void WhenTypeIsCPAndEndDateIsNotProvidedItDoesNotUpdateTheCaseStartDateWhenThereIsMoreThanOneSetOfAnswers()
        {
            var activeGroupId  = Guid.NewGuid().ToString();
            var activeGroupId2 = Guid.NewGuid().ToString();

            var request = TestHelpers.CreateUpdateCaseStatusRequest(min: 1, max: 1);

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);

            var answers  = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-3), endDate: DateTime.Today.AddDays(-2), discardedAt: null, groupId: activeGroupId);
            var answers2 = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-2), endDate: null, discardedAt: null, groupId: activeGroupId2);

            caseStatus.Answers = answers;
            caseStatus.Type    = "CP";
            caseStatus.EndDate = null;

            DatabaseContext.SaveChanges();

            request.EndDate      = null;
            request.CaseStatusId = caseStatus.Id;
            request.StartDate    = DateTime.Now.AddDays(-1);

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            updatedCaseStatus.LastModifiedBy.Should().Be(request.EditedBy);
            updatedCaseStatus.StartDate.Should().Be(caseStatus.StartDate);
        }
示例#5
0
        public void WhenTypeIsCINAndValidEndDateIsProvidedItUpdatesTheStatusWithNewEndDateWithoutSettingEndDateOrDiscardedAtForAnswers()
        {
            var request = TestHelpers.CreateUpdateCaseStatusRequest();

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);
            var answer = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1).FirstOrDefault();

            caseStatus.Answers = new List <CaseStatusAnswer>()
            {
                answer
            };
            caseStatus.Type    = "CIN";
            caseStatus.EndDate = null;

            DatabaseContext.SaveChanges();
            request.CaseStatusId = caseStatus.Id;

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            updatedCaseStatus.EndDate.Should().NotBeNull();
            updatedCaseStatus.LastModifiedBy.Should().Be(request.EditedBy);

            updatedCaseStatus.Answers.Count.Should().Be(1);
            updatedCaseStatus.Answers.First().EndDate.Should().BeNull();
            updatedCaseStatus.Answers.First().DiscardedAt.Should().BeNull();
        }
示例#6
0
        public void WhenTypeIsCPAndEndDateIsNotProvidedAndTheStartDateDoesNotOverlapWithThePreviousStartDateItIsValid()
        {
            var previousGroupId = Guid.NewGuid().ToString();
            var activeGroupId   = Guid.NewGuid().ToString();

            var request = TestHelpers.CreateUpdateCaseStatusRequest(min: 1, max: 1);

            request.EndDate = null;

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);

            var previousAnswers = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-50), endDate: DateTime.Today.AddDays(-40), discardedAt: null, groupId: previousGroupId);
            var activeAnswers   = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-40), endDate: null, discardedAt: null, groupId: activeGroupId);

            caseStatus.Answers = new List <CaseStatusAnswer>();
            caseStatus.Answers.AddRange(previousAnswers);
            caseStatus.Answers.AddRange(activeAnswers);

            caseStatus.Type    = "CP";
            caseStatus.EndDate = null;

            DatabaseContext.SaveChanges();

            request.CaseStatusId = caseStatus.Id;
            request.StartDate    = DateTime.Now.AddDays(-49).Date;

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            var newAnswers = updatedCaseStatus.Answers.Where(x => x.GroupId != activeGroupId && x.GroupId != previousGroupId && x.EndDate == null);

            newAnswers.All(x => x.StartDate == request.StartDate).Should().BeTrue();
        }
示例#7
0
        public void WhenTypeIsCPAndValidEndDateIsProvidedAndThereAreScheduledAnswersItDiscardsTheScheduledAnswers()
        {
            var scheduledGroupId = Guid.NewGuid().ToString();

            var request = TestHelpers.CreateUpdateCaseStatusRequest(min: 1, max: 1);

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);
            var scheduledAnswersStartDate = DateTime.Today.AddDays(5);

            var currentAnswers   = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, endDate: scheduledAnswersStartDate, discardedAt: null, startDate: DateTime.Today.AddDays(-10));
            var scheduledAnswers = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, endDate: null, discardedAt: null, startDate: scheduledAnswersStartDate, groupId: scheduledGroupId);

            caseStatus.Answers = new List <CaseStatusAnswer>();
            caseStatus.Answers.AddRange(scheduledAnswers);
            caseStatus.Answers.AddRange(currentAnswers);
            caseStatus.Type    = "CP";
            caseStatus.EndDate = null;

            DatabaseContext.SaveChanges();
            request.CaseStatusId = caseStatus.Id;

            _caseStatusGateway.UpdateCaseStatus(request);

            var updatedCaseStatus = DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);

            updatedCaseStatus.EndDate.Should().NotBeNull();
            updatedCaseStatus.LastModifiedBy.Should().Be(request.EditedBy);

            updatedCaseStatus.Answers.Count.Should().Be(3);

            updatedCaseStatus.Answers.Where(x => x.GroupId == scheduledGroupId).All(x => x.EndDate == null).Should().BeTrue();
            updatedCaseStatus.Answers.Where(x => x.GroupId == scheduledGroupId).All(x => x.DiscardedAt != null).Should().BeTrue();
            updatedCaseStatus.Answers.Where(x => x.GroupId == scheduledGroupId).All(x => x.LastModifiedBy == request.EditedBy).Should().BeTrue();
        }
示例#8
0
        public void WhenTypeIsCPAndEndDateIsNotProvidedAndTheStartDateOverlapsWithThePreviousStartDateItThrowsInvalidStartDateException()
        {
            var previousGroupId = Guid.NewGuid().ToString();
            var activeGroupId   = Guid.NewGuid().ToString();

            var request = TestHelpers.CreateUpdateCaseStatusRequest(min: 1, max: 1);

            request.EndDate = null;

            var(caseStatus, _, _) = CaseStatusHelper.SavePersonWithCaseStatusToDatabase(DatabaseContext);

            var previousAnswers = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-50), endDate: DateTime.Today.AddDays(-40), discardedAt: null, groupId: previousGroupId);
            var activeAnswers   = TestHelpers.CreateCaseStatusAnswers(min: 1, max: 1, startDate: DateTime.Today.AddDays(-40), endDate: null, discardedAt: null, groupId: activeGroupId);

            caseStatus.Answers = new List <CaseStatusAnswer>();
            caseStatus.Answers.AddRange(previousAnswers);
            caseStatus.Answers.AddRange(activeAnswers);

            caseStatus.Type    = "CP";
            caseStatus.EndDate = null;

            DatabaseContext.SaveChanges();

            request.CaseStatusId = caseStatus.Id;
            request.StartDate    = DateTime.Now.AddDays(-50).Date;

            Action act = () => _caseStatusGateway.UpdateCaseStatus(request);

            act.Should().Throw <InvalidStartDateException>().WithMessage("Start date overlaps with previous status start date.");

            DatabaseContext.CaseStatuses.FirstOrDefault(x => x.Id == caseStatus.Id);
        }
示例#9
0
        public void WhenMatchingIDReturnsActiveCaseStatusesWhenMultiple()
        {
            var(_, person) = CaseStatusHelper.SavePersonWithMultipleCaseStatusToDatabase(DatabaseContext);

            var response = _caseStatusGateway.GetActiveCaseStatusesByPersonId(person.Id);

            response.Count.Should().Be(2);
        }
示例#10
0
        public void WhenMatchingIDAndPastCaseStatusReturnEmptyList()
        {
            var(_, person) = CaseStatusHelper.SavePersonWithPastCaseStatusToDatabase(DatabaseContext);

            var response = _caseStatusGateway.GetActiveCaseStatusesByPersonId(person.Id);

            response.Should().BeEmpty();
        }
        public void WhenStartDateIsInThePastReturnsItIsValid()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusRequest(startDate: DateTime.Today.AddDays(-2));

            var response = _createCaseStatusRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeTrue();
        }
示例#12
0
        public void WhenNoOverlappingDatesNoCaseStatusesReturned()
        {
            var(_, person) = CaseStatusHelper.SavePersonWithPastCaseStatusToDatabase(DatabaseContext);

            var response = _caseStatusGateway.GetClosedCaseStatusesByPersonIdAndDate(person.Id, DateTime.Today);

            response.Should().BeEmpty();
        }
示例#13
0
        public void ReplaceActiveCaseStatusAnswersThrowsAnExceptionWhenCaseStatusNotFound()
        {
            var request = CaseStatusHelper.CreateCaseStatusAnswerRequest();

            Action act = () => _caseStatusGateway.ReplaceCaseStatusAnswers(request);

            act.Should().Throw <CaseStatusDoesNotExistException>().WithMessage($"Case status id {request.CaseStatusId} does not exist.");
        }
        public void WhenRequestIsValidReturnsItIsValid()
        {
            var validRequest = CaseStatusHelper.CreateCaseStatusRequest();

            var response = _createCaseStatusRequestValidator.Validate(validRequest);

            response.IsValid.Should().BeTrue();
        }
示例#15
0
        public void WhenOverlappingDatesReturnsCaseStatusWithOverlappingDates()
        {
            var(caseStatus, person) = CaseStatusHelper.SavePersonWithPastCaseStatusToDatabase(DatabaseContext);

            var response = _caseStatusGateway.GetClosedCaseStatusesByPersonIdAndDate(caseStatus.PersonId, DateTime.Today.AddDays(-2));

            response.Count.Should().Be(1);
        }
        public void WhenStartDateIsInTheFutureReturnsErrorWithMessage()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusRequest(startDate: DateTime.Today.AddDays(1));

            var response = _createCaseStatusRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'start_date' must be today or in the past");
        }
        public void WhenTypeIsNotCPorCINorLACReturnsErrorWithMessage()
        {
            var validRequest = CaseStatusHelper.CreateCaseStatusRequest(type: "random");

            var response = _createCaseStatusRequestValidator.Validate(validRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'type' must be CIN, CP or LAC.");
        }
        public void WhenCreatedByIsNotAnEmailAddressReturnsErrorWithMessage()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusRequest(createdBy: "foobar");

            var response = _createCaseStatusRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'createdBy' must be an email address.");
        }
示例#19
0
        public void WhenStartDateIsDefaultDateTimeValueReturnsErrorWithMessage()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusAnswerRequest(startDate: DateTime.MinValue);

            var response = _createCaseStatusAnswerRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'startDate' must have a valid value");
        }
        public void CallsCaseStatusUseCaseToCreateCaseStatus()
        {
            _mockCaseStatusesUseCase.Setup(x => x.ExecutePost(It.IsAny <CreateCaseStatusRequest>()));
            var request = CaseStatusHelper.CreateCaseStatusRequest();

            _caseStatusController.CreateCaseStatus(request);

            _mockCaseStatusesUseCase.Verify(x => x.ExecutePost(request));
        }
示例#21
0
        public void WhenMatchingIDReturnsActiveCaseStatusesWithNoActiveAnswers()
        {
            var(_, person, _) = CaseStatusHelper.SavePersonCaseStatusWithAnswersToDatabase(DatabaseContext, endDate: DateTime.Today.AddDays(-1));

            var response = _caseStatusGateway.GetActiveCaseStatusesByPersonId(person.Id);

            response.First().Answers.Count.Should().Be(1);
            response.First().Answers.First().EndDate.Should().NotBeNull();
        }
        public void WhenNotesIsAbove1000CharactersReturnsErrorWithMessage()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusRequest(notes: _faker.Random.String(1001));

            var response = _createCaseStatusRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'notes' must be less than or equal to 1,000 characters.");
        }
        public void WhenTypeIsLACAndTheAnswerCountIsOneReturnsItIsValid()
        {
            var answers = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: 2, max: 2);

            var request = CaseStatusHelper.CreateCaseStatusRequest(answers: answers);

            var response = _createCaseStatusRequestValidator.Validate(request);

            response.IsValid.Should().BeTrue();
        }
 public void SetUp()
 {
     _mockCaseStatusGateway = new Mock <ICaseStatusGateway>();
     _mockDatabaseGateway   = new Mock <IDatabaseGateway>();
     _caseStatusesUseCase   = new CaseStatusesUseCase(_mockCaseStatusGateway.Object, _mockDatabaseGateway.Object);
     _request             = CaseStatusHelper.CreateCaseStatusAnswerRequest();
     _lacCaseStatusDomain = CaseStatusHelper.CreateCaseStatus(type: "LAC").ToDomain();
     _worker        = TestHelpers.CreateWorker();
     _lacCaseStatus = TestHelpers.CreateCaseStatus(type: "LAC");
 }
        public void WhenTypeIsLACAndProvidedAnswersCountIsNotOneItThrowsInvalidCaseStatusAnswersRequestException()
        {
            _mockCaseStatusGateway.Setup(x => x.GetCasesStatusByCaseStatusId(It.IsAny <long>())).Returns(_lacCaseStatus.ToDomain());

            _request.Answers = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: 5, max: 5);

            Action act = () => _caseStatusesUseCase.ExecutePostCaseStatusAnswer(_request);

            act.Should().Throw <InvalidCaseStatusAnswersRequestException>().WithMessage("LAC must have only two answers");
        }
示例#26
0
        public void WhenAnswerCountIsNotOneOrTwoReturnsErrorWithMessage(int answerCount)
        {
            var answers = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: answerCount, max: answerCount);

            var request = CaseStatusHelper.CreateCaseStatusAnswerRequest(answers: answers);

            var response = _createCaseStatusAnswerRequestValidator.Validate(request);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "Provide either one or two answers only");
        }
示例#27
0
 public void SetUp()
 {
     _answers = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: 1, max: 1);
     _mockCaseStatusGateway = new Mock <ICaseStatusGateway>();
     _mockDatabaseGateway   = new Mock <IDatabaseGateway>();
     _caseStatusesUseCase   = new CaseStatusesUseCase(_mockCaseStatusGateway.Object, _mockDatabaseGateway.Object);
     _request            = CaseStatusHelper.CreateCaseStatusAnswerRequest(answers: _answers);
     _cpCaseStatusDomain = CaseStatusHelper.CreateCaseStatus(type: "CP").ToDomain();
     _worker             = TestHelpers.CreateWorker();
     _cpCaseStatus       = TestHelpers.CreateCaseStatus(type: "CP");
 }
示例#28
0
        public void WhenRequestIsValidReturnsSuccessfulResponse()
        {
            var caseStatusDomain = CaseStatusHelper.CreateCaseStatus().ToDomain();

            _mockCaseStatusesUseCase.Setup(x => x.ExecutePostCaseStatusAnswer(_request)).Returns(caseStatusDomain.ToResponse());

            var response = _caseStatusController.CreateCaseStatusAnswers(_request) as ObjectResult;

            response?.StatusCode.Should().Be(201);
            response?.Value.Should().Be("Successfully created case status answers.");
        }
        public void WhenTypeIsLACAndTheAnswerCountIsNotTwoReturnsErrorWithMessage(int answerCount)
        {
            var answers = CaseStatusHelper.CreateCaseStatusRequestAnswers(min: answerCount, max: answerCount);

            var request = CaseStatusHelper.CreateCaseStatusRequest(answers: answers, type: "LAC");

            var response = _createCaseStatusRequestValidator.Validate(request);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "LAC type must have two answers only");
        }
        public void WhenStartDateIsNotProvidedReturnsErrorMessage()
        {
            var badRequest = CaseStatusHelper.CreateCaseStatusRequest();

            badRequest.StartDate = DateTime.MinValue;

            var response = _createCaseStatusRequestValidator.Validate(badRequest);

            response.IsValid.Should().BeFalse();
            response.Errors.Should().Contain(e => e.ErrorMessage == "'startDate' must be provided.");
        }