From 85c25bd49ac1d252843d8daee9a37eca846a2a7f Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 11:40:19 +0100 Subject: [PATCH 1/8] endpoint to verify sharecode --- .../Api/DataSharing.cs | 16 +++----- .../Model/ShareVerificationReceipt.cs | 4 +- .../Model/ShareVerificationRequest.cs | 4 +- Services/CO.CDP.DataSharing.WebApi/Program.cs | 1 + .../UseCase/GetShareCodeVerifyUseCase.cs | 25 ++++++++++++ .../DatabaseFormRepository.cs | 40 ++++++++++++++++++- .../IFormRepository.cs | 2 +- 7 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs diff --git a/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs b/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs index 2cb72c478..c731b9d92 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs @@ -204,15 +204,9 @@ await useCase.Execute(shareRequest) }) .RequireAuthorization(Constants.OneLoginPolicy); - app.MapPost("/share/data/verify", (ShareVerificationRequest request) => Results.Ok( - new ShareVerificationReceipt - { - ShareCode = request.ShareCode, - FormVersionId = request.FormVersionId, - IsLatest = true - } - ) - ) + app.MapPost("/share/data/verify", async (ShareVerificationRequest request, IUseCase useCase) => + await useCase.Execute(request) + .AndThen(shareVerificationReceipt => Results.Ok(shareVerificationReceipt))) .Produces(StatusCodes.Status200OK, "application/json") .Produces(StatusCodes.Status401Unauthorized) .Produces(StatusCodes.Status404NotFound) @@ -221,8 +215,8 @@ await useCase.Execute(shareRequest) { operation.OperationId = "VerifySharedData"; operation.Description = - "[STUB] Operation to verify if shared data is the latest version available. [STUB]"; - operation.Summary = "[STUB] Create Supplier Submitted Information. [STUB]"; + "Operation to verify if shared data is the latest version available."; + operation.Summary = "Create Supplier Submitted Information."; operation.Responses["200"].Description = "Share code and version verification."; operation.Responses["401"].Description = "Valid authentication credentials are missing in the request."; operation.Responses["404"].Description = "Share code not found or the caller is not authorised to use it."; diff --git a/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationReceipt.cs b/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationReceipt.cs index 6cde1ad48..4c3233402 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationReceipt.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationReceipt.cs @@ -2,13 +2,13 @@ namespace CO.CDP.DataSharing.WebApi.Model; -internal record ShareVerificationReceipt +public record ShareVerificationReceipt { /// "20240429" [Required] public required string FormVersionId { get; init; } - /// "f53dee53-cf59-4725-9285-44f8960507b9" + /// "f53dee53" [Required] public required string ShareCode { get; init; } diff --git a/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationRequest.cs b/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationRequest.cs index f8aebd065..0305b7e37 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationRequest.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Model/ShareVerificationRequest.cs @@ -2,9 +2,9 @@ namespace CO.CDP.DataSharing.WebApi.Model; -internal record ShareVerificationRequest +public record ShareVerificationRequest { - /// "f53dee53-cf59-4725-9285-44f8960507b9" + /// "f53dee53" [Required] public required string ShareCode { get; init; } diff --git a/Services/CO.CDP.DataSharing.WebApi/Program.cs b/Services/CO.CDP.DataSharing.WebApi/Program.cs index 9c8a09da8..f34c92649 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Program.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Program.cs @@ -31,6 +31,7 @@ builder.Services.AddScoped?>, GetShareCodesUseCase>(); builder.Services.AddScoped, GetShareCodeDetailsUseCase>(); +builder.Services.AddScoped, GetShareCodeVerifyUseCase>(); builder.Services.AddDataSharingProblemDetails(); builder.Services.AddJwtBearerAndApiKeyAuthentication(builder.Configuration, builder.Environment); //builder.Services.AddAuthorization(); diff --git a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs new file mode 100644 index 000000000..dfc2537ec --- /dev/null +++ b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs @@ -0,0 +1,25 @@ +using AutoMapper; +using CO.CDP.DataSharing.WebApi.Model; +using CO.CDP.OrganisationInformation.Persistence; + +namespace CO.CDP.DataSharing.WebApi.UseCase; + +public class GetShareCodeVerifyUseCase( + IFormRepository formRepository) + : IUseCase +{ + public async Task Execute(ShareVerificationRequest shareRequest) + { + var details = await formRepository.GetShareCodeVerifyAsync(shareRequest.FormVersionId, shareRequest.ShareCode); + + if (details == null) return null; + + return new ShareVerificationReceipt + { + FormVersionId = shareRequest.FormVersionId, + ShareCode = shareRequest.ShareCode, + IsLatest = details.Value + }; + } +} \ No newline at end of file diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index d5cd4aef3..00654923f 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -1,5 +1,6 @@ using CO.CDP.OrganisationInformation.Persistence.Forms; using Microsoft.EntityFrameworkCore; +using System.Security.Cryptography; namespace CO.CDP.OrganisationInformation.Persistence; @@ -106,7 +107,7 @@ join o in context.Organisations on s.OrganisationId equals o.Id select new { FormAnswerSetId = fas.Id, - FormAnswerSetUpdate=fas.UpdatedOn, + FormAnswerSetUpdate = fas.UpdatedOn, s.BookingReference, s.SubmittedAt, QuestionId = fq.Guid, @@ -116,7 +117,7 @@ join o in context.Organisations on s.OrganisationId equals o.Id }; var data = await query.ToListAsync(); - var sharedCodeResult = data.OrderByDescending(x=>x.FormAnswerSetUpdate).GroupBy(g => new { g.BookingReference, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); + var sharedCodeResult = data.OrderByDescending(x => x.FormAnswerSetUpdate).GroupBy(g => new { g.BookingReference, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); if (sharedCodeResult == null) return null; return new SharedConsentDetails @@ -134,6 +135,41 @@ join o in context.Organisations on s.OrganisationId equals o.Id }; } + public async Task GetShareCodeVerifyAsync(string formVersionId, string shareCode) + { + var query = from s in context.SharedConsents + join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId + where + fas.Deleted == false + && s.FormVersionId == formVersionId + && s.BookingReference == shareCode + select s; + + if (query.Count() > 1) return false; // Scenario1: if one sharecode with multiple answersets + + var data = await query.FirstOrDefaultAsync(); + if (data == null) return false; + + // Get the latest SharedConsent records of the Organistaion and FormVersionId + var latestShareCode = await (from s in context.SharedConsents + join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId + where + fas.Deleted == false + && s.FormVersionId == data!.FormVersionId + && s.OrganisationId == data.OrganisationId + orderby s.SubmittedAt descending + select s).Take(1).FirstOrDefaultAsync(); + + + if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario2: Sharecode is not submitted + + if (data!.BookingReference == latestShareCode.BookingReference + && data!.BookingReference == shareCode + && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario3: if requested sharecode is latest Sharecode and stae is submitted + + return false; //Scenario: if scenario3 is not passed + } + public async Task> GetQuestionsAsync(Guid sectionId) { return await context.Set().Where(q => q.Section.Guid == sectionId).ToListAsync(); diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs index 69573e3df..2f1cbf256 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs @@ -13,7 +13,7 @@ public interface IFormRepository : IDisposable Task GetSharedConsentDraftWithAnswersAsync(Guid formId, Guid organisationId); Task> GetShareCodesAsync(Guid organisationId); Task GetShareCodeDetailsAsync(Guid organisationId, string shareCode); - + Task GetShareCodeVerifyAsync(string formVersionId, string shareCode); Task> GetQuestionsAsync(Guid sectionId); Task> GetFormAnswerSetsAsync(Guid sectionId, Guid organisationId); From edf9bf623c2efbcf276d9eed9158b83b42e0dcf3 Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 12:56:01 +0100 Subject: [PATCH 2/8] corrected BookingReference to ShareCode --- .../DatabaseFormRepository.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index adccc5f67..b79ce2388 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -100,7 +100,7 @@ join o in context.Organisations on s.OrganisationId equals o.Id select new { FormAnswerSetId = fas.Id, - FormAnswerSetUpdate=fas.UpdatedOn, + FormAnswerSetUpdate = fas.UpdatedOn, s.ShareCode, s.SubmittedAt, QuestionId = fq.Guid, @@ -110,7 +110,7 @@ join o in context.Organisations on s.OrganisationId equals o.Id }; var data = await query.ToListAsync(); - var sharedCodeResult = data.OrderByDescending(x=>x.FormAnswerSetUpdate).GroupBy(g => new { g.ShareCode, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); + var sharedCodeResult = data.OrderByDescending(x => x.FormAnswerSetUpdate).GroupBy(g => new { g.ShareCode, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); if (sharedCodeResult == null) return null; return new SharedConsentDetails @@ -135,7 +135,7 @@ join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId where fas.Deleted == false && s.FormVersionId == formVersionId - && s.BookingReference == shareCode + && s.ShareCode == shareCode select s; if (query.Count() > 1) return false; // Scenario1: if one sharecode with multiple answersets @@ -145,19 +145,19 @@ join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId // Get the latest SharedConsent records of the Organistaion and FormVersionId var latestShareCode = await (from s in context.SharedConsents - join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId - where - fas.Deleted == false - && s.FormVersionId == data!.FormVersionId - && s.OrganisationId == data.OrganisationId - orderby s.SubmittedAt descending - select s).Take(1).FirstOrDefaultAsync(); + join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId + where + fas.Deleted == false + && s.FormVersionId == data!.FormVersionId + && s.OrganisationId == data.OrganisationId + orderby s.SubmittedAt descending + select s).Take(1).FirstOrDefaultAsync(); if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario2: Sharecode is not submitted - if (data!.BookingReference == latestShareCode.BookingReference - && data!.BookingReference == shareCode + if (data!.ShareCode == latestShareCode.ShareCode + && data!.ShareCode == shareCode && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario3: if requested sharecode is latest Sharecode and stae is submitted return false; //Scenario: if scenario3 is not passed From 248cd6997cce488d7c9109695f55ea210fe5eff8 Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 13:00:00 +0100 Subject: [PATCH 3/8] corrected scenario --- .../UseCase/GetShareCodeVerifyUseCase.cs | 5 ++++- .../DatabaseFormRepository.cs | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs index dfc2537ec..01eb826f8 100644 --- a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs +++ b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs @@ -13,7 +13,10 @@ public async Task Execute(ShareVerificationRequest sha { var details = await formRepository.GetShareCodeVerifyAsync(shareRequest.FormVersionId, shareRequest.ShareCode); - if (details == null) return null; + if (details == null) + { + throw new SharedConsentNotFoundException("Shared Code not found."); + } return new ShareVerificationReceipt { diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index b79ce2388..18e0ad959 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -138,10 +138,10 @@ join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId && s.ShareCode == shareCode select s; - if (query.Count() > 1) return false; // Scenario1: if one sharecode with multiple answersets + if (query.Count() > 1) return false; // Scenario-1: if one sharecode with multiple answersets var data = await query.FirstOrDefaultAsync(); - if (data == null) return false; + if (data == null) return null; // Get the latest SharedConsent records of the Organistaion and FormVersionId var latestShareCode = await (from s in context.SharedConsents @@ -154,13 +154,13 @@ orderby s.SubmittedAt descending select s).Take(1).FirstOrDefaultAsync(); - if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario2: Sharecode is not submitted + if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario-2: Sharecode is not submitted if (data!.ShareCode == latestShareCode.ShareCode && data!.ShareCode == shareCode - && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario3: if requested sharecode is latest Sharecode and stae is submitted + && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario-3: if requested sharecode is latest Sharecode and stae is submitted - return false; //Scenario: if scenario3 is not passed + return false; //Scenario-4: if scenario3 is not passed } public async Task> GetQuestionsAsync(Guid sectionId) From 2a5f7f394a5f69705daac542d5060abd80bbbf6c Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 13:01:22 +0100 Subject: [PATCH 4/8] added comments --- .../DatabaseFormRepository.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index 18e0ad959..28459e3a1 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -141,7 +141,7 @@ join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId if (query.Count() > 1) return false; // Scenario-1: if one sharecode with multiple answersets var data = await query.FirstOrDefaultAsync(); - if (data == null) return null; + if (data == null) return null; // Scenario-2: if Sharecode not found // Get the latest SharedConsent records of the Organistaion and FormVersionId var latestShareCode = await (from s in context.SharedConsents @@ -154,13 +154,13 @@ orderby s.SubmittedAt descending select s).Take(1).FirstOrDefaultAsync(); - if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario-2: Sharecode is not submitted + if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario-3: Sharecode is not submitted if (data!.ShareCode == latestShareCode.ShareCode && data!.ShareCode == shareCode - && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario-3: if requested sharecode is latest Sharecode and stae is submitted + && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario-4: if requested sharecode is latest Sharecode and stae is submitted - return false; //Scenario-4: if scenario3 is not passed + return false; //Scenario-4: if scenario-4 is not passed } public async Task> GetQuestionsAsync(Guid sectionId) From 55c4c18ee96e8bd65099fd62ccebddc52de4c58c Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 13:55:28 +0100 Subject: [PATCH 5/8] added Unit tests --- .../EntityFactory.cs | 76 ++++++++++++++++--- .../UseCase/GetShareCodeVerifyUseCaseTest.cs | 43 +++++++++++ .../Api/DataSharing.cs | 2 +- .../DatabaseFormRepository.cs | 2 +- 4 files changed, 109 insertions(+), 14 deletions(-) create mode 100644 Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs index bb405a3f8..93bb6b6fa 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs @@ -15,6 +15,15 @@ internal static ShareRequest GetShareRequest(Guid organisationGuid, Guid formId) }; } + internal static ShareVerificationRequest GetShareVerificationRequest(string formVersionId, string shareCode) + { + return new ShareVerificationRequest + { + FormVersionId=formVersionId, + ShareCode=shareCode + }; + } + internal static OrganisationInformation.Persistence.Forms.SharedConsent GetSharedConsent(int organisationId, Guid organisationGuid, Guid formId) { var form = new CO.CDP.OrganisationInformation.Persistence.Forms.Form @@ -27,21 +36,23 @@ internal static OrganisationInformation.Persistence.Forms.SharedConsent GetShare Sections = new List { } }; + var orgnisation = new Organisation + { + Id = organisationId, + Guid = organisationGuid, + Name = string.Empty, + Tenant = new Tenant + { + Guid = Guid.NewGuid(), + Name = string.Empty + } + }; + return new OrganisationInformation.Persistence.Forms.SharedConsent() { Guid = formId, - OrganisationId = organisationId, - Organisation = new Organisation - { - Id = organisationId, - Guid = organisationGuid, - Name = string.Empty, - Tenant = new Tenant - { - Guid = Guid.NewGuid(), - Name = string.Empty - } - }, + OrganisationId =orgnisation.Id, + Organisation = orgnisation, FormId = form.Id, Form = form, AnswerSets = new List { }, @@ -49,6 +60,47 @@ internal static OrganisationInformation.Persistence.Forms.SharedConsent GetShare SubmittedAt = DateTime.UtcNow, FormVersionId = string.Empty, ShareCode = string.Empty + }; } + + //internal static List GetSharedConsents(int organisationId, Guid organisationGuid, Guid formId) + //{ + // var form = new CO.CDP.OrganisationInformation.Persistence.Forms.Form + // { + // Guid = formId, + // Name = string.Empty, + // Version = string.Empty, + // IsRequired = default, + // Scope = default, + // Sections = new List { } + // }; + + // var orgnisation = new Organisation + // { + // Id = organisationId, + // Guid = organisationGuid, + // Name = string.Empty, + // Tenant = new Tenant + // { + // Guid = Guid.NewGuid(), + // Name = string.Empty + // } + // }; + + // return new List() + // { + // Guid = formId, + // OrganisationId = orgnisation.Id, + // Organisation = orgnisation, + // FormId = form.Id, + // Form = form, + // AnswerSets = new List { }, + // SubmissionState = SubmissionState.Draft, + // SubmittedAt = DateTime.UtcNow, + // FormVersionId = string.Empty, + // ShareCode = string.Empty + + // }; + //} } diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs new file mode 100644 index 000000000..13590586a --- /dev/null +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs @@ -0,0 +1,43 @@ +using CO.CDP.DataSharing.WebApi.Model; +using CO.CDP.DataSharing.WebApi.UseCase; +using CO.CDP.DataSharing.WebApi.Tests.AutoMapper; +using CO.CDP.OrganisationInformation.Persistence; +using FluentAssertions; +using Moq; +using CO.CDP.Authentication; +using CO.CDP.DataSharing.WebApi.Extensions; + +namespace CO.CDP.DataSharing.WebApi.Tests.UseCase; + +public class GetShareCodeVerifyUseCaseTest(AutoMapperFixture mapperFixture) : IClassFixture +{ + private readonly Mock _formRepository = new(); + private readonly Mock _shareCodeRepository = new(); + private GetShareCodeVerifyUseCase UseCase => new(_formRepository.Object); + + [Fact] + public async Task ThrowsSharedConsentNotFoundException_WhenShareCodeRequestedNotFound() + { + var formVersionId = "default"; + var shareCode = ShareCodeExtensions.GenerateShareCode(); + + var shareVerificationRequest = EntityFactory.GetShareVerificationRequest(formVersionId: formVersionId, shareCode: shareCode); + + var response = async () => await UseCase.Execute(shareVerificationRequest); + + await response.Should().ThrowAsync(); + } + + //[Fact] + //public async Task ReturnsTrue_WhenShareVerificationRequestForValidExistingShareCodeAndFormVersion() + //{ + // var formVersionId = "default"; + // var shareCode = ShareCodeExtensions.GenerateShareCode(); + // var organisationId = 1; + // var organisationGuid = Guid.NewGuid(); + // var formId = Guid.NewGuid(); + + // var shareVerificationRequest = EntityFactory.GetShareVerificationRequest(formVersionId: formVersionId, shareCode: shareCode); + // var sharedConsent = EntityFactory.GetSharedConsent(organisationId: organisationId, organisationGuid: organisationGuid, formId: formId); + //} +} \ No newline at end of file diff --git a/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs b/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs index d1f362e95..a297ed9a3 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Api/DataSharing.cs @@ -58,7 +58,7 @@ await useCase.Execute(shareRequest) app.MapPost("/share/data/verify", async (ShareVerificationRequest request, IUseCase useCase) => await useCase.Execute(request) - .AndThen(shareVerificationReceipt => Results.Ok(shareVerificationReceipt))) + .AndThen(shareVerificationReceipt => shareVerificationReceipt != null ? Results.Ok(shareVerificationReceipt) : Results.NotFound())) .Produces(StatusCodes.Status200OK, "application/json") .Produces(StatusCodes.Status401Unauthorized) .Produces(StatusCodes.Status404NotFound) diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index 28459e3a1..e1586c1fe 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -150,7 +150,7 @@ join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId fas.Deleted == false && s.FormVersionId == data!.FormVersionId && s.OrganisationId == data.OrganisationId - orderby s.SubmittedAt descending + orderby s.UpdatedOn descending select s).Take(1).FirstOrDefaultAsync(); From 5bead7d54fd1198724c5809167111d181390cb94 Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 16:01:08 +0100 Subject: [PATCH 6/8] moved ShareCode functions from IFormRepository to ISharedCodeRepository --- .../EntityFactory.cs | 115 +++++++++++------- .../UseCase/GetShareCodeDetailsUseCaseTest.cs | 6 +- .../UseCase/GetShareCodeVerifyUseCaseTest.cs | 32 +++-- .../UseCase/GetShareCodeDetailsUseCase.cs | 4 +- .../UseCase/GetShareCodeVerifyUseCase.cs | 4 +- .../DatabaseShareCodeRepositoryTest.cs | 36 +++++- .../DatabaseFormRepository.cs | 88 +------------- .../DatabaseShareCodeRepository.cs | 78 ++++++++++++ .../IFormRepository.cs | 4 +- .../IShareCodeRepository.cs | 4 +- 10 files changed, 216 insertions(+), 155 deletions(-) diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs index 93bb6b6fa..f96997be1 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs @@ -1,3 +1,4 @@ +using CO.CDP.DataSharing.WebApi.Extensions; using CO.CDP.DataSharing.WebApi.Model; using CO.CDP.OrganisationInformation.Persistence; using CO.CDP.OrganisationInformation.Persistence.Forms; @@ -19,8 +20,8 @@ internal static ShareVerificationRequest GetShareVerificationRequest(string form { return new ShareVerificationRequest { - FormVersionId=formVersionId, - ShareCode=shareCode + FormVersionId = formVersionId, + ShareCode = shareCode }; } @@ -51,7 +52,7 @@ internal static OrganisationInformation.Persistence.Forms.SharedConsent GetShare return new OrganisationInformation.Persistence.Forms.SharedConsent() { Guid = formId, - OrganisationId =orgnisation.Id, + OrganisationId = orgnisation.Id, Organisation = orgnisation, FormId = form.Id, Form = form, @@ -60,47 +61,79 @@ internal static OrganisationInformation.Persistence.Forms.SharedConsent GetShare SubmittedAt = DateTime.UtcNow, FormVersionId = string.Empty, ShareCode = string.Empty - + }; } - //internal static List GetSharedConsents(int organisationId, Guid organisationGuid, Guid formId) - //{ - // var form = new CO.CDP.OrganisationInformation.Persistence.Forms.Form - // { - // Guid = formId, - // Name = string.Empty, - // Version = string.Empty, - // IsRequired = default, - // Scope = default, - // Sections = new List { } - // }; - - // var orgnisation = new Organisation - // { - // Id = organisationId, - // Guid = organisationGuid, - // Name = string.Empty, - // Tenant = new Tenant - // { - // Guid = Guid.NewGuid(), - // Name = string.Empty - // } - // }; + internal static List GetSharedConsents(int organisationId, Guid organisationGuid, Guid formId) + { + var form = new CO.CDP.OrganisationInformation.Persistence.Forms.Form + { + Guid = formId, + Name = string.Empty, + Version = string.Empty, + IsRequired = default, + Scope = default, + Sections = new List { } + }; - // return new List() - // { - // Guid = formId, - // OrganisationId = orgnisation.Id, - // Organisation = orgnisation, - // FormId = form.Id, - // Form = form, - // AnswerSets = new List { }, - // SubmissionState = SubmissionState.Draft, - // SubmittedAt = DateTime.UtcNow, - // FormVersionId = string.Empty, - // ShareCode = string.Empty + var orgnisation = new Organisation + { + Id = organisationId, + Guid = organisationGuid, + Name = string.Empty, + Tenant = new Tenant + { + Guid = Guid.NewGuid(), + Name = string.Empty + } + }; - // }; - //} + return new List + { + new OrganisationInformation.Persistence.Forms.SharedConsent() + { + Guid = Guid.NewGuid(), + OrganisationId = orgnisation.Id, + Organisation = orgnisation, + FormId = form.Id, + Form = form, + AnswerSets = new List { }, + SubmissionState = SubmissionState.Draft, + SubmittedAt = DateTime.UtcNow, + FormVersionId = "V1.0", + ShareCode = ShareCodeExtensions.GenerateShareCode(), + UpdatedOn=DateTime.UtcNow.AddHours(-1) + }, + new OrganisationInformation.Persistence.Forms.SharedConsent() + { + Guid = Guid.NewGuid(), + OrganisationId = orgnisation.Id, + Organisation = orgnisation, + FormId = form.Id, + Form = form, + AnswerSets = new List { }, + SubmissionState = SubmissionState.Submitted, + SubmittedAt = DateTime.UtcNow, + FormVersionId = "V1.0", + ShareCode = ShareCodeExtensions.GenerateShareCode(), + UpdatedOn=DateTime.UtcNow.AddHours(-0.5) + } + , + new OrganisationInformation.Persistence.Forms.SharedConsent() + { + Guid = Guid.NewGuid(), + OrganisationId = orgnisation.Id, + Organisation = orgnisation, + FormId = form.Id, + Form = form, + AnswerSets = new List { }, + SubmissionState = SubmissionState.Submitted, + SubmittedAt = DateTime.UtcNow, + FormVersionId = "V1.0", + ShareCode = ShareCodeExtensions.GenerateShareCode(), + UpdatedOn=DateTime.UtcNow + } + }; + } } diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeDetailsUseCaseTest.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeDetailsUseCaseTest.cs index f34fed60a..ad816f5f7 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeDetailsUseCaseTest.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeDetailsUseCaseTest.cs @@ -10,8 +10,8 @@ namespace CO.CDP.DataSharing.WebApi.Tests.UseCase; public class GetShareCodeDetailsUseCaseTest(AutoMapperFixture mapperFixture) : IClassFixture { - private readonly Mock _formRepository = new(); - private GetShareCodeDetailsUseCase UseCase => new(_formRepository.Object, mapperFixture.Mapper); + private readonly Mock _shareCodeRepository = new(); + private GetShareCodeDetailsUseCase UseCase => new(_shareCodeRepository.Object, mapperFixture.Mapper); [Fact] public async Task ItReturnsNullIfNoSharedCodeIsFound() @@ -36,7 +36,7 @@ public async Task ItReturnsTheSharedCodeList() QuestionAnswers=new List() }; - _formRepository.Setup(r => r.GetShareCodeDetailsAsync(organisationId, shareCode)).ReturnsAsync(sharedConsentDetails); + _shareCodeRepository.Setup(r => r.GetShareCodeDetailsAsync(organisationId, shareCode)).ReturnsAsync(sharedConsentDetails); var result = await UseCase.Execute((organisationId, shareCode)); diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs index 13590586a..756080716 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs @@ -13,7 +13,7 @@ public class GetShareCodeVerifyUseCaseTest(AutoMapperFixture mapperFixture) : IC { private readonly Mock _formRepository = new(); private readonly Mock _shareCodeRepository = new(); - private GetShareCodeVerifyUseCase UseCase => new(_formRepository.Object); + private GetShareCodeVerifyUseCase UseCase => new(_shareCodeRepository.Object); [Fact] public async Task ThrowsSharedConsentNotFoundException_WhenShareCodeRequestedNotFound() @@ -28,16 +28,22 @@ public async Task ThrowsSharedConsentNotFoundException_WhenShareCodeRequestedNot await response.Should().ThrowAsync(); } - //[Fact] - //public async Task ReturnsTrue_WhenShareVerificationRequestForValidExistingShareCodeAndFormVersion() - //{ - // var formVersionId = "default"; - // var shareCode = ShareCodeExtensions.GenerateShareCode(); - // var organisationId = 1; - // var organisationGuid = Guid.NewGuid(); - // var formId = Guid.NewGuid(); - - // var shareVerificationRequest = EntityFactory.GetShareVerificationRequest(formVersionId: formVersionId, shareCode: shareCode); - // var sharedConsent = EntityFactory.GetSharedConsent(organisationId: organisationId, organisationGuid: organisationGuid, formId: formId); - //} + [Fact] + public async Task ReturnsTrue_WhenShareVerificationRequestForValidExistingShareCodeAndFormVersion() + { + var formVersionId = "V1.0"; + var shareCode = ShareCodeExtensions.GenerateShareCode(); + + var shareVerificationRequest = EntityFactory.GetShareVerificationRequest(formVersionId: formVersionId, shareCode: shareCode); + + _shareCodeRepository.Setup(r => r.GetShareCodeVerifyAsync(shareVerificationRequest.FormVersionId, shareVerificationRequest.ShareCode)).ReturnsAsync(true); + + var response = await UseCase.Execute(shareVerificationRequest); + + response.Should().NotBeNull(); + + response.As().ShareCode.Should().Be(shareVerificationRequest.ShareCode); + response.As().FormVersionId.Should().Be(shareVerificationRequest.FormVersionId); + response.As().IsLatest.Should().Be(true); + } } \ No newline at end of file diff --git a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeDetailsUseCase.cs b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeDetailsUseCase.cs index 5afcff009..a67d81cab 100644 --- a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeDetailsUseCase.cs +++ b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeDetailsUseCase.cs @@ -4,12 +4,12 @@ namespace CO.CDP.DataSharing.WebApi.UseCase; -public class GetShareCodeDetailsUseCase(IFormRepository formRepository, IMapper mapper) +public class GetShareCodeDetailsUseCase(IShareCodeRepository shareCodeRepository, IMapper mapper) : IUseCase<(Guid organisationId, string shareCode), SharedConsentDetails?> { public async Task Execute((Guid organisationId, string shareCode) input) { - var details = await formRepository.GetShareCodeDetailsAsync(input.organisationId, input.shareCode); + var details = await shareCodeRepository.GetShareCodeDetailsAsync(input.organisationId, input.shareCode); if (details == null) return null; diff --git a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs index 01eb826f8..ddba01c0b 100644 --- a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs +++ b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetShareCodeVerifyUseCase.cs @@ -5,13 +5,13 @@ namespace CO.CDP.DataSharing.WebApi.UseCase; public class GetShareCodeVerifyUseCase( - IFormRepository formRepository) + IShareCodeRepository shareCodeRepository) : IUseCase { public async Task Execute(ShareVerificationRequest shareRequest) { - var details = await formRepository.GetShareCodeVerifyAsync(shareRequest.FormVersionId, shareRequest.ShareCode); + var details = await shareCodeRepository.GetShareCodeVerifyAsync(shareRequest.FormVersionId, shareRequest.ShareCode); if (details == null) { diff --git a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs index 392cfe9cb..83428ed24 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs @@ -133,6 +133,36 @@ public async Task GetByShareCode_WhenShareCodeExists_ReturnsSharedConsent() retrievedSection.Questions.Should().ContainSingle(q => q.Title == "Yes or no?"); } + + [Fact] + public async Task GetShareCodeVerifyAsync_WhenShareCodeIsLatest_ReturnsTrue() + { + var form = GivenForm(Guid.NewGuid()); + var section = GivenSection(Guid.NewGuid(), form); + var question = GivenYesOrNoQuestion(section); + var sharedConsent = GivenSharedConsent(form); + var answerSet = GivenAnswerSet(sharedConsent, section); + var answer = GivenAnswer(question, answerSet); + + sharedConsent.SubmissionState = SubmissionState.Submitted; + sharedConsent.SubmittedAt = DateTime.UtcNow; + + var shareCode = "EXISTENTCODE"; + + sharedConsent.ShareCode = shareCode; + + await using var context = postgreSql.OrganisationInformationContext(); + await context.SharedConsents.AddAsync(sharedConsent); + await context.SaveChangesAsync(); + + using var repository = ShareCodeRepository(); + + var foundConsent = await repository.GetShareCodeVerifyAsync(form.Version, shareCode); + + foundConsent.Should().NotBeNull(); + foundConsent!.Should().Be(true); + } + private static SharedConsent GivenSharedConsent( Form? form = null, Organisation? organisation = null) @@ -145,12 +175,12 @@ private static SharedConsent GivenSharedConsent( Guid = Guid.NewGuid(), OrganisationId = organisation.Id, Organisation = organisation, - FormId = form.Id, + FormId = form.Id, Form = form, AnswerSets = [], SubmissionState = SubmissionState.Draft, SubmittedAt = null, - FormVersionId = "202404", + FormVersionId = form.Version, ShareCode = null }; } @@ -164,7 +194,7 @@ private static Form GivenForm(Guid formId) Version = "1.0", IsRequired = true, Scope = FormScope.SupplierInformation, - Sections = new List() + Sections = new List() }; } private static Tenant GivenTenant() diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs index e1586c1fe..03bd25623 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseFormRepository.cs @@ -75,93 +75,7 @@ public async Task SaveSharedConsentAsync(SharedConsent sharedConsent) .ThenInclude(a => a.Answers) .Where(x => x.SubmissionState == SubmissionState.Draft) .FirstOrDefaultAsync(s => s.Form.Guid == formId && s.Organisation.Guid == organisationId); - } - - public async Task> GetShareCodesAsync(Guid organisationId) - { - return await context.Set() - .Where(x => x.SubmissionState == SubmissionState.Submitted && x.Organisation.Guid == organisationId) - .OrderByDescending(y => y.SubmittedAt).ToListAsync(); - } - - public async Task GetShareCodeDetailsAsync(Guid organisationId, string shareCode) - { - var query = from s in context.SharedConsents - join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId - join fs in context.Set() on fas.SectionId equals fs.Id - join fa in context.Set() on fas.Id equals fa.FormAnswerSetId - join fq in context.Set() on fa.QuestionId equals fq.Id - join o in context.Organisations on s.OrganisationId equals o.Id - where - fs.Type == FormSectionType.Declaration - && fas.Deleted == false - && o.Guid == organisationId - && s.ShareCode == shareCode - select new - { - FormAnswerSetId = fas.Id, - FormAnswerSetUpdate = fas.UpdatedOn, - s.ShareCode, - s.SubmittedAt, - QuestionId = fq.Guid, - QuestionType = fq.Type, - fq.SummaryTitle, - FormAnswer = fa - }; - - var data = await query.ToListAsync(); - var sharedCodeResult = data.OrderByDescending(x => x.FormAnswerSetUpdate).GroupBy(g => new { g.ShareCode, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); - if (sharedCodeResult == null) return null; - - return new SharedConsentDetails - { - ShareCode = sharedCodeResult.Key.ShareCode, - SubmittedAt = sharedCodeResult.Key.SubmittedAt!.Value, - QuestionAnswers = sharedCodeResult.Select(a => - new SharedConsentQuestionAnswer - { - QuestionId = a.QuestionId, - QuestionType = a.QuestionType, - Title = a.SummaryTitle, - Answer = a.FormAnswer - }) - }; - } - - public async Task GetShareCodeVerifyAsync(string formVersionId, string shareCode) - { - var query = from s in context.SharedConsents - join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId - where - fas.Deleted == false - && s.FormVersionId == formVersionId - && s.ShareCode == shareCode - select s; - - if (query.Count() > 1) return false; // Scenario-1: if one sharecode with multiple answersets - - var data = await query.FirstOrDefaultAsync(); - if (data == null) return null; // Scenario-2: if Sharecode not found - - // Get the latest SharedConsent records of the Organistaion and FormVersionId - var latestShareCode = await (from s in context.SharedConsents - join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId - where - fas.Deleted == false - && s.FormVersionId == data!.FormVersionId - && s.OrganisationId == data.OrganisationId - orderby s.UpdatedOn descending - select s).Take(1).FirstOrDefaultAsync(); - - - if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario-3: Sharecode is not submitted - - if (data!.ShareCode == latestShareCode.ShareCode - && data!.ShareCode == shareCode - && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario-4: if requested sharecode is latest Sharecode and stae is submitted - - return false; //Scenario-4: if scenario-4 is not passed - } + } public async Task> GetQuestionsAsync(Guid sectionId) { diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseShareCodeRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseShareCodeRepository.cs index 382a10856..65afe8d0d 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseShareCodeRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseShareCodeRepository.cs @@ -39,6 +39,84 @@ public async Task> GetShareCodesAsync(Guid organisati .ThenInclude(f => f.Sections) .ThenInclude(s => s.Questions) .FirstOrDefaultAsync(); + } + + public async Task GetShareCodeDetailsAsync(Guid organisationId, string shareCode) + { + var query = from s in context.SharedConsents + join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId + join fs in context.Set() on fas.SectionId equals fs.Id + join fa in context.Set() on fas.Id equals fa.FormAnswerSetId + join fq in context.Set() on fa.QuestionId equals fq.Id + join o in context.Organisations on s.OrganisationId equals o.Id + where + fs.Type == FormSectionType.Declaration + && fas.Deleted == false + && o.Guid == organisationId + && s.ShareCode == shareCode + select new + { + FormAnswerSetId = fas.Id, + FormAnswerSetUpdate = fas.UpdatedOn, + s.ShareCode, + s.SubmittedAt, + QuestionId = fq.Guid, + QuestionType = fq.Type, + fq.SummaryTitle, + FormAnswer = fa + }; + + var data = await query.ToListAsync(); + var sharedCodeResult = data.OrderByDescending(x => x.FormAnswerSetUpdate).GroupBy(g => new { g.ShareCode, g.FormAnswerSetId, g.SubmittedAt }).FirstOrDefault(); + if (sharedCodeResult == null) return null; + + return new SharedConsentDetails + { + ShareCode = sharedCodeResult.Key.ShareCode, + SubmittedAt = sharedCodeResult.Key.SubmittedAt!.Value, + QuestionAnswers = sharedCodeResult.Select(a => + new SharedConsentQuestionAnswer + { + QuestionId = a.QuestionId, + QuestionType = a.QuestionType, + Title = a.SummaryTitle, + Answer = a.FormAnswer + }) + }; + } + + public async Task GetShareCodeVerifyAsync(string formVersionId, string shareCode) + { + // Get FormId and Organisation based on ShareCode and FormVersionId + var query = from s in context.SharedConsents + where + s.FormVersionId == formVersionId + && s.ShareCode == shareCode + select s; + + if (query.Count() > 1) return false; // Scenario-1: + + var data = await query.FirstOrDefaultAsync(); + if (data == null) return null; // Scenario-2: if Sharecode not found + + // Get the latest SharedConsent records of the Organistaion and FormVersionId and FormId + var latestShareCode = await (from s in context.SharedConsents + join fas in context.FormAnswerSets on s.Id equals fas.SharedConsentId + where + fas.Deleted == false + && s.OrganisationId == data.OrganisationId + && s.FormId == data.FormId + && s.FormVersionId == data!.FormVersionId + orderby s.UpdatedOn descending + select s).Take(1).FirstOrDefaultAsync(); + + if (latestShareCode!.SubmissionState != SubmissionState.Submitted) return false; // Scenario-3: Sharecode is not submitted + + if (data!.ShareCode == latestShareCode.ShareCode + && data!.ShareCode == shareCode + && data!.SubmissionState == SubmissionState.Submitted) return true; //Scenario-4: if requested sharecode is latest Sharecode and stae is submitted + + return false; //Scenario-4: if scenario-4 is not passed } public void Dispose() diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs index 5f6c996a9..6152f0cd3 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/IFormRepository.cs @@ -9,9 +9,7 @@ public interface IFormRepository : IDisposable Task SaveSharedConsentAsync(SharedConsent sharedConsent); Task GetSectionAsync(Guid formId, Guid sectionId); Task GetSharedConsentDraftWithAnswersAsync(Guid formId, Guid organisationId); - Task> GetShareCodesAsync(Guid organisationId); - Task GetShareCodeDetailsAsync(Guid organisationId, string shareCode); - Task GetShareCodeVerifyAsync(string formVersionId, string shareCode); + Task> GetQuestionsAsync(Guid sectionId); Task> GetFormAnswerSetsAsync(Guid sectionId, Guid organisationId); diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/IShareCodeRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/IShareCodeRepository.cs index bf297d716..001cc5511 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/IShareCodeRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/IShareCodeRepository.cs @@ -5,5 +5,7 @@ public interface IShareCodeRepository : IDisposable { Task> GetShareCodesAsync(Guid organisationId); Task GetSharedConsentDraftAsync(Guid formId, Guid organisationId); - Task GetByShareCode(string sharecode); + Task GetByShareCode(string sharecode); + Task GetShareCodeDetailsAsync(Guid organisationId, string shareCode); + Task GetShareCodeVerifyAsync(string formVersionId, string shareCode); } From dbc400fa3824daf92c69889e01932f010a242d73 Mon Sep 17 00:00:00 2001 From: Shilpi Goel Date: Tue, 27 Aug 2024 17:08:59 +0100 Subject: [PATCH 7/8] Corrected test --- .../UseCase/GetShareCodeVerifyUseCaseTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs index 756080716..b08afb3da 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetShareCodeVerifyUseCaseTest.cs @@ -9,7 +9,7 @@ namespace CO.CDP.DataSharing.WebApi.Tests.UseCase; -public class GetShareCodeVerifyUseCaseTest(AutoMapperFixture mapperFixture) : IClassFixture +public class GetShareCodeVerifyUseCaseTest() : IClassFixture { private readonly Mock _formRepository = new(); private readonly Mock _shareCodeRepository = new(); From a150b91a0057608e875a0d3d225df7f4c30366fd Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Wed, 28 Aug 2024 10:37:40 +0100 Subject: [PATCH 8/8] Fix tests and remove static analysis warnings --- .../DatabaseShareCodeRepositoryTest.cs | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs index 83428ed24..acb484dbb 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseShareCodeRepositoryTest.cs @@ -65,12 +65,13 @@ public async Task GetShareCodesAsync_WhenCodesExist_ReturnsList() var found = await repository.GetShareCodesAsync(sharedConsent.Organisation.Guid); - found.Should().NotBeEmpty(); - found.Should().HaveCount(1); + var sharedConsents = found.ToList(); + sharedConsents.Should().NotBeEmpty(); + sharedConsents.Should().HaveCount(1); - found.First().As().OrganisationId.Should().Be(sharedConsent.OrganisationId); - found.First().As().SubmissionState.Should().Be(SubmissionState.Submitted); - found.First().As().ShareCode.Should().Be(bookingref); + sharedConsents.First().As().OrganisationId.Should().Be(sharedConsent.OrganisationId); + sharedConsents.First().As().SubmissionState.Should().Be(SubmissionState.Submitted); + sharedConsents.First().As().ShareCode.Should().Be(bookingref); } @@ -92,11 +93,11 @@ public async Task GetByShareCode_WhenShareCodeExists_ReturnsSharedConsent() var question = GivenYesOrNoQuestion(section); var sharedConsent = GivenSharedConsent(form); var answerSet = GivenAnswerSet(sharedConsent, section); - var answer = GivenAnswer(question, answerSet); + GivenAnswer(question, answerSet); sharedConsent.SubmissionState = SubmissionState.Submitted; sharedConsent.SubmittedAt = DateTime.UtcNow; - var shareCode = "EXISTENTCODE"; + var shareCode = "EXISTING-CODE-2"; sharedConsent.ShareCode = shareCode; await using var context = postgreSql.OrganisationInformationContext(); @@ -115,9 +116,9 @@ public async Task GetByShareCode_WhenShareCodeExists_ReturnsSharedConsent() var registeredAddress = foundConsent.Organisation.Addresses.FirstOrDefault(a => a.Type == AddressType.Registered); registeredAddress.Should().NotBeNull(); - registeredAddress!.Address.Should().NotBeNull(); - registeredAddress!.Address.StreetAddress.Should().Be("82 St. John’s Road"); - registeredAddress!.Address.PostalCode.Should().Be("CH43 7UR"); + registeredAddress.As().Address.Should().NotBeNull(); + registeredAddress.As().Address.StreetAddress.Should().Be("82 St. John’s Road"); + registeredAddress.As().Address.PostalCode.Should().Be("CH43 7UR"); foundConsent.AnswerSets.Should().ContainSingle(); @@ -137,30 +138,30 @@ public async Task GetByShareCode_WhenShareCodeExists_ReturnsSharedConsent() [Fact] public async Task GetShareCodeVerifyAsync_WhenShareCodeIsLatest_ReturnsTrue() { - var form = GivenForm(Guid.NewGuid()); + var form = GivenForm(Guid.NewGuid()); var section = GivenSection(Guid.NewGuid(), form); var question = GivenYesOrNoQuestion(section); var sharedConsent = GivenSharedConsent(form); var answerSet = GivenAnswerSet(sharedConsent, section); - var answer = GivenAnswer(question, answerSet); + GivenAnswer(question, answerSet); sharedConsent.SubmissionState = SubmissionState.Submitted; sharedConsent.SubmittedAt = DateTime.UtcNow; - var shareCode = "EXISTENTCODE"; - - sharedConsent.ShareCode = shareCode; + var shareCode = "EXISTING-CODE-1"; + + sharedConsent.ShareCode = shareCode; await using var context = postgreSql.OrganisationInformationContext(); await context.SharedConsents.AddAsync(sharedConsent); await context.SaveChangesAsync(); - using var repository = ShareCodeRepository(); + using var repository = ShareCodeRepository(); var foundConsent = await repository.GetShareCodeVerifyAsync(form.Version, shareCode); foundConsent.Should().NotBeNull(); - foundConsent!.Should().Be(true); + foundConsent.Should().Be(true); } private static SharedConsent GivenSharedConsent( @@ -175,7 +176,7 @@ private static SharedConsent GivenSharedConsent( Guid = Guid.NewGuid(), OrganisationId = organisation.Id, Organisation = organisation, - FormId = form.Id, + FormId = form.Id, Form = form, AnswerSets = [], SubmissionState = SubmissionState.Draft, @@ -194,7 +195,7 @@ private static Form GivenForm(Guid formId) Version = "1.0", IsRequired = true, Scope = FormScope.SupplierInformation, - Sections = new List() + Sections = new List() }; } private static Tenant GivenTenant() @@ -228,7 +229,7 @@ private static FormSection GivenSection(Guid sectionId, Form form) }; } - private static FormAnswer GivenAnswer(FormQuestion question, FormAnswerSet answerSet) + private static void GivenAnswer(FormQuestion question, FormAnswerSet answerSet) { var answer = new FormAnswer { @@ -240,7 +241,6 @@ private static FormAnswer GivenAnswer(FormQuestion question, FormAnswerSet answe BoolValue = true }; answerSet.Answers.Add(answer); - return answer; } private static FormAnswerSet GivenAnswerSet(SharedConsent sharedConsent, FormSection section) @@ -306,10 +306,10 @@ private static Organisation GivenOrganisation() }, Addresses = new List { - new Organisation.OrganisationAddress + new() { Type = AddressType.Registered, - Address = new OrganisationInformation.Persistence.Address + Address = new Address { StreetAddress = "82 St. John’s Road", Locality = "CHESTER",