public async Task GivenACancelRequest_WhenUserUnauthorized_ThenUnauthorizedFhirExceptionThrown() { var request = new CancelReindexRequest("id"); var jobRecord = new ReindexJobRecord("hash", 1, null); var jobWrapper = new ReindexJobWrapper(jobRecord, WeakETag.FromVersionId("id")); _fhirOperationDataStore.GetReindexJobByIdAsync("id", Arg.Any <CancellationToken>()).Returns(jobWrapper); var authorizationService = Substitute.For <IFhirAuthorizationService>(); authorizationService.CheckAccess(DataActions.Reindex).Returns(DataActions.None); var handler = new CancelReindexRequestHandler(_fhirOperationDataStore, authorizationService); await Assert.ThrowsAsync <UnauthorizedFhirActionException>(() => handler.Handle(request, CancellationToken.None)); }
public async Task GivenACancelRequest_WhenJobCompleted_ThenRequestNotValidExceptionThrown() { var request = new CancelReindexRequest("id"); var jobRecord = new ReindexJobRecord("hash", 1, null) { Status = OperationStatus.Completed, }; var jobWrapper = new ReindexJobWrapper(jobRecord, WeakETag.FromVersionId("id")); _fhirOperationDataStore.GetReindexJobByIdAsync("id", Arg.Any <CancellationToken>()).Returns(jobWrapper); var handler = new CancelReindexRequestHandler(_fhirOperationDataStore, DisabledFhirAuthorizationService.Instance); await Assert.ThrowsAsync <RequestNotValidException>(() => handler.Handle(request, CancellationToken.None)); }
public async Task GivenACancelRequest_WhenJobInProgress_ThenJobUpdatedToCanceled() { var request = new CancelReindexRequest("id"); var jobRecord = new ReindexJobRecord("hash", 1, null) { Status = OperationStatus.Running, }; var jobWrapper = new ReindexJobWrapper(jobRecord, WeakETag.FromVersionId("id")); _fhirOperationDataStore.GetReindexJobByIdAsync("id", Arg.Any <CancellationToken>()).Returns(jobWrapper); _fhirOperationDataStore.UpdateReindexJobAsync(jobRecord, WeakETag.FromVersionId("id"), Arg.Any <CancellationToken>()).Returns(jobWrapper); var handler = new CancelReindexRequestHandler(_fhirOperationDataStore, DisabledFhirAuthorizationService.Instance); var result = await handler.Handle(request, CancellationToken.None); Assert.Equal(OperationStatus.Canceled, result.Job.JobRecord.Status); }
public async Task GivenReindexJobRunning_WhenReindexJobCancelRequest_ThenReindexJobStopsAndMarkedCanceled() { var randomName = Guid.NewGuid().ToString().ComputeHash().Substring(0, 14).ToLower(); string searchParamName = randomName; string searchParamCode = randomName + "Code"; SearchParameter searchParam = await CreateSearchParam(searchParamName, SearchParamType.String, ResourceType.Patient, "Patient.name", searchParamCode); const string sampleName1 = "searchIndicesPatient1"; const string sampleName2 = "searchIndicesPatient2"; const string sampleName3 = "searchIndicesPatient3"; const string sampleName4 = "searchIndicesPatient4"; string sampleId1 = Guid.NewGuid().ToString(); string sampleId2 = Guid.NewGuid().ToString(); string sampleId3 = Guid.NewGuid().ToString(); string sampleId4 = Guid.NewGuid().ToString(); // Set up the values that the search index extraction should return during reindexing var searchValues = new List <(string, ISearchValue)> { (sampleId1, new StringSearchValue(sampleName1)), (sampleId2, new StringSearchValue(sampleName2)), (sampleId3, new StringSearchValue(sampleName3)), (sampleId4, new StringSearchValue(sampleName4)), }; MockSearchIndexExtraction(searchValues, searchParam); UpsertOutcome sample1 = await CreatePatientResource(sampleName1, sampleId1); UpsertOutcome sample2 = await CreatePatientResource(sampleName2, sampleId2); UpsertOutcome sample3 = await CreatePatientResource(sampleName3, sampleId3); UpsertOutcome sample4 = await CreatePatientResource(sampleName4, sampleId4); // Create the query <fhirserver>/Patient?foo=searchIndicesPatient1 var queryParams = new List <Tuple <string, string> > { new(searchParamCode, sampleName1) }; SearchResult searchResults = await _searchService.Value.SearchAsync("Patient", queryParams, CancellationToken.None); // Confirm that the search parameter "foo" is marked as unsupported Assert.Equal(searchParamCode, searchResults.UnsupportedSearchParameters.FirstOrDefault()?.Item1); // When search parameters aren't recognized, they are ignored // Confirm that "foo" is dropped from the query string and all patients are returned Assert.Equal(4, searchResults.Results.Count()); var createReindexRequest = new CreateReindexRequest(1, 1, 500); CreateReindexResponse response = await SetUpForReindexing(createReindexRequest); var cancellationTokenSource = new CancellationTokenSource(); try { var cancelReindexHandler = new CancelReindexRequestHandler(_fhirOperationDataStore, DisabledFhirAuthorizationService.Instance); Task reindexWorkerTask = _reindexJobWorker.ExecuteAsync(cancellationTokenSource.Token); await cancelReindexHandler.Handle(new CancelReindexRequest(response.Job.JobRecord.Id), CancellationToken.None); var reindexWrapper = await _fhirOperationDataStore.GetReindexJobByIdAsync(response.Job.JobRecord.Id, cancellationTokenSource.Token); Assert.Equal(OperationStatus.Canceled, reindexWrapper.JobRecord.Status); } catch (RequestNotValidException ex) { // Despite the settings above of the create reindex request which processes only one resource // every 500ms, sometimes when the test runs the reindex job is completed before the // the cancellation request is processed. We will ignore this error if (!ex.Message.Contains("in state Completed and cannot be cancelled", StringComparison.OrdinalIgnoreCase)) { throw; } } finally { cancellationTokenSource.Cancel(); _searchParameterDefinitionManager.DeleteSearchParameter(searchParam.ToTypedElement()); await _testHelper.DeleteSearchParameterStatusAsync(searchParam.Url, CancellationToken.None); await _fixture.DataStore.HardDeleteAsync(sample1.Wrapper.ToResourceKey(), CancellationToken.None); await _fixture.DataStore.HardDeleteAsync(sample2.Wrapper.ToResourceKey(), CancellationToken.None); await _fixture.DataStore.HardDeleteAsync(sample3.Wrapper.ToResourceKey(), CancellationToken.None); await _fixture.DataStore.HardDeleteAsync(sample4.Wrapper.ToResourceKey(), CancellationToken.None); } }