diff --git a/src/In.ProjectEKA.DefaultHip/Link/PatientRepository.cs b/src/In.ProjectEKA.DefaultHip/Link/PatientRepository.cs index 5709ae6a..7e7a5f8a 100644 --- a/src/In.ProjectEKA.DefaultHip/Link/PatientRepository.cs +++ b/src/In.ProjectEKA.DefaultHip/Link/PatientRepository.cs @@ -30,7 +30,7 @@ public Option PatientWith(string referenceNumber) return Option.None(); } } - + private IEnumerable All() { var patientsInfo = FileReader.ReadJson(filePath); diff --git a/src/In.ProjectEKA.DefaultHip/Patient/MaskingUtility.cs b/src/In.ProjectEKA.DefaultHip/Patient/MaskingUtility.cs new file mode 100644 index 00000000..2d4add06 --- /dev/null +++ b/src/In.ProjectEKA.DefaultHip/Patient/MaskingUtility.cs @@ -0,0 +1,69 @@ +namespace In.ProjectEKA.DefaultHip.Patient +{ + using System.Collections.Generic; + using System.Linq; + using HipLibrary.Patient; + + public class MaskingUtility : IMaskUtility + { + private static Dictionary maskedDataMap = new Dictionary(); + + public string MaskReference(string referenceNumber) + { + var maskedPatientReferenceNumber = ""; + if (referenceNumber.Length > 2) + { + maskedPatientReferenceNumber = string.Concat( + "".PadLeft(referenceNumber.Length - 2, 'X'), + referenceNumber.Substring(referenceNumber.Length - 2)); + } + else + { + maskedPatientReferenceNumber = "XXX" + referenceNumber; + } + + if (!maskedDataMap.ContainsKey(referenceNumber)) + { + maskedDataMap.Add(referenceNumber, maskedPatientReferenceNumber); + } + + return maskedPatientReferenceNumber; + } + + public string MaskMobileNumber(string mobileNumber) + { + var number = mobileNumber; + var paddingBit = "".PadLeft(mobileNumber.Length - 8, 'X'); + return string.Concat( + number.Substring(0, 6) + + paddingBit, + number.Substring(mobileNumber.Length - 2)); + } + + public string MaskCareContextDisplay(string referenceNumber) + { + return string.Concat( + "".PadLeft(referenceNumber.Length - 4, 'X'), + referenceNumber.Substring(referenceNumber.Length - 2)); + } + + public string UnmaskData(string maskedData) + { + var keysWithMatchingValues = maskedDataMap.Where(p => p.Value == maskedData).Select(p => p.Key); + return keysWithMatchingValues.First(); + } + + public string MaskPatientName(string patientName) + { + if (patientName.Length >= 5) + { + return string.Concat( + patientName.Substring(0, 2) + + "".PadLeft(patientName.Length - 4, 'X'), + patientName.Substring(patientName.Length - 2)); + } + + return "XXX" + patientName; + } + } +} \ No newline at end of file diff --git a/src/In.ProjectEKA.HipLibrary/Patient/IMaskUtility.cs b/src/In.ProjectEKA.HipLibrary/Patient/IMaskUtility.cs new file mode 100644 index 00000000..85862621 --- /dev/null +++ b/src/In.ProjectEKA.HipLibrary/Patient/IMaskUtility.cs @@ -0,0 +1,11 @@ +namespace In.ProjectEKA.HipLibrary.Patient +{ + public interface IMaskUtility + { + string MaskReference(string referenceNumber); + string MaskCareContextDisplay(string referenceNumber); + string UnmaskData(string maskedData); + string MaskMobileNumber(string mobileNumber); + + } +} \ No newline at end of file diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextEnquiry.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextEnquiry.cs index c5453bfa..58ab82ca 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextEnquiry.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextEnquiry.cs @@ -2,7 +2,7 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model { public class CareContextEnquiry { - public string ReferenceNumber { get; } + public string ReferenceNumber { get; set; } public CareContextEnquiry(string referenceNumber) { diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextRepresentation.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextRepresentation.cs index d0c8ca88..4d46edbb 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextRepresentation.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/CareContextRepresentation.cs @@ -2,9 +2,9 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model { public class CareContextRepresentation { - public string ReferenceNumber { get; } + public string ReferenceNumber { get; set; } - public string Display { get; } + public string Display { get; set; } public CareContextRepresentation(string referenceNumber, string display) { diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkConfirmationRepresentation.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkConfirmationRepresentation.cs index 107efabd..a6b071b6 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkConfirmationRepresentation.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkConfirmationRepresentation.cs @@ -1,8 +1,6 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model { using System.Collections.Generic; - using System.Text.Json.Serialization; - using System.Xml.Serialization; public class LinkConfirmationRepresentation { diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkEnquiryRepresentation.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkEnquiryRepresentation.cs index 2d32d9b9..944bd944 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkEnquiryRepresentation.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkEnquiryRepresentation.cs @@ -9,7 +9,7 @@ public class LinkEnquiryRepresentation public string AuthenticationType { get; } - public LinkReferenceMeta Meta { get; } + public LinkReferenceMeta Meta { get; set; } public LinkEnquiryRepresentation() { diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkReferenceMeta.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkReferenceMeta.cs index c794fa69..31196a34 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkReferenceMeta.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/LinkReferenceMeta.cs @@ -2,13 +2,12 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model { public class LinkReferenceMeta { - public string CommunicationMedium { get; } + public string CommunicationMedium { get; set; } - public string CommunicationHint { get; } + public string CommunicationHint { get; set; } public string CommunicationExpiry { get; } - public LinkReferenceMeta(string communicationMedium, string communicationHint, string communicationExpiry) { CommunicationMedium = communicationMedium; diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/Patient.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/Patient.cs index acde5a7b..d8f83f82 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/Patient.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/Patient.cs @@ -5,7 +5,7 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model public class Patient { public string Identifier { get; set; } - + public Gender Gender { get; set; } public string PhoneNumber { get; set; } diff --git a/src/In.ProjectEKA.HipLibrary/Patient/Model/PatientEnquiryRepresentation.cs b/src/In.ProjectEKA.HipLibrary/Patient/Model/PatientEnquiryRepresentation.cs index e7c4a87d..059204bf 100644 --- a/src/In.ProjectEKA.HipLibrary/Patient/Model/PatientEnquiryRepresentation.cs +++ b/src/In.ProjectEKA.HipLibrary/Patient/Model/PatientEnquiryRepresentation.cs @@ -4,9 +4,9 @@ namespace In.ProjectEKA.HipLibrary.Patient.Model public class PatientEnquiryRepresentation { - public string ReferenceNumber { get; } + public string ReferenceNumber { get; set; } - public string Display { get; } + public string Display { get; set; } public IEnumerable CareContexts { get; } diff --git a/src/In.ProjectEKA.HipService/Discovery/Database/Migrations/DiscoveryContextModelSnapshot.cs b/src/In.ProjectEKA.HipService/Discovery/Database/Migrations/DiscoveryContextModelSnapshot.cs index c594e1f7..b8bf19e0 100644 --- a/src/In.ProjectEKA.HipService/Discovery/Database/Migrations/DiscoveryContextModelSnapshot.cs +++ b/src/In.ProjectEKA.HipService/Discovery/Database/Migrations/DiscoveryContextModelSnapshot.cs @@ -16,7 +16,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) - .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 63); modelBuilder.Entity("In.ProjectEKA.HipService.Discovery.Model.DiscoveryRequest", b => diff --git a/src/In.ProjectEKA.HipService/Discovery/DiscoveryRequestRepository.cs b/src/In.ProjectEKA.HipService/Discovery/DiscoveryRequestRepository.cs index 9fe04417..ed7d39c6 100644 --- a/src/In.ProjectEKA.HipService/Discovery/DiscoveryRequestRepository.cs +++ b/src/In.ProjectEKA.HipService/Discovery/DiscoveryRequestRepository.cs @@ -1,3 +1,5 @@ +using System.Linq; + namespace In.ProjectEKA.HipService.Discovery { using System.Threading.Tasks; @@ -46,5 +48,11 @@ public Task RequestExistsFor(string requestId) return discoveryContext.DiscoveryRequest .AnyAsync(request => request.TransactionId == requestId); } + + public async Task GetRequestFor(string transactionId) + { + return await discoveryContext.DiscoveryRequest + .FirstOrDefaultAsync(request => request.TransactionId == transactionId); + } } } \ No newline at end of file diff --git a/src/In.ProjectEKA.HipService/Discovery/IDiscoveryRequestRepository.cs b/src/In.ProjectEKA.HipService/Discovery/IDiscoveryRequestRepository.cs index 70e540bd..b9cabbfd 100644 --- a/src/In.ProjectEKA.HipService/Discovery/IDiscoveryRequestRepository.cs +++ b/src/In.ProjectEKA.HipService/Discovery/IDiscoveryRequestRepository.cs @@ -12,5 +12,7 @@ public interface IDiscoveryRequestRepository Task RequestExistsFor(string requestId, string consentManagerUserId, string patientReferenceNumber); Task RequestExistsFor(string requestId); + + Task GetRequestFor(string requestTransactionId); } } \ No newline at end of file diff --git a/src/In.ProjectEKA.HipService/Discovery/PatientDiscovery.cs b/src/In.ProjectEKA.HipService/Discovery/PatientDiscovery.cs index fc3e8812..d37d7c18 100644 --- a/src/In.ProjectEKA.HipService/Discovery/PatientDiscovery.cs +++ b/src/In.ProjectEKA.HipService/Discovery/PatientDiscovery.cs @@ -4,11 +4,12 @@ namespace In.ProjectEKA.HipService.Discovery using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; + using DefaultHip.Patient; using HipLibrary.Matcher; using HipLibrary.Patient; using HipLibrary.Patient.Model; using Link; - using In.ProjectEKA.HipService.Link.Model; + using Link.Model; using Logger; public class PatientDiscovery @@ -36,7 +37,8 @@ public virtual async Task AlreadyExists(string transactionId) @@ -102,5 +111,22 @@ private static IEnumerable GetUnlinkedCareContexts( allLinkedCareContexts.Find(linkedCareContext => linkedCareContext == careContext.ReferenceNumber) == null); } + + private PatientEnquiryRepresentation GetMaskedPatientEnquiryRepresentation( + PatientEnquiryRepresentation patient) + { + var maskingUtility = new MaskingUtility(); + patient.ReferenceNumber = maskingUtility.MaskReference(patient.ReferenceNumber); + patient.Display = maskingUtility.MaskPatientName(patient.Display); + foreach (var careContextRepresentation in patient.CareContexts.AsEnumerable()) + { + careContextRepresentation.ReferenceNumber = + new MaskingUtility().MaskReference(careContextRepresentation.ReferenceNumber); + careContextRepresentation.Display = + new MaskingUtility().MaskCareContextDisplay(careContextRepresentation.Display); + } + + return patient; + } } } \ No newline at end of file diff --git a/src/In.ProjectEKA.HipService/Link/Database/LinkPatientContext.cs b/src/In.ProjectEKA.HipService/Link/Database/LinkPatientContext.cs index 4dec273c..11b0a2a2 100644 --- a/src/In.ProjectEKA.HipService/Link/Database/LinkPatientContext.cs +++ b/src/In.ProjectEKA.HipService/Link/Database/LinkPatientContext.cs @@ -13,9 +13,9 @@ public LinkPatientContext(DbContextOptions options) : base(o } public DbSet LinkEnquires { get; set; } - - public DbSet LinkedAccounts { get; set; } + public DbSet LinkedAccounts { get; set; } + public DbSet InitiatedLinkRequest { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -29,7 +29,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .WithOne(c => c.LinkEnquires) .IsRequired() .OnDelete(DeleteBehavior.Cascade); - + modelBuilder.Entity(builder => { builder.Property(p => p.DateTimeStamp) @@ -43,7 +43,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) builder.Property(p => p.Status) .HasDefaultValueSql("false"); }); - + modelBuilder.Entity() .Property(e => e.CareContexts) .HasConversion( diff --git a/src/In.ProjectEKA.HipService/Link/Database/Migrations/LinkPatientContextModelSnapshot.cs b/src/In.ProjectEKA.HipService/Link/Database/Migrations/LinkPatientContextModelSnapshot.cs index a7ec482d..0f5c82a6 100644 --- a/src/In.ProjectEKA.HipService/Link/Database/Migrations/LinkPatientContextModelSnapshot.cs +++ b/src/In.ProjectEKA.HipService/Link/Database/Migrations/LinkPatientContextModelSnapshot.cs @@ -1,4 +1,6 @@ // + +using System; using In.ProjectEKA.HipService.Link.Database; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -15,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) #pragma warning disable 612, 618 modelBuilder .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) - .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 63); modelBuilder.Entity("In.ProjectEKA.HipService.Link.Model.CareContext", b => @@ -105,7 +107,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("LinkedAccounts"); }); - + modelBuilder.Entity("In.ProjectEKA.HipService.Link.Model.CareContext", b => { b.HasOne("In.ProjectEKA.HipService.Link.Model.LinkEnquires", "LinkEnquires") diff --git a/src/In.ProjectEKA.HipService/Link/ILinkPatientRepository.cs b/src/In.ProjectEKA.HipService/Link/ILinkPatientRepository.cs index 0d2558d8..7151d5c4 100644 --- a/src/In.ProjectEKA.HipService/Link/ILinkPatientRepository.cs +++ b/src/In.ProjectEKA.HipService/Link/ILinkPatientRepository.cs @@ -1,3 +1,5 @@ +using In.ProjectEKA.HipLibrary.Patient.Model; + namespace In.ProjectEKA.HipService.Link { using System; diff --git a/src/In.ProjectEKA.HipService/Link/LinkController.cs b/src/In.ProjectEKA.HipService/Link/LinkController.cs index a43d4851..3bf0385f 100644 --- a/src/In.ProjectEKA.HipService/Link/LinkController.cs +++ b/src/In.ProjectEKA.HipService/Link/LinkController.cs @@ -3,14 +3,15 @@ namespace In.ProjectEKA.HipService.Link { using System; using System.Threading.Tasks; + using DefaultHip.Patient; using Discovery; using Gateway; using Gateway.Model; using Hangfire; using HipLibrary.Patient.Model; using Logger; - using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; + using Microsoft.AspNetCore.Mvc; using static Common.Constants; [Authorize] @@ -50,6 +51,8 @@ public AcceptedResult LinkPatientFor(LinkPatientRequest request) [NonAction] public async Task LinkPatient(LinkReferenceRequest request) { + var discoveryRequest = await discoveryRequestRepository.GetRequestFor(request.TransactionId); + request.Patient.ReferenceNumber = discoveryRequest.PatientReferenceNumber; var cmUserId = request.Patient.Id; var cmSuffix = cmUserId.Substring( cmUserId.LastIndexOf("@", StringComparison.Ordinal) + 1); @@ -58,6 +61,7 @@ public async Task LinkPatient(LinkReferenceRequest request) cmUserId, request.Patient.ReferenceNumber, request.Patient.CareContexts); + patient = GetUnmaskedLinkEnquiry(patient); try { var doesRequestExists = await discoveryRequestRepository.RequestExistsFor( @@ -84,6 +88,8 @@ public async Task LinkPatient(LinkReferenceRequest request) { linkedPatientRepresentation = linkReferenceResponse.Link; } + linkedPatientRepresentation.Meta.CommunicationHint = + new MaskingUtility().MaskMobileNumber(linkedPatientRepresentation.Meta.CommunicationHint); var response = new GatewayLinkResponse( linkedPatientRepresentation, error?.Error, @@ -105,7 +111,7 @@ public async Task LinkPatientCareContextFor(LinkPatientRequest request) { try { - var (patientLinkResponse,cmId, error) = await linkPatient + var (patientLinkResponse, cmId, error) = await linkPatient .VerifyAndLinkCareContext(new LinkConfirmationRequest(request.Confirmation.Token, request.Confirmation.LinkRefNumber)); LinkConfirmationRepresentation linkedPatientRepresentation = null; @@ -127,5 +133,16 @@ public async Task LinkPatientCareContextFor(LinkPatientRequest request) Log.Error(exception, exception.StackTrace); } } + private LinkEnquiry GetUnmaskedLinkEnquiry(LinkEnquiry linkEnquiry) + { + var maskingUtility = new MaskingUtility(); + foreach (var careContextEnquiry in linkEnquiry.CareContexts) + { + careContextEnquiry.ReferenceNumber = maskingUtility.UnmaskData(careContextEnquiry.ReferenceNumber); + } + return linkEnquiry; + } + + } } \ No newline at end of file diff --git a/src/In.ProjectEKA.HipService/Link/PatientLinkReference.cs b/src/In.ProjectEKA.HipService/Link/PatientLinkReference.cs index ed31ac56..8ee52e20 100644 --- a/src/In.ProjectEKA.HipService/Link/PatientLinkReference.cs +++ b/src/In.ProjectEKA.HipService/Link/PatientLinkReference.cs @@ -7,9 +7,9 @@ public class PatientLinkReference { public string Id { get; } - public string ReferenceNumber { get; } - - public IEnumerable CareContexts { get; } + public string ReferenceNumber { get; set; } + + public IEnumerable CareContexts { get; set; } public PatientLinkReference(string id, string referenceNumber, IEnumerable careContexts) { diff --git a/test/In.ProjectEKA.DefaultHipTest/Link/PatientRepositoryTest.cs b/test/In.ProjectEKA.DefaultHipTest/Link/PatientRepositoryTest.cs index aa12bc94..d28c3e83 100644 --- a/test/In.ProjectEKA.DefaultHipTest/Link/PatientRepositoryTest.cs +++ b/test/In.ProjectEKA.DefaultHipTest/Link/PatientRepositoryTest.cs @@ -8,7 +8,8 @@ namespace In.ProjectEKA.DefaultHipTest.Link [Collection("Patient Repository Tests")] public class PatientRepositoryTest { - private readonly PatientRepository patientRepository = new PatientRepository("demoPatients.json"); + private readonly PatientRepository patientRepository = + new PatientRepository("demoPatients.json"); [Fact] private void ReturnPatient() @@ -20,10 +21,12 @@ private void ReturnPatient() Identifier = patientReferenceNumber, Gender = Gender.F, Name = "Navjot Singh", - CareContexts = new [] + CareContexts = new[] { - new CareContextRepresentation("NCP1007", "National Cancer program"), - new CareContextRepresentation("RV-MHD-01.17.0024", "Dept of Psychiatry - Episode 1"), + new CareContextRepresentation( + "NCP1007", "National Cancer program"), + new CareContextRepresentation( + "RV-MHD-01.17.0024", "Dept of Psychiatry - Episode 1"), }, YearOfBirth = 2001 }; diff --git a/test/In.ProjectEKA.HipServiceTest/Discovery/PatientDiscoveryTest.cs b/test/In.ProjectEKA.HipServiceTest/Discovery/PatientDiscoveryTest.cs index f22ec926..8c085488 100644 --- a/test/In.ProjectEKA.HipServiceTest/Discovery/PatientDiscoveryTest.cs +++ b/test/In.ProjectEKA.HipServiceTest/Discovery/PatientDiscoveryTest.cs @@ -39,16 +39,15 @@ private async void ShouldReturnPatientForAlreadyLinkedPatient() var phoneNumber = Faker().Phone.PhoneNumber(); var verifiedIdentifiers = new[] {new Identifier(IdentifierType.MOBILE, phoneNumber)}; var unverifiedIdentifiers = new[] {new Identifier(IdentifierType.MR, Faker().Random.String())}; - var patientId = Faker().Random.String(); - var name = Faker().Name.FullName(); + var patientId = "pat"; + var name = "Hina Patel"; + var display = "display"; var alreadyLinked = - new CareContextRepresentation(Faker().Random.Uuid().ToString(), Faker().Random.String()); - var unlinkedCareContext = - new CareContextRepresentation(Faker().Random.Uuid().ToString(), Faker().Random.String()); + new CareContextRepresentation(Faker().Random.String(), display); var expectedPatient = new PatientEnquiryRepresentation( - patientId, - name, - new[] {unlinkedCareContext}, + "Xat", + "HiXXXXXXel", + Array.Empty(), new[] {Match.ConsentManagerUserId.ToString()}); var transactionId = Faker().Random.String(); var patientRequest = new PatientEnquiry(patientId, @@ -74,8 +73,7 @@ private async void ShouldReturnPatientForAlreadyLinkedPatient() Name = name, CareContexts = new[] { - alreadyLinked, - unlinkedCareContext + alreadyLinked } }; linkPatientRepository.Setup(e => e.GetLinkedCareContexts(patientId)) @@ -103,20 +101,34 @@ private async void ShouldReturnAPatientWhichIsNotLinkedAtAll() discoveryRequestRepository.Object, linkPatientRepository.Object, patientRepository.Object); - var referenceNumber = Faker().Random.String(); - var name = Faker().Random.String(); - var phoneNumber = Faker().Phone.PhoneNumber(); + var referenceNumber = "abc"; + var name = "Hina Patel"; + var phoneNumber = "+91-8888888888"; var consentManagerUserId = Faker().Random.String(); var transactionId = Faker().Random.String(); const ushort yearOfBirth = 2019; - var careContextRepresentations = new[] + var MaskedReferenceNumber = "Xbc"; + var MaskedCareContextReferenceNumber1 = "Xyx"; + var MaskedCareContextReferenceNumber2 = "Xed"; + var display = "display"; + var maskedDisplay = "XXXay"; + var careContextRepresentationsExpected = new[] { - new CareContextRepresentation(Faker().Random.String(), Faker().Random.String()), - new CareContextRepresentation(Faker().Random.String(), Faker().Random.String()) + new CareContextRepresentation(MaskedCareContextReferenceNumber1, + maskedDisplay), + new CareContextRepresentation(MaskedCareContextReferenceNumber2, + maskedDisplay) }; - var expectedPatient = new PatientEnquiryRepresentation(referenceNumber, - name, - careContextRepresentations, + var careContextRepresentationsActual = new[] + { + new CareContextRepresentation("zyx", + display), + new CareContextRepresentation("fed", + display) + }; + var expectedPatient = new PatientEnquiryRepresentation(MaskedReferenceNumber, + "HiXXXXXXel", + careContextRepresentationsExpected, new List { Match.Mobile.ToString(), @@ -138,7 +150,7 @@ private async void ShouldReturnAPatientWhichIsNotLinkedAtAll() name, Gender.M, yearOfBirth); - var discoveryRequest = new DiscoveryRequest(patientRequest, RandomString(),transactionId, DateTime.Now); + var discoveryRequest = new DiscoveryRequest(patientRequest, RandomString(), transactionId, DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); matchingRepository @@ -150,7 +162,7 @@ private async void ShouldReturnAPatientWhichIsNotLinkedAtAll() Gender = Gender.M, Identifier = referenceNumber, Name = name, - CareContexts = careContextRepresentations, + CareContexts = careContextRepresentationsActual, PhoneNumber = phoneNumber, YearOfBirth = yearOfBirth } @@ -174,21 +186,17 @@ private async void ShouldReturnAPatientWhenUnverifiedIdentifierIsNull() discoveryRequestRepository.Object, linkPatientRepository.Object, patientRepository.Object); - var referenceNumber = Faker().Random.String(); + var referenceNumber = "abc"; + var MaskedReferenceNumber = "Xbc"; var consentManagerUserId = Faker().Random.String(); var transactionId = Faker().Random.String(); - var name = Faker().Name.FullName(); + var name = "Hina patel"; const ushort yearOfBirth = 2019; var phoneNumber = Faker().Phone.PhoneNumber(); - var careContextRepresentations = new[] - { - new CareContextRepresentation(Faker().Random.String(), Faker().Random.String()), - new CareContextRepresentation(Faker().Random.String(), Faker().Random.String()) - }; var expectedPatient = new PatientEnquiryRepresentation( - referenceNumber, - name, - careContextRepresentations, + MaskedReferenceNumber, + "HiXXXXXXel", + Array.Empty(), new List { Match.Mobile.ToString(), @@ -202,7 +210,7 @@ private async void ShouldReturnAPatientWhenUnverifiedIdentifierIsNull() name, Gender.M, yearOfBirth); - var discoveryRequest = new DiscoveryRequest(patientRequest, RandomString(),transactionId, DateTime.Now); + var discoveryRequest = new DiscoveryRequest(patientRequest, RandomString(), transactionId, DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); matchingRepository @@ -214,7 +222,7 @@ private async void ShouldReturnAPatientWhenUnverifiedIdentifierIsNull() Gender = Gender.M, Identifier = referenceNumber, Name = name, - CareContexts = careContextRepresentations, + CareContexts = Array.Empty(), PhoneNumber = phoneNumber, YearOfBirth = yearOfBirth } @@ -252,7 +260,8 @@ private async void ReturnMultiplePatientsErrorWhenUnverifiedIdentifierIs(IEnumer name, gender, yearOfBirth); - var discoveryRequest = new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); + var discoveryRequest = + new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); @@ -303,7 +312,8 @@ private async void ShouldGetMultiplePatientsFoundErrorWhenSameUnverifiedIdentifi name, gender, yearOfBirth); - var discoveryRequest = new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); + var discoveryRequest = + new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); @@ -353,7 +363,8 @@ private async void ShouldGetNoPatientFoundErrorWhenVerifiedIdentifierDoesNotMatc null, Gender.M, 2019); - var discoveryRequest = new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); + var discoveryRequest = + new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); @@ -380,7 +391,8 @@ private async void ReturnNoPatientFoundErrorWhenVerifiedIdentifierIs(IEnumerable null, Gender.M, 2019); - var discoveryRequest = new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); + var discoveryRequest = + new DiscoveryRequest(patientRequest, Faker().Random.String(), RandomString(), DateTime.Now); linkPatientRepository.Setup(e => e.GetLinkedCareContexts(consentManagerUserId)) .ReturnsAsync(new Tuple, Exception>(new List(), null)); @@ -399,9 +411,10 @@ private async void ShouldReturnAnErrorWhenDiscoveryRequestAlreadyExists() linkPatientRepository.Object, patientRepository.Object); var expectedError = - new ErrorRepresentation(new Error(ErrorCode.DuplicateDiscoveryRequest, "Discovery Request already exists")); + new ErrorRepresentation(new Error(ErrorCode.DuplicateDiscoveryRequest, + "Discovery Request already exists")); var transactionId = RandomString(); - var discoveryRequest = new DiscoveryRequest(null, RandomString(),transactionId, DateTime.Now); + var discoveryRequest = new DiscoveryRequest(null, RandomString(), transactionId, DateTime.Now); discoveryRequestRepository.Setup(repository => repository.RequestExistsFor(transactionId)) .ReturnsAsync(true); diff --git a/test/In.ProjectEKA.HipServiceTest/Link/LinkControllerTest.cs b/test/In.ProjectEKA.HipServiceTest/Link/LinkControllerTest.cs index a3de7276..7717b415 100644 --- a/test/In.ProjectEKA.HipServiceTest/Link/LinkControllerTest.cs +++ b/test/In.ProjectEKA.HipServiceTest/Link/LinkControllerTest.cs @@ -52,8 +52,8 @@ private void ShouldEnqueueLinkRequestAndReturnAccepted() faker.Random.Hash()); discoveryRequestRepository.Setup(x => x.RequestExistsFor(linkRequest.TransactionId, - id, - linkRequest.Patient.ReferenceNumber)) + id, + linkRequest.Patient.ReferenceNumber)) .ReturnsAsync(true); var linkedResult = linkController.LinkFor(linkRequest); @@ -61,7 +61,7 @@ private void ShouldEnqueueLinkRequestAndReturnAccepted() backgroundJobClient.Verify(client => client.Create( It.Is(job => job.Method.Name == "LinkPatient" && job.Args[0] == linkRequest), It.IsAny() - )); + )); link.Verify(); discoveryRequestRepository.Verify(); @@ -79,9 +79,9 @@ private void ShouldEnqueueLinkConfirmationRequestAndReturnAccepted() Faker().Random.Word() , careContext)); link.Setup(e => e.VerifyAndLinkCareContext(It.Is(p => - p.Token == "1234" && - p.LinkReferenceNumber == linkReferenceNumber))) - .ReturnsAsync((expectedResponse,cmId,null)); + p.Token == "1234" && + p.LinkReferenceNumber == linkReferenceNumber))) + .ReturnsAsync((expectedResponse, cmId, null)); var linkPatientRequest = new LinkPatientRequest(Faker().Random.Hash(), It.IsAny(), diff --git a/test/In.ProjectEKA.HipServiceTest/Link/LinkPatientTest.cs b/test/In.ProjectEKA.HipServiceTest/Link/LinkPatientTest.cs index 1b8b0a47..38327a6b 100644 --- a/test/In.ProjectEKA.HipServiceTest/Link/LinkPatientTest.cs +++ b/test/In.ProjectEKA.HipServiceTest/Link/LinkPatientTest.cs @@ -68,7 +68,7 @@ private async void ShouldReturnLinkReferenceResponse() IEnumerable careContexts = new[] {new CareContextEnquiry(programRefNo)}; var patient = new LinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), testPatient.Identifier, careContexts); - var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), + var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), patient); guidGenerator.Setup(x => x.NewGuid()).Returns(linkReferenceNumber); patientVerification.Setup(x => x.SendTokenFor(new Session(linkReferenceNumber @@ -76,18 +76,18 @@ private async void ShouldReturnLinkReferenceResponse() , new OtpGenerationDetail(TestBuilder.Faker().Random.Word(), OtpAction.LINK_PATIENT_CARECONTEXT.ToString())))) .ReturnsAsync((OtpMessage) null); var initiatedLinkRequest = new InitiatedLinkRequest(patientReferenceRequest.RequestId, - patientReferenceRequest.TransactionId, - linkReferenceNumber, - false, - It.IsAny()); + patientReferenceRequest.TransactionId, + linkReferenceNumber, + false, + It.IsAny()); linkRepository.Setup(x => x.SaveRequestWith(linkReferenceNumber, patientReferenceRequest.Patient.ConsentManagerId, patientReferenceRequest.Patient.ConsentManagerUserId, patientReferenceRequest.Patient.ReferenceNumber, new[] {programRefNo})) .ReturnsAsync(new Tuple(null, null)); linkRepository.Setup(x => x.Save(patientReferenceRequest.RequestId, - patientReferenceRequest.TransactionId, - linkReferenceNumber)) + patientReferenceRequest.TransactionId, + linkReferenceNumber)) .ReturnsAsync(Option.Some(initiatedLinkRequest)); patientRepository.Setup(x => x.PatientWith(testPatient.Identifier)) @@ -113,7 +113,7 @@ private async void ShouldReturnPatientNotFoundError() IEnumerable careContexts = new[] {new CareContextEnquiry("129")}; var patient = new LinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), "1234", careContexts); - var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), + var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), patient); var expectedError = new ErrorRepresentation(new Error(ErrorCode.NoPatientFound, ErrorMessage.NoPatientFound)); @@ -128,7 +128,7 @@ private async void ShouldReturnCareContextNotFoundError() IEnumerable careContexts = new[] {new CareContextEnquiry("1234")}; var patient = new LinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), "4", careContexts); - var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), + var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), patient); patientRepository.Setup(e => e.PatientWith(testPatient.Identifier)) .Returns(Option.Some(testPatient)); @@ -150,17 +150,17 @@ private async void ReturnOtpInvalidOnWrongOtp() var dateTimeStamp = DateTime.Now.ToUniversalTime().ToString(Constants.DateTimeFormat); var testOtpMessage = new OtpMessage(ResponseType.OtpInvalid, "Invalid Otp"); var patientLinkRequest = new LinkConfirmationRequest(otpToken, sessionId); - var linkEnquires = new LinkEnquires("","","ncg","", - dateTimeStamp,new List()); + var linkEnquires = new LinkEnquires("", "", "ncg", "", + dateTimeStamp, new List()); linkRepository.Setup(e => e.GetPatientFor(sessionId)) .ReturnsAsync(new Tuple(linkEnquires, null)); - + var expectedErrorResponse = new ErrorRepresentation(new Error(ErrorCode.OtpInValid, testOtpMessage.Message)); patientVerification.Setup(e => e.Verify(sessionId, otpToken)) .ReturnsAsync(testOtpMessage); - var (_,cmId, error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); + var (_, cmId, error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); patientVerification.Verify(); error.Should().BeEquivalentTo(expectedErrorResponse); @@ -174,8 +174,8 @@ private async void ReturnOtpExpired() var dateTimeStamp = DateTime.Now.ToUniversalTime().ToString(Constants.DateTimeFormat); var testOtpMessage = new OtpMessage(ResponseType.OtpExpired, "Otp Expired"); var patientLinkRequest = new LinkConfirmationRequest(otpToken, sessionId); - var linkEnquires = new LinkEnquires("","","ncg","", - dateTimeStamp,new List()); + var linkEnquires = new LinkEnquires("", "", "ncg", "", + dateTimeStamp, new List()); var expectedErrorResponse = new ErrorRepresentation(new Error(ErrorCode.OtpExpired, testOtpMessage.Message)); linkRepository.Setup(e => e.GetPatientFor(sessionId)) @@ -183,7 +183,7 @@ private async void ReturnOtpExpired() patientVerification.Setup(e => e.Verify(sessionId, otpToken)) .ReturnsAsync(testOtpMessage); - var (_,cmId,error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); + var (_, cmId, error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); patientVerification.Verify(); error.Should().BeEquivalentTo(expectedErrorResponse); @@ -203,7 +203,7 @@ private async void ErrorOnInvalidLinkReferenceNumber() .ReturnsAsync(new Tuple(null, new Exception())); - var (_,cmId,error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); + var (_, cmId, error) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); patientVerification.Verify(); error.Should().BeEquivalentTo(expectedErrorResponse); @@ -240,7 +240,7 @@ private async void SuccessLinkPatientForValidOtp() $"{testPatient.Name}", new[] {new CareContextRepresentation("129", "National Cancer program")})); - var (response,cmId,_) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); + var (response, cmId, _) = await linkPatient.VerifyAndLinkCareContext(patientLinkRequest); patientVerification.Verify(); linkRepository.Verify(); @@ -259,7 +259,7 @@ private async void ErrorOnDuplicateRequestId() IEnumerable careContexts = new[] {new CareContextEnquiry(programRefNo)}; var patient = new LinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), testPatient.Identifier, careContexts); - var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), + var patientReferenceRequest = new PatientLinkEnquiry(TestBuilders.Faker().Random.Hash(), TestBuilders.Faker().Random.Hash(), patient); guidGenerator.Setup(x => x.NewGuid()).Returns(linkReferenceNumber); patientVerification.Setup(x => x.SendTokenFor(new Session(linkReferenceNumber @@ -272,8 +272,8 @@ private async void ErrorOnDuplicateRequestId() patientReferenceRequest.Patient.ReferenceNumber, new[] {programRefNo})) .ReturnsAsync(new Tuple(null, null)); linkRepository.Setup(x => x.Save(patientReferenceRequest.RequestId, - patientReferenceRequest.TransactionId, - linkReferenceNumber)) + patientReferenceRequest.TransactionId, + linkReferenceNumber)) .ReturnsAsync(Option.None()); patientRepository.Setup(x => x.PatientWith(testPatient.Identifier)) .Returns(Option.Some(testPatient));