Пример #1
0
        public async Task WhenCreatedWithValidPredecessor_StoresRelationToRepository()
        {
            SentinelEntry createdEntry = null;
            var           sut          = CreateSut(out var repository, out var mapper, "12");
            var           createSentinelEntryRequest = new SentinelEntryRequest {
                PredecessorLaboratoryNumber = "SN-2022-0001"
            };
            var sentinelEntry = new SentinelEntry {
                Id = 124
            };
            var predecessorSentinelEntry = new SentinelEntry {
                Id = 100
            };

            mapper.Map <SentinelEntry>(createSentinelEntryRequest).Returns(sentinelEntry);
            repository.When(r => r.AddAsync(Arg.Any <SentinelEntry>())).Do(call => createdEntry = call.Arg <SentinelEntry>());
            repository.AddAsync(sentinelEntry).Returns(sentinelEntry);
            repository.FirstOrDefaultAsync(Arg.Any <SentinelEntryByLaboratoryNumberSpecification>()).Returns(predecessorSentinelEntry);

            var action = await sut.HandleAsync(createSentinelEntryRequest).ConfigureAwait(true);

            await repository.Received(1).FirstOrDefaultAsync(Arg.Is <SentinelEntryByLaboratoryNumberSpecification>(
                                                                 s => s.Year == 2022 && s.SequentialNumber == 1 && s.ProtectKey == "12")).ConfigureAwait(true);

            createdEntry.PredecessorEntryId.Should().Be(100);
            var createdResult = action.Result.Should().BeOfType <CreatedResult>().Subject;
        }
Пример #2
0
        public async Task WhenFoundButAlreadyArchived_AllowsAccessForSuperUser()
        {
            var user     = new ClaimsPrincipal();
            var identity = new ClaimsIdentity();

            identity.AddClaim(new Claim(identity.RoleClaimType, nameof(Role.SuperUser)));
            user.AddIdentity(identity);
            var sut = CreateSut(out var repository, out _, out _, "12", user);
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567
            };
            var sentinelEntry = new SentinelEntry
            {
                ProtectKey = "12",
                CryoDate   = new DateTime(2010, 10, 10),
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTest>()
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            action.Result.Should().BeOfType <OkObjectResult>();
            await repository.Received(1).UpdateAsync(Arg.Any <SentinelEntry>()).ConfigureAwait(true);
        }
Пример #3
0
        public void WhenValueIsNull_IsTreatedAsValid()
        {
            var sut = CreateSut();
            SentinelEntryRequest emptyRequest = null;

            sut.IsValid(emptyRequest).Should().BeTrue();
        }
Пример #4
0
        public async Task WhenFoundAndUpdateWithoutPredecessor_ClearsPredecessor()
        {
            var sut = CreateSut(out var repository, out var sensitivityTestRepository, out var mapper, "12");
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567
            };
            var sensitivityTest1 = new AntimicrobialSensitivityTest();
            var sentinelEntry    = new SentinelEntry
            {
                ProtectKey = "12",
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTest>
                {
                    sensitivityTest1
                },
                PredecessorEntry   = new SentinelEntry(),
                PredecessorEntryId = 123
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            await sensitivityTestRepository.Received(1).DeleteAsync(sensitivityTest1).ConfigureAwait(true);

            mapper.Received(1).Map(updateSentinelEntry, sentinelEntry);
            var okResult             = action.Result.Should().BeOfType <OkObjectResult>().Subject;
            var updatedSentinelEntry = okResult.Value.As <SentinelEntry>();

            updatedSentinelEntry.PredecessorEntry.Should().BeNull();
            updatedSentinelEntry.PredecessorEntryId.Should().BeNull();
        }
Пример #5
0
        protected override async Task OnInitializedAsync()
        {
            Logger.LogInformation($"Now loading... /SentinelEntry/{(IsEdit()?"Edit":"Create")}");

            Title         = IsEdit() ? "Bearbeiten" : "Neu anlegen";
            PrimaryAction = IsEdit() ? "Speichern" : "Anlegen";

            AllBreakpoints = await ClinicalBreakpointService.List().ConfigureAwait(true);

            if (Id.HasValue)
            {
                var response = await SentinelEntryService.GetById(Id.Value).ConfigureAwait(true);

                LaboratoryNumber = response.LaboratoryNumber;
                if (response.CryoDate.HasValue)
                {
                    CryoBox = response.CryoBox;
                }
                SentinelEntry = response;
            }
            else
            {
                SentinelEntry = new SentinelEntryRequest();
            }

            await base.OnInitializedAsync().ConfigureAwait(true);
        }
