Skip to content

Commit 342a750

Browse files
authored
Merge pull request #165 from cardano-foundation/feat/organisation_crud
feat: organisation create and edit endpoint
2 parents 20cadfc + b04ccfc commit 342a750

File tree

9 files changed

+375
-51
lines changed

9 files changed

+375
-51
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package org.cardanofoundation.lob.app.organisation.service;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import static org.mockito.ArgumentMatchers.any;
5+
import static org.mockito.Mockito.when;
6+
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Optional;
10+
import java.util.Set;
11+
12+
import org.mockito.InjectMocks;
13+
import org.mockito.Mock;
14+
import org.mockito.junit.jupiter.MockitoExtension;
15+
16+
import org.junit.jupiter.api.BeforeEach;
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.jupiter.api.extension.ExtendWith;
19+
20+
import org.cardanofoundation.lob.app.organisation.domain.entity.Organisation;
21+
import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationCostCenter;
22+
import org.cardanofoundation.lob.app.organisation.domain.entity.OrganisationProject;
23+
import org.cardanofoundation.lob.app.organisation.domain.request.OrganisationUpsert;
24+
import org.cardanofoundation.lob.app.organisation.domain.view.OrganisationView;
25+
import org.cardanofoundation.lob.app.organisation.repository.*;
26+
27+
@ExtendWith(MockitoExtension.class)
28+
class OrganisationServiceTest {
29+
30+
@Mock
31+
private OrganisationRepository organisationRepository;
32+
33+
@Mock
34+
private CostCenterService costCenterService;
35+
36+
@Mock
37+
private ProjectMappingRepository projectMappingRepository;
38+
39+
@Mock
40+
private OrganisationChartOfAccountTypeRepository organisationChartOfAccountTypeRepository;
41+
42+
@Mock
43+
private ChartOfAccountRepository organisationChartOfAccountRepository;
44+
45+
@Mock
46+
private OrganisationChartOfAccountSubTypeRepository organisationChartOfAccountSubTypeRepository;
47+
48+
@Mock
49+
private AccountEventRepository accountEventRepository;
50+
51+
@Mock
52+
private OrganisationCurrencyService organisationCurrencyService;
53+
54+
@InjectMocks
55+
private OrganisationService organisationService;
56+
57+
private Organisation organisation;
58+
59+
@BeforeEach
60+
void setUp() {
61+
organisation = new Organisation();
62+
organisation.setId("org-123");
63+
}
64+
65+
@Test
66+
void testFindById_WhenOrganisationExists() {
67+
when(organisationRepository.findById("org-123")).thenReturn(Optional.of(organisation));
68+
Optional<Organisation> result = organisationService.findById("org-123");
69+
assertTrue(result.isPresent());
70+
assertEquals("org-123", result.get().getId());
71+
}
72+
73+
@Test
74+
void testFindById_WhenOrganisationDoesNotExist() {
75+
when(organisationRepository.findById("org-123")).thenReturn(Optional.empty());
76+
Optional<Organisation> result = organisationService.findById("org-123");
77+
assertFalse(result.isPresent());
78+
}
79+
80+
@Test
81+
void testFindAll() {
82+
List<Organisation> organisations = List.of(organisation);
83+
when(organisationRepository.findAll()).thenReturn(organisations);
84+
List<Organisation> result = organisationService.findAll();
85+
assertEquals(1, result.size());
86+
}
87+
88+
@Test
89+
void testGetAllCostCenter() {
90+
Set<OrganisationCostCenter> costCenters = new HashSet<>();
91+
when(costCenterService.getAllCostCenter("org-123")).thenReturn(costCenters);
92+
Set<OrganisationCostCenter> result = organisationService.getAllCostCenter("org-123");
93+
assertEquals(costCenters, result);
94+
}
95+
96+
@Test
97+
void testGetAllProjects() {
98+
Set<OrganisationProject> projects = new HashSet<>();
99+
when(projectMappingRepository.findAllByOrganisationId("org-123")).thenReturn(projects);
100+
Set<OrganisationProject> result = organisationService.getAllProjects("org-123");
101+
assertEquals(projects, result);
102+
}
103+
104+
@Test
105+
void testUpsertOrganisation_NewOrganisation() {
106+
OrganisationUpsert organisationUpsert = new OrganisationUpsert();
107+
organisationUpsert.setCountryCode("US");
108+
organisationUpsert.setTaxIdNumber("12345");
109+
organisationUpsert.setAddress("Street");
110+
organisationUpsert.setName("Company name");
111+
organisationUpsert.setAdminEmail("[email protected]");
112+
organisationUpsert.setCity("City name");
113+
organisationUpsert.setCountry("Country name");
114+
organisationUpsert.setCurrencyId("ISO_4217:CHF");
115+
organisationUpsert.setPostCode("A127");
116+
organisationUpsert.setProvince("County co.");
117+
organisationUpsert.setReportCurrencyId("ISO_4217:CHF");
118+
organisationUpsert.setPhoneNumber("0101010101");
119+
120+
when(organisationRepository.findById(any())).thenReturn(Optional.empty());
121+
when(organisationRepository.saveAndFlush(any())).thenReturn(organisation);
122+
123+
OrganisationView result = organisationService.upsertOrganisation(organisationUpsert);
124+
assertNotNull(result);
125+
assertEquals("6d50ed2208aba5047f54a0b4e603d77463db27f108de9a268bb1670fa9afef11",result.getId());
126+
assertEquals("Street",result.getAddress());
127+
assertEquals("City name",result.getCity());
128+
assertEquals("Country name",result.getCountry());
129+
assertEquals("County co.",result.getProvince());
130+
}
131+
}

