public void CreateDuplicate_Is_Valid()
        {
            var identifier = new Identifier("testsystem", "testvalue");
            var actual     = OperationOutcomeFactory.CreateDuplicateRequest(identifier);

            Assert.IsType <OperationOutcome>(actual);

            //Assert.NotNull(actual.Meta);
            //Assert.NotNull(actual.Meta.Profile);
            //Assert.NotEmpty(actual.Meta.Profile);
            //Assert.Contains("https://fhir.nhs.uk/STU3/StructureDefinition/Spine-OperationOutcome-1-0", actual.Meta.Profile);

            Assert.NotNull(actual.Issue);
            Assert.NotEmpty(actual.Issue);

            Assert.Equal("Duplicate masterIdentifier value: testvalue system: testsystem", actual.Issue.First().Diagnostics);
            Assert.Equal(OperationOutcome.IssueType.Duplicate.ToString(), actual.Issue.First().Code.ToString());
            Assert.Equal(OperationOutcome.IssueSeverity.Error.ToString(), actual.Issue.First().Severity.ToString());

            Assert.NotNull(actual.Issue.First().Details);
            Assert.NotNull(actual.Issue.First().Details.Coding);
            Assert.NotEmpty(actual.Issue.First().Details.Coding);

            Assert.Equal("DUPLICATE_REJECTED", actual.Issue.First().Details.Coding.First().Code);
            Assert.Equal("Duplicate DocumentReference", actual.Issue.First().Details.Coding.First().Display);
        }
        public void CreateDuplicate_Is_Valid()
        {
            var identifier = new Identifier("testsystem", "testvalue");
            var actual     = OperationOutcomeFactory.CreateDuplicateRequest(identifier);

            Assert.IsType <OperationOutcome>(actual);

            Assert.NotNull(actual.Issue);
            Assert.NotEmpty(actual.Issue);

            Assert.Equal("Duplicate masterIdentifier value: testvalue system: testsystem", actual.Issue.First().Diagnostics);
            Assert.Equal(OperationOutcome.IssueType.Duplicate.ToString(), actual.Issue.First().Code.ToString());
            Assert.Equal(OperationOutcome.IssueSeverity.Error.ToString(), actual.Issue.First().Severity.ToString());

            Assert.NotNull(actual.Issue.First().Details);
            Assert.NotNull(actual.Issue.First().Details.Coding);
            Assert.NotEmpty(actual.Issue.First().Details.Coding);

            Assert.Equal("DUPLICATE_REJECTED", actual.Issue.First().Details.Coding.First().Code);
            Assert.Equal("Duplicate DocumentReference", actual.Issue.First().Details.Coding.First().Display);
        }
        public async SystemTasks.Task <OperationOutcome> ValidateCreate(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;

            // NRLS Layers of validation before Fhir Search Call
            var document = request.Resource as DocumentReference;

            //NRL Pointer validation
            var validProfile = _fhirValidation.ValidPointer(document);

            if (!validProfile.Success)
            {
                throw new HttpFhirException("Invalid NRLS Pointer", validProfile, HttpStatusCode.BadRequest);
            }


            //Now we need to do some additional validation on ODS codes && Master Ids
            //We need to use an external source (in reality yes but we are just going to do an internal query to fake ods & pointer search)

            if (document.MasterIdentifier != null)
            {
                var nhsNumber = _fhirValidation.GetSubjectReferenceId(document.Subject);

                var masterIdentifierRequest = NrlsPointerHelper.CreateMasterIdentifierSearch(request, document.MasterIdentifier, nhsNumber);
                var miPointers = await _fhirSearch.GetByMasterId <DocumentReference>(masterIdentifierRequest);

                if (miPointers.Entry.Count > 0)
                {
                    return(OperationOutcomeFactory.CreateDuplicateRequest(document.MasterIdentifier));
                }
            }


            var custodianOrgCode = _fhirValidation.GetOrganizationReferenceId(document.Custodian);

            var invalidAsid = InvalidAsid(custodianOrgCode, request.RequestingAsid);

            if (invalidAsid != null)
            {
                return(invalidAsid);
            }

            var custodianRequest = NrlsPointerHelper.CreateOrgSearch(request, custodianOrgCode);
            var custodians       = await _fhirSearch.Find <Organization>(custodianRequest);

            if (custodians.Entry.Count == 0)
            {
                return(OperationOutcomeFactory.CreateOrganizationNotFound(custodianOrgCode));
            }

            var authorOrgCode = _fhirValidation.GetOrganizationReferenceId(document.Author?.FirstOrDefault());
            var authorRequest = NrlsPointerHelper.CreateOrgSearch(request, authorOrgCode);
            var authors       = await _fhirSearch.Find <Organization>(authorRequest);

            if (authors.Entry.Count == 0)
            {
                return(OperationOutcomeFactory.CreateOrganizationNotFound(authorOrgCode));
            }

            //To better mimic NRL here we would create a new patient record for a patient that is not currently know (aka no clinical record)

            return(null);
        }