Пример #6
0
    public async Task WhenCreate_CallsCorrectUri()
    {
        var sut     = CreateSut(out var httpClient);
        var request = new SentinelEntryRequest();

        await sut.Create(request).ConfigureAwait(true);

        await httpClient.Received(1).Post <SentinelEntryRequest, SentinelEntry>(
            "api/sentinel-entries", request, default, Arg.Is <string>(s => !string.IsNullOrEmpty(s)));
        public void WhenMissingTestsAndNoComment_IsTreatedAsValid()
        {
            var target = new SentinelEntryRequest {
                AntimicrobialSensitivityTests = null
            };
            var context = new ValidationContext(target);
            var results = new List <ValidationResult>();

            Validator.TryValidateObject(target, context, results, true);

            var result = results.SingleOrDefault(r =>
                                                 r.MemberNames.Contains(nameof(SentinelEntryRequest.AntimicrobialSensitivityTests)));

            result.Should().BeNull();
        }
Пример #8
0
        public async Task WhenCreatedWithInvalidPredecessorNumber_BadRequest()
        {
            var sut = CreateSut(out var repository, out var mapper, "12");
            var createSentinelEntryRequest = new SentinelEntryRequest()
            {
                PredecessorLaboratoryNumber = "SN-3022-0001"
            };
            var sentinelEntry = new SentinelEntry {
                Id = 123
            };

            var action = await sut.HandleAsync(createSentinelEntryRequest).ConfigureAwait(true);

            action.Result.Should().BeOfType <BadRequestObjectResult>();
            await repository.Received(0).AddAsync(sentinelEntry).ConfigureAwait(true);
        }
Пример #9
0
        public void WhenValueIsSetForNormalUnit_IsTreatedAsValid(InternalHospitalDepartmentType validType)
        {
            var sut          = CreateSut();
            var noNormalUnit = new SentinelEntryRequest
            {
                HospitalDepartmentType         = HospitalDepartmentType.NormalUnit,
                HospitalDepartment             = HospitalDepartment.Internal,
                InternalHospitalDepartmentType = validType
            };
            var validationContext = new ValidationContext(noNormalUnit)
            {
                MemberName = "ValidatedProperty"
            };
            var result = sut.GetValidationResult(noNormalUnit, validationContext);

            result.Should().BeNull();
        }
        public void WhenEmptyTestsAndNoComment_IsTreatedAsInvalid(string remark)
        {
            var target = new SentinelEntryRequest()
            {
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTestRequest>(),
                Remark = remark
            };
            var context = new ValidationContext(target);
            var results = new List <ValidationResult>();

            Validator.TryValidateObject(target, context, results, true);

            var result = results.SingleOrDefault(r =>
                                                 r.MemberNames.Contains(nameof(SentinelEntryRequest.AntimicrobialSensitivityTests)));

            result.Should().NotBe(null, $"{nameof(SentinelEntryRequest.AntimicrobialSensitivityTests)} should be invalid");
        }
        public void WhenEmptyTestsWithComment_IsTreatedAsValid()
        {
            var target = new SentinelEntryRequest()
            {
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTestRequest>(),
                Remark = "We were to lazy for sensitivity tests :/"
            };
            var context = new ValidationContext(target);
            var results = new List <ValidationResult>();

            Validator.TryValidateObject(target, context, results, true);

            var result = results.SingleOrDefault(r =>
                                                 r.MemberNames.Contains(nameof(SentinelEntryRequest.AntimicrobialSensitivityTests)));

            result.Should().BeNull();
        }
Пример #12
0
        public async Task WhenFoundButInvalidPredecessorNumber_BadRequest()
        {
            var sut = CreateSut(out var repository, out _, out _, "12");
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567, PredecessorLaboratoryNumber = "Test"
            };
            var sentinelEntry = new SentinelEntry
            {
                ProtectKey = "12",
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTest>()
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            action.Result.Should().BeOfType <BadRequestObjectResult>();
            await repository.Received(0).UpdateAsync(Arg.Any <SentinelEntry>()).ConfigureAwait(true);
        }
Пример #13
0
    public static async Task <bool> ResolvePredecessor(SentinelEntryRequest request, SentinelEntry newEntry,
                                                       IAsyncRepository <SentinelEntry> repository, string organizationId, ModelStateDictionary modelState)
    {
        if (string.IsNullOrEmpty(request.PredecessorLaboratoryNumber))
        {
            return(false);
        }

        var predecessor = await repository.FirstOrDefaultAsync(
            new SentinelEntryByLaboratoryNumberSpecification(request.PredecessorLaboratoryNumber, organizationId)).ConfigureAwait(false);

        if (predecessor == null)
        {
            modelState.AddModelError($"{nameof(SentinelEntryRequest.PredecessorLaboratoryNumber)}", "Laboratory number can not be found");
            return(true);
        }

        newEntry.PredecessorEntryId = predecessor.Id;
        return(false);
    }
Пример #14
0
        public async Task WhenFoundWithinAnotherOrganization_Returns404()
        {
            var sut = CreateSut(out var repository, out var sensitivityTestRepository, out var mapper, "12");
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567
            };
            var sentinelEntry = new SentinelEntry
            {
                ProtectKey = "24"
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            action.Result.Should().BeOfType <NotFoundResult>();
            await repository.Received(0).UpdateAsync(Arg.Any <SentinelEntry>()).ConfigureAwait(true);

            mapper.Received(0).Map(updateSentinelEntry, sentinelEntry);
        }
Пример #15
0
        public void WhenValueIsMissingForNormalUnit_IsTreatedAsInvalid()
        {
            var sut          = CreateSut();
            var noNormalUnit = new SentinelEntryRequest
            {
                HospitalDepartmentType         = HospitalDepartmentType.NormalUnit,
                HospitalDepartment             = HospitalDepartment.Internal,
                InternalHospitalDepartmentType = InternalHospitalDepartmentType.NoInternalDepartment
            };
            var validationContext = new ValidationContext(noNormalUnit)
            {
                MemberName = "ValidatedProperty"
            };
            var result = sut.GetValidationResult(noNormalUnit, validationContext);

            result.Should().NotBeNull();
            result?.MemberNames.Should().BeEquivalentTo(new List <string> {
                "ValidatedProperty"
            });
            result?.ErrorMessage.Should().NotBeEmpty();
        }
Пример #16
0
        public async Task WhenFoundButAlreadyArchived_DeniesAccess()
        {
            var sut = CreateSut(out var repository, out _, out _, "12");
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567
            };
            var sentinelEntry = new SentinelEntry
            {
                ProtectKey = "12",
                CryoDate   = new DateTime(2010, 10, 10),
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTest>()
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            action.Result.Should().BeOfType <ForbidResult>();
            await repository.Received(0).UpdateAsync(Arg.Any <SentinelEntry>()).ConfigureAwait(true);
        }
Пример #17
0
        public async Task WhenCreated_MapsAndStoresToRepository()
        {
            var sut = CreateSut(out var repository, out var mapper, "12");
            var createSentinelEntryRequest = new SentinelEntryRequest();
            var sentinelEntry = new SentinelEntry {
                Id = 123
            };

            mapper.Map <SentinelEntry>(createSentinelEntryRequest).Returns(sentinelEntry);
            repository.AddAsync(sentinelEntry).Returns(sentinelEntry);

            var action = await sut.HandleAsync(createSentinelEntryRequest).ConfigureAwait(true);

            await repository.Received(1).AddAsync(sentinelEntry).ConfigureAwait(true);

            sentinelEntry.ProtectKey.Should().Be("12");
            var createdResult = action.Result.Should().BeOfType <CreatedResult>().Subject;

            createdResult.Value.Should().Be(sentinelEntry);
            createdResult.Location.Should().Be("http://localhost/api/sentinel-entries/123");
        }
Пример #18
0
        public async Task WhenFound_ReturnsCorrespondingObject()
        {
            var sut = CreateSut(out var repository, out var sensitivityTestRepository, out var mapper, "12");
            var updateSentinelEntry = new SentinelEntryRequest {
                Id = 567, PredecessorLaboratoryNumber = "SN-3030-0303"
            };
            var sensitivityTest1 = new AntimicrobialSensitivityTest();
            var sensitivityTest2 = new AntimicrobialSensitivityTest();
            var sentinelEntry    = new SentinelEntry
            {
                ProtectKey = "12",
                AntimicrobialSensitivityTests = new List <AntimicrobialSensitivityTest>
                {
                    sensitivityTest1, sensitivityTest2
                }
            };
            var predecessorSentinelEntry = new SentinelEntry {
                Id = 303
            };

            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryByLaboratoryNumberSpecification>(s => s.Year == 3030 && s.SequentialNumber == 303)).Returns(predecessorSentinelEntry);
            repository.FirstOrDefaultAsync(Arg.Is <SentinelEntryIncludingTestsSpecification>(specification => specification.Id == 567))
            .Returns(Task.FromResult(sentinelEntry));

            var action = await sut.HandleAsync(updateSentinelEntry).ConfigureAwait(true);

            await sensitivityTestRepository.Received(1).DeleteAsync(sensitivityTest1).ConfigureAwait(true);

            await sensitivityTestRepository.Received(1).DeleteAsync(sensitivityTest2).ConfigureAwait(true);

            mapper.Received(1).Map(updateSentinelEntry, sentinelEntry);
            var okResult = action.Result.Should().BeOfType <OkObjectResult>().Subject;

            okResult.Value.Should().Be(sentinelEntry);
            okResult.Value.As <SentinelEntry>().PredecessorEntryId.Should().Be(303);
        }
Пример #19
0
        private static async Task <SentinelEntryResponse?> CreateValidEntry(HttpClient client, SentinelEntryRequest predecessor)
        {
            var response = await client.PostAsJsonAsync("api/sentinel-entries", predecessor).ConfigureAwait(true);

            response.StatusCode.Should().Be(HttpStatusCode.Created);
            var createdEntryPath = response.Headers.Location?.AbsolutePath;
            var createdEntry     = await client.GetFromJsonAsync <SentinelEntryResponse>(createdEntryPath).ConfigureAwait(true);

            createdEntry !.Id.Should().BeGreaterThan(0);
            response.StatusCode.Should().Be(HttpStatusCode.Created);
            return(createdEntry);
        }