Skip to content

Commit a0a4d2f

Browse files
valituguranzxBCN Valeriu_Tuguran,Constantin (IT EDP) EXTERNAL
andauthored
Add mocks for create/get component (#13)
Add marketplace 2.0 external service, mocks for create/get component and fix REST paths. --------- Co-authored-by: zxBCN Valeriu_Tuguran,Constantin (IT EDP) EXTERNAL <constantin.valeriu_tuguran.ext@boehringer-ingelheim.com>
1 parent c273bbe commit a0a4d2f

File tree

16 files changed

+380
-43
lines changed

16 files changed

+380
-43
lines changed

api-project-component-v0/openapi/api-project-component-v0.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ servers:
1212
default: localhost:8080
1313
description: Development environment
1414
tags:
15-
- name: ProjectComponents
15+
- name: Project Components
1616
description: API for managing project components
1717

1818
paths:
1919
/projects/{projectId}/components/:
2020
post:
2121
tags:
22-
- projectComponents
22+
- Project Components
2323
summary: Create a component in a project
2424
operationId: createProjectComponent
2525
description: Retrieves information about a specific component
@@ -61,7 +61,7 @@ paths:
6161
/projects/{projectId}/components/{componentId}:
6262
get:
6363
tags:
64-
- projectComponents
64+
- Project Components
6565
summary: Get component information
6666
operationId: getProjectComponent
6767
description: Retrieves information about a specific component

api-project-component-v0/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444
<version>${project.version}</version>
4545
</dependency>
4646

47+
<dependency>
48+
<groupId>org.opendevstack.apiservice</groupId>
49+
<artifactId>external-service-marketplace</artifactId>
50+
<version>${project.version}</version>
51+
</dependency>
52+
4753
<dependency>
4854
<groupId>io.jsonwebtoken</groupId>
4955
<artifactId>jjwt-api</artifactId>
@@ -89,6 +95,7 @@
8995
<artifactId>spring-boot-starter-test</artifactId>
9096
<scope>test</scope>
9197
</dependency>
98+
9299
<dependency>
93100
<groupId>org.springframework.security</groupId>
94101
<artifactId>spring-security-core</artifactId>

api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ComponentsResponseFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public static CreateComponentResponse error(String projectId) {
1515
return response;
1616
}
1717

18-
public static CreateComponentResponse entityCreated(String projectId, String componentName) {
18+
public static CreateComponentResponse entityCreated(String projectId, String componentId) {
1919
CreateComponentResponse response = new CreateComponentResponse();
2020
response.setErrorCode(HttpStatus.CREATED.value());
21-
response.setMessage(componentName + " component created successfully in project " + projectId);
21+
response.setMessage(componentId + " component created successfully in project " + projectId);
2222
return response;
2323
}
2424
}

api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ProjectComponentsController.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
import lombok.AllArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.opendevstack.apiservice.project.api.ProjectComponentsApi;
6+
import org.opendevstack.apiservice.project.facade.ComponentsFacade;
67
import org.opendevstack.apiservice.project.mapper.ComponentResponseMapper;
78
import org.opendevstack.apiservice.project.model.Component;
89
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
910
import org.opendevstack.apiservice.project.model.CreateComponentResponse;
10-
import org.opendevstack.apiservice.project.facade.ComponentsFacade;
1111
import org.springframework.http.HttpStatus;
1212
import org.springframework.http.ResponseEntity;
13+
import org.springframework.web.bind.annotation.RequestMapping;
1314
import org.springframework.web.bind.annotation.RestController;
1415

1516
@RestController
1617
@AllArgsConstructor
1718
@Slf4j
19+
@RequestMapping("/api/pub/v0")
1820
public class ProjectComponentsController implements ProjectComponentsApi {
1921

2022
private final ComponentsFacade componentsFacade;
@@ -25,11 +27,12 @@ public class ProjectComponentsController implements ProjectComponentsApi {
2527
public ResponseEntity<CreateComponentResponse> createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
2628
try {
2729
Component component = componentsFacade.createProjectComponent(projectId, createComponentRequest);
30+
log.info("Created component {} for project id {} and request {}", component, projectId, createComponentRequest);
2831
if (component == null) {
2932
log.error("Failed to create component for project '{}'", projectId);
3033
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.error(projectId));
3134
}
32-
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.entityCreated(projectId, component.getName()));
35+
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.entityCreated(projectId, component.getId()));
3336
} catch (Exception e) {
3437
log.error("Error while trying to create component for project '" + projectId + "': " + e.getMessage(), e);
3538
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.error(projectId));
@@ -40,6 +43,7 @@ public ResponseEntity<CreateComponentResponse> createProjectComponent(String pro
4043
public ResponseEntity<Component> getProjectComponent(String projectId, String componentId) {
4144
try {
4245
Component component = componentsFacade.getProjectComponent(projectId, componentId);
46+
log.info("Retrieved component '{}' for project '{}': {}", componentId, projectId, component);
4347
if (component == null) {
4448
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
4549
}

api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/facade/ComponentsFacade.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,41 @@
22

33
import lombok.AllArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
5-
import org.opendevstack.apiservice.externalservice.api.ExternalService;
5+
import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
6+
import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
7+
import org.opendevstack.apiservice.externalservice.marketplace.service.MarketplaceService;
8+
import org.opendevstack.apiservice.project.mapper.MarketplaceMapper;
69
import org.opendevstack.apiservice.project.model.Component;
710
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
811
import org.springframework.stereotype.Service;
912

13+
import java.util.List;
14+
1015
@Service
1116
@AllArgsConstructor
1217
@Slf4j
1318
public class ComponentsFacade {
1419

15-
private final MarketplaceExternalServicePlaceholder marketplaceExternalService;
16-
17-
public Component getProjectComponent(String projectId, String componentId) {
18-
return marketplaceExternalService.getProjectComponent(projectId, componentId);
19-
}
20-
21-
public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
22-
return marketplaceExternalService.createProjectComponent(projectId, createComponentRequest);
23-
}
24-
25-
@Service
26-
class MarketplaceExternalServicePlaceholder implements ExternalService {
20+
private final MarketplaceService marketplaceExternalService;
2721

28-
@Override
29-
public boolean isHealthy() {
30-
return false;
31-
}
22+
private final MarketplaceMapper marketplaceMapper;
3223

33-
public Component getProjectComponent(String projectId, String componentId) {
34-
log.info("Get component with id '" + componentId + "' for project '" + projectId + "'");
24+
public Component getProjectComponent(String projectId, String componentId) {
25+
ProjectComponent marketplaceComponent = marketplaceExternalService.getProjectComponent(projectId, componentId);
26+
if (marketplaceComponent == null) {
27+
log.info("Marketplace component with id {} not found", componentId);
3528
return null;
3629
}
30+
return marketplaceMapper.mapMarketplaceComponentToV0Component(marketplaceComponent);
31+
}
3732

38-
public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
39-
log.info("Creating component for project '" + projectId + "'" + " with request: " + createComponentRequest);
33+
public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
34+
List<CreateComponentParameter> createComponentParameterList = marketplaceMapper.mapCreateComponentRequestToCreateComponentParameterList(createComponentRequest);
35+
ProjectComponent marketplaceComponent = marketplaceExternalService.createProjectComponent(projectId, createComponentParameterList);
36+
if (marketplaceComponent == null) {
37+
log.error("Failed to create component in marketplace for project with id {}", projectId);
4038
return null;
4139
}
40+
return marketplaceMapper.mapMarketplaceComponentToV0Component(marketplaceComponent);
4241
}
4342
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.opendevstack.apiservice.project.mapper;
2+
3+
4+
import org.mapstruct.Mapper;
5+
import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
6+
import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
7+
import org.opendevstack.apiservice.project.model.Component;
8+
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
9+
10+
import java.util.List;
11+
12+
@Mapper(componentModel = "spring")
13+
public interface MarketplaceMapper {
14+
15+
default Component mapMarketplaceComponentToV0Component(ProjectComponent source) {
16+
if (source == null) {
17+
return null;
18+
}
19+
Component target = new Component();
20+
target.setId(source.getComponentId());
21+
target.setStatus(source.getStatus());
22+
return target;
23+
}
24+
25+
default List<CreateComponentParameter> mapCreateComponentRequestToCreateComponentParameterList(CreateComponentRequest createComponentRequest) {
26+
return createComponentRequest.getParams().entrySet().stream()
27+
.map(entry -> new CreateComponentParameter(entry.getKey(), "string", entry.getValue()))
28+
.toList();
29+
}
30+
}

api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/controller/ProjectComponentsControllerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void testCreateProjectComponent_whenSuccess_thenReturnOk() throws Exception {
4040
Component testComponent = buildTestComponent();
4141
String testProjectId = "testProjectId";
4242
CreateComponentRequest testCreateComponentRequest = buildTestCreateComponentRequest();
43-
CreateComponentResponse testServiceResponseSuccess = buildTestCreateComponentResponseSuccess(testComponent.getName(),
43+
CreateComponentResponse testServiceResponseSuccess = buildTestCreateComponentResponseSuccess(testComponent.getId(),
4444
testProjectId);
4545

4646
when(componentsFacade.createProjectComponent(anyString(), any(CreateComponentRequest.class)))

api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsServiceTest.java renamed to api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsFacadeTest.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,55 @@
33
import org.junit.jupiter.api.BeforeEach;
44
import org.junit.jupiter.api.Test;
55
import org.junit.jupiter.api.extension.ExtendWith;
6+
import org.mapstruct.factory.Mappers;
67
import org.mockito.Mock;
78
import org.mockito.junit.jupiter.MockitoExtension;
9+
import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
10+
import org.opendevstack.apiservice.externalservice.marketplace.service.MarketplaceService;
11+
import org.opendevstack.apiservice.project.mapper.MarketplaceMapper;
812
import org.opendevstack.apiservice.project.model.Component;
913
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
1014

15+
import java.util.List;
16+
1117
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.mockito.ArgumentMatchers.any;
1219
import static org.mockito.ArgumentMatchers.anyString;
1320
import static org.mockito.ArgumentMatchers.eq;
1421
import static org.mockito.Mockito.when;
15-
import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestComponent;
1622
import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestCreateComponentRequest;
23+
import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestMarketplaceComponent;
1724

1825
@ExtendWith(MockitoExtension.class)
19-
class ComponentsServiceTest {
26+
class ComponentsFacadeTest {
27+
28+
private final MarketplaceMapper marketplaceMapper = Mappers.getMapper(MarketplaceMapper.class);
2029

2130
@Mock
22-
private ComponentsFacade.MarketplaceExternalServicePlaceholder marketPlaceExternalServicePlaceholder;
31+
private MarketplaceService marketplaceExternalService;
2332

2433
private ComponentsFacade componentsFacade;
2534

2635
@BeforeEach
2736
void setup() {
28-
componentsFacade = new ComponentsFacade(marketPlaceExternalServicePlaceholder);
37+
componentsFacade = new ComponentsFacade(marketplaceExternalService, marketplaceMapper);
2938
}
3039

3140
@Test
3241
void testGetProjectComponent_whenSuccess_thenReturnCorrectComponent() throws Exception {
33-
Component testComponent = buildTestComponent();
42+
ProjectComponent testComponent = buildTestMarketplaceComponent();
3443

35-
when(marketPlaceExternalServicePlaceholder.getProjectComponent(anyString(), eq("testId")))
44+
when(marketplaceExternalService.getProjectComponent(anyString(), eq("testId")))
3645
.thenReturn(testComponent);
3746

3847
Component retrievedComponent = componentsFacade.getProjectComponent("testId", "testId");
39-
assertThat(retrievedComponent).isEqualTo(testComponent);
48+
assertThat(retrievedComponent.getId()).isEqualTo(testComponent.getComponentId());
49+
assertThat(retrievedComponent.getStatus()).isEqualTo(testComponent.getStatus());
4050
}
4151

4252
@Test
4353
void testGetProjectComponent_whenNoComponentFound_thenReturnNull() throws Exception {
44-
when(marketPlaceExternalServicePlaceholder.getProjectComponent(anyString(), eq("testId")))
54+
when(marketplaceExternalService.getProjectComponent(anyString(), eq("testId")))
4555
.thenReturn(null);
4656

4757
Component retrievedComponent = componentsFacade.getProjectComponent("testId", "testId");
@@ -50,22 +60,23 @@ void testGetProjectComponent_whenNoComponentFound_thenReturnNull() throws Except
5060

5161
@Test
5262
void testCreateProjectComponent_whenSuccess_thenReturnCorrectComponent() throws Exception {
53-
Component testComponent = buildTestComponent();
63+
ProjectComponent testComponent = buildTestMarketplaceComponent();
5464
CreateComponentRequest testRequest = buildTestCreateComponentRequest();
5565

56-
when(marketPlaceExternalServicePlaceholder.createProjectComponent(anyString(), eq(testRequest)))
66+
when(marketplaceExternalService.createProjectComponent(anyString(), any(List.class)))
5767
.thenReturn(testComponent);
5868

5969
Component retrievedComponent = componentsFacade.createProjectComponent("testId", testRequest);
60-
assertThat(retrievedComponent).isEqualTo(testComponent);
70+
assertThat(retrievedComponent.getId()).isEqualTo(testComponent.getComponentId());
71+
assertThat(retrievedComponent.getStatus()).isEqualTo(testComponent.getStatus());
6172
}
6273

6374

6475
@Test
6576
void testCreateProjectComponent_whenFailure_thenReturnNull() throws Exception {
6677
CreateComponentRequest testRequest = buildTestCreateComponentRequest();
6778

68-
when(marketPlaceExternalServicePlaceholder.createProjectComponent(anyString(), eq(testRequest)))
79+
when(marketplaceExternalService.createProjectComponent(anyString(), any(List.class)))
6980
.thenReturn(null);
7081

7182
Component retrievedComponent = componentsFacade.createProjectComponent("testId", testRequest);

api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/util/TestObjectsBuilder.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package org.opendevstack.apiservice.project.util;
22

3+
import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
4+
import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
35
import org.opendevstack.apiservice.project.model.Component;
46
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
57
import org.opendevstack.apiservice.project.model.CreateComponentResponse;
68
import org.springframework.http.HttpStatus;
79

10+
import java.util.ArrayList;
11+
import java.util.List;
12+
813
public class TestObjectsBuilder {
914

1015
private TestObjectsBuilder() {
@@ -19,17 +24,32 @@ public static Component buildTestComponent() {
1924
return component;
2025
}
2126

27+
public static ProjectComponent buildTestMarketplaceComponent() {
28+
ProjectComponent component = new ProjectComponent();
29+
component.setComponentId("testComponentId");
30+
component.setCanBeDeleted(false);
31+
component.setComponentUrl("http://test.component.url");
32+
return component;
33+
}
34+
2235
public static CreateComponentRequest buildTestCreateComponentRequest() {
2336
CreateComponentRequest request = new CreateComponentRequest();
2437
request.setName("testComponentName");
2538
request.setProductId("testProductId");
2639
return request;
2740
}
2841

29-
public static CreateComponentResponse buildTestCreateComponentResponseSuccess(String componentName, String projectId) {
42+
public static List<CreateComponentParameter> buildTestMarketplaceCreateComponentParameters() {
43+
List<CreateComponentParameter> parameters = new ArrayList<>();
44+
parameters.add(new CreateComponentParameter("name", "string", "testComponentName"));
45+
parameters.add(new CreateComponentParameter("productId", "string", "testProductId"));
46+
return parameters;
47+
}
48+
49+
public static CreateComponentResponse buildTestCreateComponentResponseSuccess(String componentId, String projectId) {
3050
CreateComponentResponse response = new CreateComponentResponse();
3151
response.setErrorCode(HttpStatus.CREATED.value());
32-
response.setMessage(componentName + " component created successfully in project " + projectId);
52+
response.setMessage(componentId + " component created successfully in project " + projectId);
3353
return response;
3454
}
3555

core/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@
109109
<version>${project.version}</version>
110110
</dependency>
111111

112+
<dependency>
113+
<groupId>org.opendevstack.apiservice</groupId>
114+
<artifactId>external-service-marketplace</artifactId>
115+
<version>${project.version}</version>
116+
</dependency>
117+
112118
<dependency>
113119
<groupId>org.opendevstack.apiservice</groupId>
114120
<artifactId>api-project-users</artifactId>
@@ -121,6 +127,12 @@
121127
<version>${project.version}</version>
122128
</dependency>
123129

130+
<dependency>
131+
<groupId>org.opendevstack.apiservice</groupId>
132+
<artifactId>api-project-component-v0</artifactId>
133+
<version>${project.version}</version>
134+
</dependency>
135+
124136
<dependency>
125137
<groupId>org.opendevstack.apiservice</groupId>
126138
<artifactId>api-project-platform</artifactId>

0 commit comments

Comments
 (0)