From c035238dcbc7879056bc8acef7c5ea18fc600b47 Mon Sep 17 00:00:00 2001 From: maciej-goaco Date: Mon, 7 Oct 2024 14:18:34 +0100 Subject: [PATCH] DP-556 - OrganisationType implemented (#714) * DP-556 - OrganisationType (or rather OperationType) implemented * DP-556 - Fixed return type to IList; Basic test coverage added * DP-556 - OperationTypes test fixed * DP-566 - Enum values fixed * DP-566 - Tests parallel execution fixed * DP-556 - Bad merge remains removed --- .../Supplier/SupplierBasicInformationTest.cs | 2 +- .../Pages/Supplier/SupplierDetailsFactory.cs | 2 +- .../Supplier/SupplierOperationQuestionTest.cs | 4 +- .../Constants/OperationTypes.cs | 4 +- .../Supplier/SupplierOperationQuestion.cshtml | 4 +- .../EntityFactory.cs | 7 ++++ .../UseCase/GetSharedDataUseCaseTest.cs | 8 ++++ .../Model/Details.cs | 4 ++ .../UseCase/GetSharedDataUseCase.cs | 7 +++- .../DatabaseOrganisationRepositoryTest.cs | 37 +++++++++++++++++++ .../DatabaseOrganisationRepository.cs | 10 +++++ .../IOrganisationRepository.cs | 2 + .../OperationType.cs | 2 +- 13 files changed, 83 insertions(+), 10 deletions(-) diff --git a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierBasicInformationTest.cs b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierBasicInformationTest.cs index 2c02bcd80..a1a3d7fd5 100644 --- a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierBasicInformationTest.cs +++ b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierBasicInformationTest.cs @@ -37,7 +37,7 @@ public async Task OnGet_SetSupplierInformation() _model.SupplierInformation.Should().Be(supplierInfo); _model.SupplierInformation?.OperationTypes.Should().NotBeNull(); _model.SupplierInformation?.OperationTypes.Should().BeOfType>(); - _model.SupplierInformation?.OperationTypes.Should().Contain(OperationType.SmallorMediumSized); + _model.SupplierInformation?.OperationTypes.Should().Contain(OperationType.SmallOrMediumSized); _model.SupplierInformation?.OperationTypes.Should().Contain(OperationType.NonGovernmental); } diff --git a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierDetailsFactory.cs b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierDetailsFactory.cs index ce127caa0..8c4cd662e 100644 --- a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierDetailsFactory.cs +++ b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierDetailsFactory.cs @@ -17,7 +17,7 @@ public static SupplierInformation CreateSupplierInformationClientModel( return new SupplierInformation( organisationName: "FakeOrg", supplierType: SupplierType.Organisation, - operationTypes: new List() { OperationType.SmallorMediumSized, OperationType.NonGovernmental }, + operationTypes: new List() { OperationType.SmallOrMediumSized, OperationType.NonGovernmental }, completedRegAddress: true, completedPostalAddress: completedPostalAddress, completedVat: true, diff --git a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierOperationQuestionTest.cs b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierOperationQuestionTest.cs index ba681187c..cb1c93fc4 100644 --- a/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierOperationQuestionTest.cs +++ b/Frontend/CO.CDP.OrganisationApp.Tests/Pages/Supplier/SupplierOperationQuestionTest.cs @@ -57,7 +57,7 @@ public async Task OnPost_ValidModelState_ReturnsRedirectToSupplierBasicInformati { var id = Guid.NewGuid(); _model.Id = id; - _model.SelectedOperationTypes = new List { OperationType.SmallorMediumSized }; + _model.SelectedOperationTypes = new List { OperationType.SmallOrMediumSized }; _organisationClientMock.Setup(client => client.GetOrganisationAsync(id)) .ReturnsAsync(SupplierDetailsFactory.GivenOrganisationClientModel(id)); @@ -89,7 +89,7 @@ public void ValidateModel_WithNoneAndOtherOperationTypes_ShouldReturnValidationE SelectedOperationTypes = new List { OperationType.None, - OperationType.SmallorMediumSized + OperationType.SmallOrMediumSized } }; diff --git a/Frontend/CO.CDP.OrganisationApp/Constants/OperationTypes.cs b/Frontend/CO.CDP.OrganisationApp/Constants/OperationTypes.cs index 0a6eabca7..6a911f8c5 100644 --- a/Frontend/CO.CDP.OrganisationApp/Constants/OperationTypes.cs +++ b/Frontend/CO.CDP.OrganisationApp/Constants/OperationTypes.cs @@ -9,7 +9,7 @@ public static string Description(this OperationType operationType) { return operationType switch { - OperationType.SmallorMediumSized => "As a small or medium-sized enterprise", + OperationType.SmallOrMediumSized => "As a small or medium-sized enterprise", OperationType.NonGovernmental => "As a non-governmental organisation that is value-driven and which principally reinvests its surpluses to further social, environmental or cultural objectives", OperationType.SupportedEmploymentProvider => "As a supported employment provider", OperationType.PublicService => "As a public service mutual", @@ -22,7 +22,7 @@ public static string ShortDescription(this OperationType operationType) { return operationType switch { - OperationType.SmallorMediumSized => "Small or medium-sized enterprise", + OperationType.SmallOrMediumSized => "Small or medium-sized enterprise", OperationType.NonGovernmental => "Non-governmental organisation ", OperationType.SupportedEmploymentProvider => "Supported employment provider", OperationType.PublicService => "Public service mutual", diff --git a/Frontend/CO.CDP.OrganisationApp/Pages/Supplier/SupplierOperationQuestion.cshtml b/Frontend/CO.CDP.OrganisationApp/Pages/Supplier/SupplierOperationQuestion.cshtml index 506c4253a..820d260b3 100644 --- a/Frontend/CO.CDP.OrganisationApp/Pages/Supplier/SupplierOperationQuestion.cshtml +++ b/Frontend/CO.CDP.OrganisationApp/Pages/Supplier/SupplierOperationQuestion.cshtml @@ -40,9 +40,9 @@
+ name="SelectedOperationTypes" type="checkbox" value="@OperationType.SmallOrMediumSized" @IsSelected(OperationType.SmallOrMediumSized) />
diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs index ad1e1db20..2889c33b6 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/EntityFactory.cs @@ -134,6 +134,13 @@ internal static List GetMockAdditionalEntities() return mockEntities; } + internal static IList GetOperationTypes() + { + var mockOperationType = new List { OperationType.SmallOrMediumSized }; + + return mockOperationType; + } + public static Organisation GivenOrganisation( Guid? guid = null, Tenant? tenant = null, diff --git a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetSharedDataUseCaseTest.cs b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetSharedDataUseCaseTest.cs index 5d00b3830..a8b613c24 100644 --- a/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetSharedDataUseCaseTest.cs +++ b/Services/CO.CDP.DataSharing.WebApi.Tests/UseCase/GetSharedDataUseCaseTest.cs @@ -88,6 +88,7 @@ public async Task ItReturnsMappedSupplierInformationWhenSharedConsentIsFound() var mockAssociatedPersons = EntityFactory.GetMockAssociatedPersons(); var mockAdditionalEntities = EntityFactory.GetMockAdditionalEntities(); + var mockOperationTypes = EntityFactory.GetOperationTypes(); _organisationRepository.Setup(repo => repo.GetConnectedIndividualTrusts(organisationId)) .ReturnsAsync(mockAssociatedPersons); @@ -95,6 +96,9 @@ public async Task ItReturnsMappedSupplierInformationWhenSharedConsentIsFound() _organisationRepository.Setup(repo => repo.GetConnectedOrganisations(organisationId)) .ReturnsAsync(mockAdditionalEntities); + _organisationRepository.Setup(repo => repo.GetOperationTypes(organisationId)) + .ReturnsAsync(mockOperationTypes); + return (shareCode, organisationId, organisationGuid, formId); } @@ -172,6 +176,10 @@ private void AssertRoles(IEnumerable? roles) private void AssertDetails(Details? details) { details.Should().NotBeNull(); + details?.Scale.Should().Be("small"); + details?.Vcse.Should().Be(false); + details?.ShelteredWorkshop.Should().Be(false); + details?.PublicServiceMissionOrganization.Should().Be(false); } private void AssertSupplierInformationData(SupplierInformationData? supplierInformationData) diff --git a/Services/CO.CDP.DataSharing.WebApi/Model/Details.cs b/Services/CO.CDP.DataSharing.WebApi/Model/Details.cs index 3b0359fed..77b735e68 100644 --- a/Services/CO.CDP.DataSharing.WebApi/Model/Details.cs +++ b/Services/CO.CDP.DataSharing.WebApi/Model/Details.cs @@ -3,6 +3,10 @@ namespace CO.CDP.DataSharing.WebApi.Model; public class Details { public LegalForm? LegalForm { get; set; } + public string? Scale { get; set; } + public bool Vcse { get; set; } + public bool ShelteredWorkshop { get; set; } + public bool PublicServiceMissionOrganization { get; set; } } public record LegalForm diff --git a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetSharedDataUseCase.cs b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetSharedDataUseCase.cs index 9482f83c1..701c576c6 100644 --- a/Services/CO.CDP.DataSharing.WebApi/UseCase/GetSharedDataUseCase.cs +++ b/Services/CO.CDP.DataSharing.WebApi/UseCase/GetSharedDataUseCase.cs @@ -42,10 +42,15 @@ public class GetSharedDataUseCase( private async Task
GetDetails(SharedConsent sharedConsent) { var legalForm = await organisationRepository.GetLegalForm(sharedConsent.OrganisationId); + var operationTypes = await organisationRepository.GetOperationTypes(sharedConsent.OrganisationId); return new Details { - LegalForm = legalForm != null ? mapper.Map(legalForm) : null + LegalForm = legalForm != null ? mapper.Map(legalForm) : null, + Scale = operationTypes.Contains(OperationType.SmallOrMediumSized) ? "small" : "large", + Vcse = operationTypes.Contains(OperationType.NonGovernmental), + ShelteredWorkshop = operationTypes.Contains(OperationType.SupportedEmploymentProvider), + PublicServiceMissionOrganization = operationTypes.Contains(OperationType.PublicService) }; } diff --git a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseOrganisationRepositoryTest.cs b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseOrganisationRepositoryTest.cs index 18952c978..85cdbbab8 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseOrganisationRepositoryTest.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence.Tests/DatabaseOrganisationRepositoryTest.cs @@ -375,6 +375,43 @@ public async Task GetConnectedOrganisations_WhenNoConnectedEntitiesExist_Returns result.Should().BeEmpty(); } + [Fact] + public async Task GetOperationTypes_WhenNoOperationTypeExists_ReturnsNull() + { + using var repository = OrganisationRepository(); + + var organisation = GivenOrganisation(); + organisation.SupplierInfo = GivenSupplierInformation(); + organisation.SupplierInfo.OperationTypes = []; + + using var context = postgreSql.OrganisationInformationContext(); + await context.Organisations.AddAsync(organisation); + await context.SaveChangesAsync(); + + var result = await repository.GetOperationTypes(organisation.Id); + + result.Should().BeEmpty(); + } + + [Fact] + public async Task GetOperationTypes_WhenOperationTypeExists_ReturnsEmptyList() + { + using var repository = OrganisationRepository(); + + var organisation = GivenOrganisation(); + organisation.SupplierInfo = GivenSupplierInformation(); + organisation.SupplierInfo.OperationTypes = [OperationType.SmallOrMediumSized]; + + using var context = postgreSql.OrganisationInformationContext(); + await context.Organisations.AddAsync(organisation); + await context.SaveChangesAsync(); + + var result = await repository.GetOperationTypes(organisation.Id); + + result.Should().NotBeNull(); + result.Should().Contain(OperationType.SmallOrMediumSized); + } + private IOrganisationRepository OrganisationRepository() { return new DatabaseOrganisationRepository(postgreSql.OrganisationInformationContext()); diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseOrganisationRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseOrganisationRepository.cs index 08d51ede8..16935477b 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseOrganisationRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/DatabaseOrganisationRepository.cs @@ -118,6 +118,16 @@ public async Task> GetConnectedOrganisations(int organisa return organisation?.SupplierInfo?.LegalForm; } + public async Task> GetOperationTypes(int organisationId) + { + var organisation = await context.Organisations + .Where(x => x.Id == organisationId) + .Include(x => x.SupplierInfo) + .FirstOrDefaultAsync(); + + return organisation?.SupplierInfo?.OperationTypes ?? []; + } + public void Save(Organisation organisation) { try diff --git a/Services/CO.CDP.OrganisationInformation.Persistence/IOrganisationRepository.cs b/Services/CO.CDP.OrganisationInformation.Persistence/IOrganisationRepository.cs index baf7f8508..677133eda 100644 --- a/Services/CO.CDP.OrganisationInformation.Persistence/IOrganisationRepository.cs +++ b/Services/CO.CDP.OrganisationInformation.Persistence/IOrganisationRepository.cs @@ -31,4 +31,6 @@ public class DuplicateOrganisationException(string message, Exception? cause = n public Task> GetConnectedOrganisations(int organisationId); public Task GetLegalForm(int organisationId); + + public Task> GetOperationTypes(int organisationId); } \ No newline at end of file diff --git a/Services/CO.CDP.OrganisationInformation/OperationType.cs b/Services/CO.CDP.OrganisationInformation/OperationType.cs index 669327232..13947b881 100644 --- a/Services/CO.CDP.OrganisationInformation/OperationType.cs +++ b/Services/CO.CDP.OrganisationInformation/OperationType.cs @@ -5,7 +5,7 @@ namespace CO.CDP.OrganisationInformation; [JsonConverter(typeof(JsonStringEnumConverter))] public enum OperationType { - SmallorMediumSized = 1, + SmallOrMediumSized, NonGovernmental, SupportedEmploymentProvider, PublicService,