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; }
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); }
public void WhenValueIsNull_IsTreatedAsValid() { var sut = CreateSut(); SentinelEntryRequest emptyRequest = null; sut.IsValid(emptyRequest).Should().BeTrue(); }
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(); }
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); }
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(); }
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); }
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(); }
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); }
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); }
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); }
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(); }
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); }
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"); }
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); }
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); }