build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ subprojects {
201201
}
202202

203203
property("sonar.exclusions", "" +
204-
"organisation/**, " +
205204
"**/views/**, " +
206205
"**/requests/**, " +
207206
"**/entity/**, " +

organisation/build.gradle.kts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@ plugins {
22
id("org.sonarqube")
33
}
44

5-
// Skipping the project from SonarQube analysis, since it doesn't have tests
6-
sonarqube {
7-
isSkipProject = false
8-
}
9-
105
dependencies {
116

127
implementation("org.springframework.modulith:spring-modulith-api")
8+
implementation("org.springframework.boot:spring-boot-starter-security")
139

1410
implementation(project(":support"))
1511
}

organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/entity/Organisation.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ public class Organisation extends CommonEntity implements Persistable<String> {
3737
@Column(name = "name", nullable = false)
3838
private String name;
3939

40+
@Column(name = "city", nullable = false)
41+
private String city;
42+
43+
@Column(name = "post_code", nullable = false)
44+
private String postCode;
45+
46+
@Column(name = "province", nullable = false)
47+
private String province;
48+
49+
@Column(name = "country", nullable = false)
50+
private String country;
51+
52+
@Column(name = "address", nullable = false)
53+
private String address;
54+
55+
@Column(name = "phone_number")
56+
private String phoneNumber;
57+
4058
@Column(name = "tax_id_number", nullable = false)
4159
private String taxIdNumber;
4260

@@ -58,6 +76,12 @@ public class Organisation extends CommonEntity implements Persistable<String> {
5876
@Column(name = "currency_id", nullable = false)
5977
private String currencyId;
6078

79+
@Column(name = "report_currency_id", nullable = false)
80+
private String reportCurrencyId;
81+
82+
@Column(name = "website")
83+
private String webSite;
84+
6185
@Column(name = "admin_email", nullable = false)
6286
private String adminEmail;
6387

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.cardanofoundation.lob.app.organisation.domain.request;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
import io.swagger.v3.oas.annotations.media.Schema;
9+
10+
@Getter
11+
@Setter
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
public class OrganisationUpsert {
15+
16+
@Schema(example = "My company name")
17+
private String name;
18+
19+
@Schema(example = "Ballyhealy")
20+
private String city;
21+
22+
@Schema(example = "Y35 C6KC")
23+
private String postCode;
24+
25+
@Schema(example = "Co. Wexford")
26+
private String province;
27+
28+
@Schema(example = "Ireland")
29+
private String country;
30+
31+
@Schema(example = "IE")
32+
private String countryCode;
33+
34+
@Schema(example = "Ballyhealy Cottage")
35+
private String address;
36+
37+
@Schema(example = "0035863286566")
38+
private String phoneNumber;
39+
40+
@Schema(example = "[email protected]")
41+
private String adminEmail;
42+
43+
@Schema(example = "http://cardanofoundation.org")
44+
private String websiteUrl;
45+
46+
@Schema(example = "ISO_4217:CHF")
47+
private String currencyId;
48+
49+
@Schema(example = "ISO_4217:CHF")
50+
private String reportCurrencyId;
51+
52+
@Schema(example = "CHE-184477354")
53+
private String taxIdNumber;
54+
55+
}

organisation/src/main/java/org/cardanofoundation/lob/app/organisation/domain/view/OrganisationView.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,24 @@ public class OrganisationView {
4242
@Schema(example = "[email protected]")
4343
private String adminEmail;
4444

45+
@Schema(example = "0035863286566")
46+
private String phoneNumber;
47+
48+
@Schema(example = "Street name and number")
49+
private String address;
50+
51+
@Schema(example = "Ballyhealy")
52+
private String city;
53+
54+
@Schema(example = "Y35 C6KC")
55+
private String postCode;
56+
57+
@Schema(example = "Co. Wexford")
58+
private String province;
59+
60+
@Schema(example = "Ireland")
61+
private String country;
62+
4563
private Set<OrganisationCostCenterView> costCenter;
4664

4765
private Set<OrganisationCostCenterView> projects;

0 commit comments

Comments
 (0)