Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SELC-3493] feat: Reject Endpoint for Enhanced Onboarding Process Approval #96

Merged
merged 4 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,12 @@ public Uni<OnboardingGetResponse> getOnboardingWithFilter(@QueryParam(value = "p
return onboardingService.onboardingGet(productId, taxCode, status, from, to, page, size);
}

@Operation(summary = "Perform reject operation of an onboarding request receiving onboarding id." +
"Function change status to REJECT for an onboarding request that is not COMPLETED. " )
@PUT
@Path("/{onboardingId}/delete")
@Path("/{onboardingId}/reject")
public Uni<Response> delete(@PathParam(value = "onboardingId") String onboardingId) {
return onboardingService.deleteOnboarding(onboardingId)
return onboardingService.rejectOnboarding(onboardingId)
.map(ignore -> Response
.status(HttpStatus.SC_NO_CONTENT)
.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public interface OnboardingService {

Uni<OnboardingGetResponse> onboardingGet(String productId, String taxCode, String status, String from, String to, Integer page, Integer size);

Uni<Long> deleteOnboarding(String onboardingId);
Uni<Long> rejectOnboarding(String onboardingId);

Uni<OnboardingGet> onboardingPending(String onboardingId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -557,10 +557,14 @@ private List<OnboardingGet> convertOnboardingListToResponse(List<Onboarding> ite
}

@Override
public Uni<Long> deleteOnboarding(String onboardingId) {
public Uni<Long> rejectOnboarding(String onboardingId) {
return checkOnboardingIdFormat(onboardingId)
.onItem()
.transformToUni(id -> updateStatus(onboardingId, OnboardingStatus.DELETED));
.onItem().transformToUni(ignore -> Onboarding.findById(new ObjectId(onboardingId))
.onItem().transform(onboarding -> (Onboarding) onboarding))
.onItem().transformToUni(onboardingGet -> OnboardingStatus.COMPLETED.equals(onboardingGet.getStatus())
? Uni.createFrom().failure(new InvalidRequestException(String.format("Onboarding with id %s is COMPLETED!", onboardingId)))
: Uni.createFrom().item(onboardingGet))
.onItem().transformToUni(id -> updateStatus(onboardingId, OnboardingStatus.REJECTED));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,19 +232,19 @@ void complete() throws IOException {
void deleteOK(){
String onboardingId = "actual-onboarding-id";

when(onboardingService.deleteOnboarding(onboardingId))
when(onboardingService.rejectOnboarding(onboardingId))
.thenReturn(Uni.createFrom().item(1L));

given()
.when()
.pathParam("onboardingId", onboardingId)
.put("/{onboardingId}/delete")
.put("/{onboardingId}/reject")
.then()
.statusCode(204);

ArgumentCaptor<String> expectedId = ArgumentCaptor.forClass(String.class);
verify(onboardingService, times(1))
.deleteOnboarding(expectedId.capture());
.rejectOnboarding(expectedId.capture());
assertEquals(expectedId.getValue(), onboardingId);
}

Expand All @@ -253,19 +253,19 @@ void deleteOK(){
void deleteInvalidOnboardingIdOrOnboardingNotFound(){
String onboardingId = "actual-onboarding-id";

when(onboardingService.deleteOnboarding(onboardingId))
when(onboardingService.rejectOnboarding(onboardingId))
.thenThrow(InvalidRequestException.class);

given()
.when()
.pathParam("onboardingId", onboardingId)
.put("/{onboardingId}/delete")
.put("/{onboardingId}/reject")
.then()
.statusCode(400);

ArgumentCaptor<String> expectedId = ArgumentCaptor.forClass(String.class);
verify(onboardingService, times(1))
.deleteOnboarding(expectedId.capture());
.rejectOnboarding(expectedId.capture());
assertEquals(expectedId.getValue(), onboardingId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1003,10 +1003,15 @@ private Onboarding createDummyOnboarding() {

@Test
void testOnboardingUpdateStatusOK() {
String onboardingId = "655df045dc52ea5f37c80955";
mockUpdateOnboarding(onboardingId, 1L);

Onboarding onboarding = createDummyOnboarding();
PanacheMock.mock(Onboarding.class);
when(Onboarding.findById(onboarding.getId()))
.thenReturn(Uni.createFrom().item(onboarding));

mockUpdateOnboarding(onboarding.getId().toHexString(), 1L);
UniAssertSubscriber<Long> subscriber = onboardingService
.deleteOnboarding(onboardingId)
.rejectOnboarding(onboarding.getId().toHexString())
.subscribe()
.withSubscriber(UniAssertSubscriber.create());

Expand All @@ -1017,29 +1022,51 @@ void testOnboardingUpdateStatusOK() {
void testOnboardingUpdateStatusInvalidOnboardingId() {
String onboardingId = "123456";
UniAssertSubscriber<Long> subscriber = onboardingService
.deleteOnboarding(onboardingId)
.rejectOnboarding(onboardingId)
.subscribe()
.withSubscriber(UniAssertSubscriber.create());

subscriber.assertFailedWith(InvalidRequestException.class, "Given onboardingId [123456] has wrong format");
}

@Test
void rejectOnboarding_statusIsCOMPLETED() {
Onboarding onboarding = createDummyOnboarding();
onboarding.setStatus(OnboardingStatus.COMPLETED);
PanacheMock.mock(Onboarding.class);
when(Onboarding.findById(onboarding.getId()))
.thenReturn(Uni.createFrom().item(onboarding));

mockUpdateOnboarding(onboarding.getId().toHexString(), 1L);
UniAssertSubscriber<Long> subscriber = onboardingService
.rejectOnboarding(onboarding.getId().toHexString())
.subscribe()
.withSubscriber(UniAssertSubscriber.create());

subscriber.assertFailedWith(InvalidRequestException.class);
}

@Test
void testOnboardingDeleteOnboardingNotFoundOrAlreadyDeleted() {
String onboardingId = "655df045dc52ea5f37c80955";
mockUpdateOnboarding(onboardingId, 0L);

Onboarding onboarding = createDummyOnboarding();
PanacheMock.mock(Onboarding.class);
when(Onboarding.findById(onboarding.getId()))
.thenReturn(Uni.createFrom().item(onboarding));
mockUpdateOnboarding(onboarding.getId().toHexString(), 0L);

UniAssertSubscriber<Long> subscriber = onboardingService
.deleteOnboarding(onboardingId)
.rejectOnboarding(onboarding.getId().toHexString())
.subscribe()
.withSubscriber(UniAssertSubscriber.create());

subscriber.assertFailedWith(InvalidRequestException.class, "Onboarding with id 655df045dc52ea5f37c80955 not found or already deleted");
subscriber.assertFailedWith(InvalidRequestException.class);
}

private void mockUpdateOnboarding(String onboardingId, Long updatedItemCount) {
ReactivePanacheUpdate query = mock(ReactivePanacheUpdate.class);
PanacheMock.mock(Onboarding.class);
when(Onboarding.update(Onboarding.Fields.status.name(), OnboardingStatus.DELETED)).thenReturn(query);
when(Onboarding.update(Onboarding.Fields.status.name(), OnboardingStatus.REJECTED)).thenReturn(query);
when(query.where("_id", onboardingId)).thenReturn(Uni.createFrom().item(updatedItemCount));
}

Expand Down