From 30697061c5a1678630c974fa7cdb07aee0cfd63c Mon Sep 17 00:00:00 2001 From: Marco Russo Date: Fri, 28 Feb 2025 12:18:33 +0000 Subject: [PATCH] Chore/split organisation endpoint test coverage tests (#171) * chore: moving test class * chore: adjusting tests * chore: adjusting tests * chore: spotless * chore: small refactoring for sonar issues --- ...ngCoreEventHandlerDuplicateEventsTest.java | 2 +- .../service/OrganisationServiceTest.java | 131 ----------- organisation/build.gradle.kts | 4 - .../domain/entity/Organisation.java | 3 - ...ionUpsert.java => OrganisationCreate.java} | 5 +- .../domain/request/OrganisationUpdate.java | 46 ++++ .../domain/view/OrganisationView.java | 13 +- .../resource/OrganisationResource.java | 83 ++++++- .../service/OrganisationService.java | 108 +++++---- ...3__lob_service_app_organisation_module.sql | 2 - .../service/OrganisationServiceTest.java | 210 ++++++++++++++++++ 11 files changed, 406 insertions(+), 201 deletions(-) delete mode 100644 accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java rename organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/{OrganisationUpsert.java => OrganisationCreate.java} (92%) create mode 100644 organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpdate.java create mode 100644 organisation/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java diff --git a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/service/internal/AccountingCoreEventHandlerDuplicateEventsTest.java b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/service/internal/AccountingCoreEventHandlerDuplicateEventsTest.java index 54b509a9..294a9512 100644 --- a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/service/internal/AccountingCoreEventHandlerDuplicateEventsTest.java +++ b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/service/internal/AccountingCoreEventHandlerDuplicateEventsTest.java @@ -71,7 +71,7 @@ class AccountingCoreEventHandlerDuplicateEventsTest { private TransactionReconcilationRepository transactionReconcilationRepository; @BeforeEach - public void clearDatabase(@Autowired Flyway flyway){ + void clearDatabase(@Autowired Flyway flyway){ flyway.clean(); flyway.migrate(); } diff --git a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java deleted file mode 100644 index 748f1d60..00000000 --- a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.cardanofoundation.lob.app.organisation.service; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import org.cardanofoundation.lob.app.organisation.domain.entity.Organisation; -import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationCostCenter; -import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationProject; -import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpsert; -import org.cardanofoundation.lob.app.organisation.domain.view.OrganisationView; -import org.cardanofoundation.lob.app.organisation.repository.*; - -@ExtendWith(MockitoExtension.class) -class OrganisationServiceTest { - - @Mock - private OrganisationRepository organisationRepository; - - @Mock - private CostCenterService costCenterService; - - @Mock - private ProjectMappingRepository projectMappingRepository; - - @Mock - private OrganisationChartOfAccountTypeRepository organisationChartOfAccountTypeRepository; - - @Mock - private ChartOfAccountRepository organisationChartOfAccountRepository; - - @Mock - private OrganisationChartOfAccountSubTypeRepository organisationChartOfAccountSubTypeRepository; - - @Mock - private AccountEventRepository accountEventRepository; - - @Mock - private OrganisationCurrencyService organisationCurrencyService; - - @InjectMocks - private OrganisationService organisationService; - - private Organisation organisation; - - @BeforeEach - void setUp() { - organisation = new Organisation(); - organisation.setId("org-123"); - } - - @Test - void testFindById_WhenOrganisationExists() { - when(organisationRepository.findById("org-123")).thenReturn(Optional.of(organisation)); - Optional result = organisationService.findById("org-123"); - assertTrue(result.isPresent()); - assertEquals("org-123", result.get().getId()); - } - - @Test - void testFindById_WhenOrganisationDoesNotExist() { - when(organisationRepository.findById("org-123")).thenReturn(Optional.empty()); - Optional result = organisationService.findById("org-123"); - assertFalse(result.isPresent()); - } - - @Test - void testFindAll() { - List organisations = List.of(organisation); - when(organisationRepository.findAll()).thenReturn(organisations); - List result = organisationService.findAll(); - assertEquals(1, result.size()); - } - - @Test - void testGetAllCostCenter() { - Set costCenters = new HashSet<>(); - when(costCenterService.getAllCostCenter("org-123")).thenReturn(costCenters); - Set result = organisationService.getAllCostCenter("org-123"); - assertEquals(costCenters, result); - } - - @Test - void testGetAllProjects() { - Set projects = new HashSet<>(); - when(projectMappingRepository.findAllByOrganisationId("org-123")).thenReturn(projects); - Set result = organisationService.getAllProjects("org-123"); - assertEquals(projects, result); - } - - @Test - void testUpsertOrganisation_NewOrganisation() { - OrganisationUpsert organisationUpsert = new OrganisationUpsert(); - organisationUpsert.setCountryCode("US"); - organisationUpsert.setTaxIdNumber("12345"); - organisationUpsert.setAddress("Street"); - organisationUpsert.setName("Company name"); - organisationUpsert.setAdminEmail("the@email.com"); - organisationUpsert.setCity("City name"); - organisationUpsert.setCountry("Country name"); - organisationUpsert.setCurrencyId("ISO_4217:CHF"); - organisationUpsert.setPostCode("A127"); - organisationUpsert.setProvince("County co."); - organisationUpsert.setReportCurrencyId("ISO_4217:CHF"); - organisationUpsert.setPhoneNumber("0101010101"); - - when(organisationRepository.findById(any())).thenReturn(Optional.empty()); - when(organisationRepository.saveAndFlush(any())).thenReturn(organisation); - - OrganisationView result = organisationService.upsertOrganisation(organisationUpsert); - assertNotNull(result); - assertEquals("6d50ed2208aba5047f54a0b4e603d77463db27f108de9a268bb1670fa9afef11",result.getId()); - assertEquals("Street",result.getAddress()); - assertEquals("City name",result.getCity()); - assertEquals("Country name",result.getCountry()); - assertEquals("County co.",result.getProvince()); - } -} diff --git a/organisation/build.gradle.kts b/organisation/build.gradle.kts index fea992f5..c23fc91a 100644 --- a/organisation/build.gradle.kts +++ b/organisation/build.gradle.kts @@ -1,7 +1,3 @@ -plugins { - id("org.sonarqube") -} - dependencies { implementation("org.springframework.modulith:spring-modulith-api") diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/entity/Organisation.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/entity/Organisation.java index 711cc255..7a46be87 100644 --- a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/entity/Organisation.java +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/entity/Organisation.java @@ -46,9 +46,6 @@ public class Organisation extends CommonEntity implements Persistable { @Column(name = "province", nullable = false) private String province; - @Column(name = "country", nullable = false) - private String country; - @Column(name = "address", nullable = false) private String address; diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpsert.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationCreate.java similarity index 92% rename from organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpsert.java rename to organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationCreate.java index b5ba60b5..fc3c4f17 100644 --- a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpsert.java +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationCreate.java @@ -11,7 +11,7 @@ @Setter @AllArgsConstructor @NoArgsConstructor -public class OrganisationUpsert { +public class OrganisationCreate { @Schema(example = "My company name") private String name; @@ -25,9 +25,6 @@ public class OrganisationUpsert { @Schema(example = "Co. Wexford") private String province; - @Schema(example = "Ireland") - private String country; - @Schema(example = "IE") private String countryCode; diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpdate.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpdate.java new file mode 100644 index 00000000..047c5ea8 --- /dev/null +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/request/OrganisationUpdate.java @@ -0,0 +1,46 @@ +package org.cardanofoundation.lob.app.organisation.domain.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class OrganisationUpdate { + + @Schema(example = "My company name") + private String name; + + @Schema(example = "Ballyhealy") + private String city; + + @Schema(example = "Y35 C6KC") + private String postCode; + + @Schema(example = "Co. Wexford") + private String province; + + @Schema(example = "Ballyhealy Cottage") + private String address; + + @Schema(example = "0035863286566") + private String phoneNumber; + + @Schema(example = "lob@cardanofoundation.org") + private String adminEmail; + + @Schema(example = "http://cardanofoundation.org") + private String websiteUrl; + + @Schema(example = "ISO_4217:CHF") + private String currencyId; + + @Schema(example = "ISO_4217:CHF") + private String reportCurrencyId; + +} diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/view/OrganisationView.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/view/OrganisationView.java index 7a463fe1..9d5b07b1 100644 --- a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/view/OrganisationView.java +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/view/OrganisationView.java @@ -28,9 +28,12 @@ public class OrganisationView { @Schema(example = "CHE-184477354") String taxIdNumber; - @Schema(example = "Currency Id") + @Schema(example = "CHE") String currencyId; + @Schema(example = "CHE") + String reportCurrencyId; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") @Schema(example = "2021-02-05") LocalDate accountPeriodFrom; @@ -57,15 +60,17 @@ public class OrganisationView { @Schema(example = "Co. Wexford") private String province; - @Schema(example = "Ireland") - private String country; + @Schema(example = "IE") + private String countryCode; - private Set costCenter; + private Set costCenters; private Set projects; private Set organisationCurrencies; + private String webSite; + @Schema(example = "data:image/jpeg;base64,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") private String logo; diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/resource/OrganisationResource.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/resource/OrganisationResource.java index 6e2fd290..edb11f9b 100644 --- a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/resource/OrganisationResource.java +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/resource/OrganisationResource.java @@ -26,7 +26,9 @@ import org.zalando.problem.Problem; import org.zalando.problem.Status; -import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpsert; +import org.cardanofoundation.lob.app.organisation.domain.entity.Organisation; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationCreate; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpdate; import org.cardanofoundation.lob.app.organisation.domain.view.*; import org.cardanofoundation.lob.app.organisation.service.OrganisationService; @@ -59,6 +61,7 @@ public ResponseEntity organisationList() { organisation.getTaxIdNumber(), organisation.getTaxIdNumber(), organisation.getCurrencyId(), + organisation.getReportCurrencyId(), monthsAgo, yesterday, organisation.getAdminEmail(), @@ -67,10 +70,11 @@ public ResponseEntity organisationList() { organisation.getCity(), organisation.getPostCode(), organisation.getProvince(), - organisation.getCountry(), + organisation.getCountryCode(), new LinkedHashSet<>(), new LinkedHashSet<>(), new LinkedHashSet<>(), + organisation.getWebSite(), organisation.getLogo() ); }).toList() @@ -201,6 +205,47 @@ public ResponseEntity> organisationEvent(@PathVariab } + @Operation(description = "Organistion create", responses = { + @ApiResponse(content = + {@Content(mediaType = "application/json", schema = @Schema(implementation = OrganisationView.class))} + ), + @ApiResponse(responseCode = "404", description = "Error: response status is 404", content = {@Content(mediaType = "application/json", schema = @Schema(example = "{\n" + + " \"title\": \"ORGANISATION_ALREADY_EXIST\",\n" + + " \"status\": 404,\n" + + " \"detail\": \"Unable to crate Organisation with IdNumber\"\n" + + "}"))}) + }) + @PostMapping(value = "/organisation", produces = "application/json") + @PreAuthorize("hasRole(@securityConfig.getManagerRole())") + public ResponseEntity organisationCreate(@Valid @RequestBody OrganisationCreate organisationCreate) { + + Optional organisationChe = organisationService.findById(Organisation.id(organisationCreate.getCountryCode(), organisationCreate.getTaxIdNumber())); + if (organisationChe.isPresent()) { + val issue = Problem.builder() + .withTitle("ORGANISATION_ALREADY_EXIST") + .withDetail(STR."Unable to crate Organisation with IdNumber: \{organisationCreate.getTaxIdNumber()} and CountryCode: \{organisationCreate.getCountryCode()}") + .withStatus(Status.NOT_FOUND) + .build(); + + return ResponseEntity.status(issue.getStatus().getStatusCode()).body(issue); + } + + Optional organisation = organisationService.createOrganisation(organisationCreate).map(organisationService::getOrganisationView); + if (organisation.isEmpty()) { + val issue = Problem.builder() + .withTitle("ORGANISATION_CREATE_ERROR") + .withDetail(STR."Unable to create Organisation by Id: \{organisationCreate.getName()}") + .withStatus(Status.NOT_FOUND) + .build(); + + return ResponseEntity.status(issue.getStatus().getStatusCode()).body(issue); + } + + return ResponseEntity.ok().body(organisation.get()); + + + } + @Operation(description = "Organistion update", responses = { @ApiResponse(content = {@Content(mediaType = "application/json", schema = @Schema(implementation = OrganisationView.class))} @@ -209,13 +254,41 @@ public ResponseEntity> organisationEvent(@PathVariab " \"title\": \"Organisation not found\",\n" + " \"status\": 404,\n" + " \"detail\": \"Unable to get the organisation\"\n" + + "}"))}), + @ApiResponse(responseCode = "404", description = "Error: response status is 404", content = {@Content(mediaType = "application/json", schema = @Schema(example = "{\n" + + " \"title\": \"ORGANISATION_UPDATE_ERROR\",\n" + + " \"status\": 404,\n" + + " \"detail\": \"Unable to create Organisation\"\n" + "}"))}) }) - @PutMapping(value = "/organisation", produces = "application/json") + @PutMapping(value = "/organisation/{orgId}", produces = "application/json") @PreAuthorize("hasRole(@securityConfig.getManagerRole())") - public ResponseEntity organisationUpsertOrganisation(@Valid @RequestBody OrganisationUpsert organisationUpsert) { + public ResponseEntity organisationUpdate(@PathVariable("orgId") @Parameter(example = "75f95560c1d883ee7628993da5adf725a5d97a13929fd4f477be0faf5020ca94") String orgId, @Valid @RequestBody OrganisationUpdate organisationUpdate) { + Optional organisationChe = organisationService.findById(orgId); + if (organisationChe.isEmpty()) { + val issue = Problem.builder() + .withTitle("ORGANISATION_NOT_FOUND") + .withDetail(STR."Unable to find Organisation by Id: \{orgId}") + .withStatus(Status.NOT_FOUND) + .build(); + + return ResponseEntity.status(issue.getStatus().getStatusCode()).body(issue); + } + + Optional organisation = organisationService.upsertOrganisation(organisationChe.get(), organisationUpdate).map(organisationService::getOrganisationView); + if (organisation.isEmpty()) { + val issue = Problem.builder() + .withTitle("ORGANISATION_UPDATE_ERROR") + .withDetail(STR."Unable to create Organisation by Id: \{organisationUpdate.getName()}") + .withStatus(Status.NOT_FOUND) + .build(); + + return ResponseEntity.status(issue.getStatus().getStatusCode()).body(issue); + } + + return ResponseEntity.ok().body(organisation.get()); + - return ResponseEntity.ok().body(organisationService.upsertOrganisation(organisationUpsert)); } } diff --git a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/service/OrganisationService.java b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/service/OrganisationService.java index 8fbc6a35..2cec1e5f 100644 --- a/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/service/OrganisationService.java +++ b/organisation/src/main/java/org/cardanofoundation/lob/app/organisation/service/OrganisationService.java @@ -13,7 +13,8 @@ import org.springframework.transaction.annotation.Transactional; import org.cardanofoundation.lob.app.organisation.domain.entity.*; -import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpsert; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationCreate; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpdate; import org.cardanofoundation.lob.app.organisation.domain.view.OrganisationCostCenterView; import org.cardanofoundation.lob.app.organisation.domain.view.OrganisationView; import org.cardanofoundation.lob.app.organisation.repository.*; @@ -29,11 +30,8 @@ public class OrganisationService { private final ProjectMappingRepository projectMappingRepository; private final OrganisationChartOfAccountTypeRepository organisationChartOfAccountTypeRepository; private final ChartOfAccountRepository organisationChartOfAccountRepository; - private final OrganisationChartOfAccountSubTypeRepository organisationChartOfAccountSubTypeRepository; private final AccountEventRepository accountEventRepository; private final OrganisationCurrencyService organisationCurrencyService; - private final OrganisationChartOfAccountSubTypeRepository chartOfAccountSubTypeRepository; - public Optional findById(String organisationId) { return organisationRepository.findById(organisationId); @@ -65,25 +63,39 @@ public Set getOrganisationEventCode(String orgId) { } @Transactional - public OrganisationView upsertOrganisation(OrganisationUpsert organisationUpsert) { - Optional organisationO = findById(Organisation.id(organisationUpsert.getCountryCode(), organisationUpsert.getTaxIdNumber())); - if (organisationO.isEmpty()) { - organisationO = Optional.of(new Organisation()); - organisationO.get().setId(Organisation.id(organisationUpsert.getCountryCode(), organisationUpsert.getTaxIdNumber())); - organisationO.get().setCountryCode(organisationUpsert.getCountryCode()); - organisationO.get().setTaxIdNumber(organisationUpsert.getTaxIdNumber()); - /** - * Those fields are needed but at the moment we don't want to set it from UI CRUD - */ - organisationO.get().setDummyAccount("0000000000"); - organisationO.get().setAccountPeriodDays(7305); - } - - - Organisation organisation = getOrganisation(organisationUpsert, organisationO); + public Optional createOrganisation(OrganisationCreate organisationCreate){ + + Organisation organisationO = new Organisation(); + organisationO.setId(Organisation.id(organisationCreate.getCountryCode(), organisationCreate.getTaxIdNumber())); + organisationO.setCountryCode(organisationCreate.getCountryCode()); + organisationO.setTaxIdNumber(organisationCreate.getTaxIdNumber()); + /** + * Those fields are needed but at the moment we don't want to set it from UI CRUD + */ + organisationO.setDummyAccount("0000000000"); + organisationO.setAccountPeriodDays(7305); + Organisation organisation = getOrganisation(organisationCreate, organisationO); organisationRepository.saveAndFlush(organisation); - return getOrganisationView(organisation); + return Optional.of(organisation); + } + + @Transactional + public Optional upsertOrganisation(Organisation organisationO, OrganisationUpdate organisationUpdate) { + + organisationO.setName(organisationUpdate.getName()); + organisationO.setCity(organisationUpdate.getCity()); + organisationO.setPostCode(organisationUpdate.getPostCode()); + organisationO.setProvince(organisationUpdate.getProvince()); + organisationO.setAddress(organisationUpdate.getAddress()); + organisationO.setPhoneNumber(organisationUpdate.getPhoneNumber()); + organisationO.setAdminEmail(organisationUpdate.getAdminEmail()); + organisationO.setWebSite(organisationUpdate.getWebsiteUrl()); + organisationO.setCurrencyId(organisationUpdate.getCurrencyId()); + organisationO.setReportCurrencyId(organisationUpdate.getReportCurrencyId()); + + Organisation organisation = organisationRepository.saveAndFlush(organisationO); + return Optional.of(organisation); } @@ -95,9 +107,10 @@ public OrganisationView getOrganisationView(Organisation organisation) { return new OrganisationView( organisation.getId(), organisation.getName(), - organisation.getTaxIdNumber(), + "", // Description is deprecated and should be removed organisation.getTaxIdNumber(), organisation.getCurrencyId(), + organisation.getReportCurrencyId(), monthsAgo, yesterday, organisation.getAdminEmail(), @@ -106,43 +119,44 @@ public OrganisationView getOrganisationView(Organisation organisation) { organisation.getCity(), organisation.getPostCode(), organisation.getProvince(), - organisation.getCountry(), - getAllCostCenter(organisation.getId()).stream().map(organisationCostCenter -> { - return new OrganisationCostCenterView( + organisation.getCountryCode(), + getAllCostCenter(organisation.getId()).stream().map(organisationCostCenter -> + new OrganisationCostCenterView( organisationCostCenter.getId() != null ? organisationCostCenter.getId().getCustomerCode() : null, organisationCostCenter.getExternalCustomerCode(), organisationCostCenter.getName() - ); - }).collect(Collectors.toSet()), - getAllProjects(organisation.getId()).stream().map(organisationProject -> { - return new OrganisationCostCenterView( + )).collect(Collectors.toSet()), + getAllProjects(organisation.getId()).stream().map(organisationProject -> + new OrganisationCostCenterView( organisationProject.getId() != null ? organisationProject.getId().getCustomerCode() : null, organisationProject.getExternalCustomerCode(), organisationProject.getName() - ); - }).collect(Collectors.toSet()), + )).collect(Collectors.toSet()), organisationCurrencyService.findAllByOrganisationId(organisation.getId()) .stream() - .map(organisationCurrency -> { - return organisationCurrency.getId() != null ? organisationCurrency.getId().getCustomerCode() : null; - }).collect(Collectors.toSet()), + .map(organisationCurrency -> + organisationCurrency.getId() != null ? organisationCurrency.getId().getCustomerCode() : null + ).collect(Collectors.toSet()), + organisation.getWebSite(), organisation.getLogo() ); } - private static Organisation getOrganisation(OrganisationUpsert organisationUpsert, Optional organisationO) { - Organisation organisation = organisationO.get(); - organisation.setName(organisationUpsert.getName()); - organisation.setCity(organisationUpsert.getCity()); - organisation.setPostCode(organisationUpsert.getPostCode()); - organisation.setProvince(organisationUpsert.getProvince()); - organisation.setCountry(organisationUpsert.getCountry()); - organisation.setAddress(organisationUpsert.getAddress()); - organisation.setCurrencyId(organisationUpsert.getCurrencyId()); - organisation.setReportCurrencyId(organisationUpsert.getReportCurrencyId()); - organisation.setPhoneNumber(organisationUpsert.getPhoneNumber()); - organisation.setAdminEmail(organisationUpsert.getAdminEmail()); - organisation.setWebSite(organisationUpsert.getWebsiteUrl()); + private static Organisation getOrganisation(OrganisationCreate organisationCreate, Organisation organisation) { + organisation.setName(organisationCreate.getName()); + organisation.setCity(organisationCreate.getCity()); + organisation.setPostCode(organisationCreate.getPostCode()); + organisation.setProvince(organisationCreate.getProvince()); + organisation.setAddress(organisationCreate.getAddress()); + organisation.setPhoneNumber(organisationCreate.getPhoneNumber()); + organisation.setAdminEmail(organisationCreate.getAdminEmail()); + organisation.setWebSite(organisationCreate.getWebsiteUrl()); + organisation.setCurrencyId(organisationCreate.getCurrencyId()); + organisation.setReportCurrencyId(organisationCreate.getReportCurrencyId()); + + + + return organisation; } diff --git a/organisation/src/main/resources/db/migration/postgresql/common/V1.0_100_3__lob_service_app_organisation_module.sql b/organisation/src/main/resources/db/migration/postgresql/common/V1.0_100_3__lob_service_app_organisation_module.sql index fadf565c..c16ce70f 100644 --- a/organisation/src/main/resources/db/migration/postgresql/common/V1.0_100_3__lob_service_app_organisation_module.sql +++ b/organisation/src/main/resources/db/migration/postgresql/common/V1.0_100_3__lob_service_app_organisation_module.sql @@ -12,7 +12,6 @@ CREATE TABLE IF NOT EXISTS organisation ( city VARCHAR(255) NOT NULL, post_code VARCHAR(255) NOT NULL, province VARCHAR(255) NOT NULL, - country VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, admin_email VARCHAR(255) NOT NULL, pre_approve_transactions BOOLEAN, @@ -41,7 +40,6 @@ CREATE TABLE IF NOT EXISTS organisation_aud ( city VARCHAR(255) NOT NULL, post_code VARCHAR(255) NOT NULL, province VARCHAR(255) NOT NULL, - country VARCHAR(255) NOT NULL, address VARCHAR(255) NOT NULL, admin_email VARCHAR(255) NOT NULL, pre_approve_transactions BOOLEAN, diff --git a/organisation/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java b/organisation/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java new file mode 100644 index 00000000..947ed111 --- /dev/null +++ b/organisation/src/test/java/org/cardanofoundation/lob/app/organisation/service/OrganisationServiceTest.java @@ -0,0 +1,210 @@ +package org.cardanofoundation.lob.app.organisation.service; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import org.cardanofoundation.lob.app.organisation.domain.entity.Organisation; +import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationCostCenter; +import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationCurrency; +import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationProject; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationCreate; +import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpdate; +import org.cardanofoundation.lob.app.organisation.domain.view.OrganisationView; +import org.cardanofoundation.lob.app.organisation.repository.*; + +@ExtendWith(MockitoExtension.class) +class OrganisationServiceTest { + + @Mock + private OrganisationRepository organisationRepository; + + @Mock + private CostCenterService costCenterService; + + @Mock + private ProjectMappingRepository projectMappingRepository; + + @Mock + private OrganisationChartOfAccountTypeRepository organisationChartOfAccountTypeRepository; + + @Mock + private ChartOfAccountRepository organisationChartOfAccountRepository; + + @Mock + private AccountEventRepository accountEventRepository; + + @Mock + private OrganisationCurrencyService organisationCurrencyService; + + @InjectMocks + private OrganisationService organisationService; + + private Organisation organisation; + + @BeforeEach + void setUp() { + organisation = new Organisation(); + organisation.setId("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + organisation.setCountryCode("IE"); + organisation.setTaxIdNumber("1"); + } + + @Test + void testFindById_WhenOrganisationExists() { + when(organisationRepository.findById("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0")).thenReturn(Optional.of(organisation)); + Optional result = organisationService.findById("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + assertTrue(result.isPresent()); + assertEquals("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0", result.get().getId()); + } + + @Test + void testFindById_WhenOrganisationDoesNotExist() { + when(organisationRepository.findById("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0")).thenReturn(Optional.empty()); + Optional result = organisationService.findById("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + assertFalse(result.isPresent()); + } + + @Test + void testFindAll() { + List organisations = List.of(organisation); + when(organisationRepository.findAll()).thenReturn(organisations); + List result = organisationService.findAll(); + assertEquals(1, result.size()); + } + + @Test + void testGetAllCostCenter() { + Set costCenters = new HashSet<>(); + when(costCenterService.getAllCostCenter("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0")).thenReturn(costCenters); + Set result = organisationService.getAllCostCenter("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + assertEquals(costCenters, result); + } + + @Test + void testGetAllProjects() { + Set projects = new HashSet<>(); + when(projectMappingRepository.findAllByOrganisationId("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0")).thenReturn(projects); + Set result = organisationService.getAllProjects("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + assertEquals(projects, result); + verify(projectMappingRepository).findAllByOrganisationId("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0"); + verifyNoMoreInteractions(projectMappingRepository); + } + + @Test + void testUpsertOrganisation_NewOrganisation() { + + OrganisationUpdate organisationUpdate = new OrganisationUpdate(); + organisationUpdate.setAddress("Street"); + organisationUpdate.setName("Company name"); + organisationUpdate.setAdminEmail("the@email.com"); + organisationUpdate.setCity("City name"); + organisationUpdate.setCurrencyId("ISO_4217:CHF"); + organisationUpdate.setPostCode("A127"); + organisationUpdate.setProvince("County co."); + organisationUpdate.setReportCurrencyId("ISO_4217:CHF"); + organisationUpdate.setPhoneNumber("0101010101"); + + when(organisationRepository.saveAndFlush(any())).thenReturn(organisation); + + Organisation result = organisationService.upsertOrganisation(organisation, organisationUpdate).get(); + assertNotNull(result); + assertEquals("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0",result.getId()); + assertEquals("Street",result.getAddress()); + assertEquals("City name",result.getCity()); + assertEquals("County co.",result.getProvince()); + verify(organisationRepository).saveAndFlush(any()); + verifyNoMoreInteractions(organisationRepository); + } + + @Test + void testCreateOrganisation_NewOrganisation() { + OrganisationCreate organisationCreate = new OrganisationCreate(); + organisationCreate.setAddress("Street"); + organisationCreate.setCountryCode("IE"); + organisationCreate.setTaxIdNumber("1"); + organisationCreate.setName("Company name"); + organisationCreate.setAdminEmail("the@email.com"); + organisationCreate.setCity("City name"); + organisationCreate.setCurrencyId("ISO_4217:CHF"); + organisationCreate.setPostCode("A127"); + organisationCreate.setProvince("County co."); + organisationCreate.setReportCurrencyId("ISO_4217:CHF"); + organisationCreate.setPhoneNumber("0101010101"); + + when(organisationRepository.saveAndFlush(any())).thenReturn(organisation); + + Optional optionalOrg = organisationService.createOrganisation(organisationCreate); + assertTrue(optionalOrg.isPresent()); + Organisation result = optionalOrg.get(); + assertEquals("f3b7485e96cc45b98e825a48a80d856be260b53de5fe45f23287da5b4970b9b0",result.getId()); + assertEquals("Street",result.getAddress()); + assertEquals("City name",result.getCity()); + assertEquals("County co.",result.getProvince()); + verify(organisationRepository).saveAndFlush(any()); + verifyNoMoreInteractions(organisationRepository); + } + + @Test + void testGetOrganisationView() { + Organisation org = new Organisation(); + org.setId("orgId"); + org.setName("orgName"); + org.setTaxIdNumber("taxId"); + org.setCurrencyId("currencyId"); + org.setAdminEmail("adminEmail"); + org.setPhoneNumber("phoneNumber"); + org.setAddress("address"); + org.setCity("city"); + org.setPostCode("postCode"); + org.setProvince("province"); + org.setCountryCode("countryCode"); + org.setWebSite("webSite"); + org.setLogo("logo"); + + when(costCenterService.getAllCostCenter(anyString())).thenReturn(Set.of(new OrganisationCostCenter())); + when(projectMappingRepository.findAllByOrganisationId(anyString())).thenReturn(Set.of(new OrganisationProject())); + when(organisationCurrencyService.findAllByOrganisationId(anyString())).thenReturn(Set.of(new OrganisationCurrency())); + + OrganisationView organisationView = organisationService.getOrganisationView(org); + + assertNotNull(organisationView); + assertEquals(org.getId(), organisationView.getId()); + assertEquals(org.getName(), organisationView.getName()); + assertEquals(org.getTaxIdNumber(), organisationView.getTaxIdNumber()); + assertEquals(org.getCurrencyId(), organisationView.getCurrencyId()); + assertEquals(org.getAdminEmail(), organisationView.getAdminEmail()); + assertEquals(org.getPhoneNumber(), organisationView.getPhoneNumber()); + assertEquals(org.getAddress(), organisationView.getAddress()); + assertEquals(org.getCity(), organisationView.getCity()); + assertEquals(org.getPostCode(), organisationView.getPostCode()); + assertEquals(org.getProvince(), organisationView.getProvince()); + assertEquals(org.getCountryCode(), organisationView.getCountryCode()); + assertEquals(org.getWebSite(), organisationView.getWebSite()); + assertEquals(org.getLogo(), organisationView.getLogo()); + assertEquals(1, organisationView.getCostCenters().size()); + assertEquals(1, organisationView.getProjects().size()); + assertEquals(1, organisationView.getOrganisationCurrencies().size()); + + verify(costCenterService).getAllCostCenter(anyString()); + verify(projectMappingRepository).findAllByOrganisationId(anyString()); + verify(organisationCurrencyService).findAllByOrganisationId(anyString()); + verifyNoMoreInteractions(costCenterService, projectMappingRepository, organisationCurrencyService); + } +}