From 0fc8f9d2387db3338b47894fefcd84ea4f0e4dd9 Mon Sep 17 00:00:00 2001 From: Clovis Gakam Date: Mon, 13 Sep 2021 08:49:00 +0200 Subject: [PATCH] OBG-51: Fix admin delete api (#1295) * OBG-51: Fix admin delete api * OBG-51: add e2e tests for delete bank admin api * OPEN-51. Added PIS delete bank test * OPEN-51. Slight reformatting * OPEN-51. Slight reformatting * OPEN-51. Fix db cleanup Co-authored-by: valb3r --- .../adminapi/service/AdminApiService.java | 20 ++++- .../entity/sessions/ServiceSession.java | 4 + .../jpa/BankProfileJpaRepository.java | 3 + .../db/repository/jpa/ConsentRepository.java | 2 + .../db/repository/jpa/PaymentRepository.java | 2 + .../FintechPsuAspspPrvKeyInboxRepository.java | 2 + .../FintechPsuAspspPrvKeyRepository.java | 2 + .../jpa/psu/PsuAspspPrvKeyRepository.java | 2 + .../xs2a-bdd-tests-common/pom.xml | 6 +- .../AccountInformationRequestCommon.java | 5 ++ .../e2e/stages/AccountInformationResult.java | 34 +++++++- .../xs2a/tests/e2e/stages/AdminUtil.java | 28 +++++++ .../xs2a/tests/e2e/stages/PaymentResult.java | 14 ++++ .../tests/e2e/stages/StagesCommonUtil.java | 13 ++++ .../tests/e2e/wiremock/mocks/MockServers.java | 4 +- .../mocks/WiremockPaymentRequest.java | 6 ++ .../mocks/Xs2aProtocolApplication.java | 3 +- ...erAnonymousPaymentE2EXs2aProtocolTest.java | 78 +++++++++++++++++++ ...teBankAfterConsentE2EXs2aProtocolTest.java | 78 +++++++++++++++++++ 19 files changed, 296 insertions(+), 10 deletions(-) create mode 100644 opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AdminUtil.java create mode 100644 opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterAnonymousPaymentE2EXs2aProtocolTest.java create mode 100644 opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterConsentE2EXs2aProtocolTest.java diff --git a/opba-admin-rest-impl/src/main/java/de/adorsys/opba/adminapi/service/AdminApiService.java b/opba-admin-rest-impl/src/main/java/de/adorsys/opba/adminapi/service/AdminApiService.java index c9402f4952..a22719bb41 100644 --- a/opba-admin-rest-impl/src/main/java/de/adorsys/opba/adminapi/service/AdminApiService.java +++ b/opba-admin-rest-impl/src/main/java/de/adorsys/opba/adminapi/service/AdminApiService.java @@ -5,9 +5,13 @@ import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.BankAction; import de.adorsys.opba.db.domain.entity.BankProfile; -import de.adorsys.opba.db.repository.jpa.BankActionRepository; import de.adorsys.opba.db.repository.jpa.BankProfileJpaRepository; import de.adorsys.opba.db.repository.jpa.BankRepository; +import de.adorsys.opba.db.repository.jpa.ConsentRepository; +import de.adorsys.opba.db.repository.jpa.PaymentRepository; +import de.adorsys.opba.db.repository.jpa.fintech.FintechPsuAspspPrvKeyInboxRepository; +import de.adorsys.opba.db.repository.jpa.fintech.FintechPsuAspspPrvKeyRepository; +import de.adorsys.opba.db.repository.jpa.psu.PsuAspspPrvKeyRepository; import de.adorsys.opba.protocol.api.common.ProtocolAction; import lombok.Data; import lombok.Getter; @@ -45,10 +49,13 @@ public class AdminApiService { private static final String ADMIN_MAPPERS_PACKAGE = "de.adorsys.opba.adminapi.service.mappers"; - private final BankActionRepository actionRepository; private final BankRepository bankRepository; private final BankProfileJpaRepository bankProfileJpaRepository; - + private final PsuAspspPrvKeyRepository psuAspspPrvKeyRepository; + private final FintechPsuAspspPrvKeyRepository fintechPsuAspspPrvKeyRepository; + private final FintechPsuAspspPrvKeyInboxRepository fintechPsuAspspPrvKeyInboxRepository; + private final PaymentRepository paymentRepository; + private final ConsentRepository consentRepository; private final BankMapper bankMapper; private final PageMapper pageMapper; @@ -130,7 +137,12 @@ public BankData updateBank(UUID bankId, BankData bankData) { @Transactional public void deleteBank(UUID bankId) { Bank bank = bankRepository.findByUuid(bankId).orElseThrow(() -> new EntityNotFoundException("No bank: " + bankId)); - bankProfileJpaRepository.deleteAll(bankProfileJpaRepository.findByBankUuid(bank.getUuid())); + bankProfileJpaRepository.deleteByBank(bank); + psuAspspPrvKeyRepository.deleteByAspsp(bank); + fintechPsuAspspPrvKeyRepository.deleteByAspsp(bank); + fintechPsuAspspPrvKeyInboxRepository.deleteByAspsp(bank); + paymentRepository.deleteByAspsp(bank); + consentRepository.deleteByAspsp(bank); bankRepository.delete(bank); } diff --git a/opba-db/src/main/java/de/adorsys/opba/db/domain/entity/sessions/ServiceSession.java b/opba-db/src/main/java/de/adorsys/opba/db/domain/entity/sessions/ServiceSession.java index d7ecc46ee7..dd9643b020 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/domain/entity/sessions/ServiceSession.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/domain/entity/sessions/ServiceSession.java @@ -3,6 +3,7 @@ import de.adorsys.opba.db.domain.entity.BankProfile; import de.adorsys.opba.db.domain.entity.Consent; import de.adorsys.opba.db.domain.entity.IdAssignable; +import de.adorsys.opba.db.domain.entity.Payment; import de.adorsys.opba.db.domain.generators.AssignedUuidGenerator; import lombok.AllArgsConstructor; import lombok.Builder; @@ -61,6 +62,9 @@ public class ServiceSession implements IdAssignable { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "serviceSession") private Collection consents; + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "serviceSession") + private Collection payments; + @Version private int version; diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/BankProfileJpaRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/BankProfileJpaRepository.java index ad6cf48f4b..d4d9a08678 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/BankProfileJpaRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/BankProfileJpaRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.BankProfile; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,6 +15,8 @@ public interface BankProfileJpaRepository extends JpaRepository findByUuid(UUID uuid); + void deleteByBank(Bank bank); + List findByBankUuid(UUID bankUuid); List findByBankIdIn(Collection bankIds); diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/ConsentRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/ConsentRepository.java index 1fc95581a7..c147b78feb 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/ConsentRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/ConsentRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.Consent; import de.adorsys.opba.db.domain.entity.psu.Psu; import org.springframework.data.jpa.repository.JpaRepository; @@ -18,6 +19,7 @@ public interface ConsentRepository extends JpaRepository { List findByServiceSessionIdOrderByModifiedAtDesc(UUID serviceSessionId); Collection findByPsu(Psu owner); + void deleteByAspsp(Bank bank); @Modifying @Transactional diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/PaymentRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/PaymentRepository.java index 5a5e080e44..c941ba22da 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/PaymentRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/PaymentRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.Payment; import de.adorsys.opba.db.domain.entity.psu.Psu; import org.springframework.data.jpa.repository.JpaRepository; @@ -18,6 +19,7 @@ public interface PaymentRepository extends JpaRepository { List findByServiceSessionIdOrderByModifiedAtDesc(UUID serviceSessionId); Collection findByPsu(Psu owner); + void deleteByAspsp(Bank bank); @Modifying @Transactional diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyInboxRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyInboxRepository.java index a3e71483cc..5c431f0ab5 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyInboxRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyInboxRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa.fintech; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.fintech.FintechPsuAspspPrvKeyInbox; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @@ -11,4 +12,5 @@ public interface FintechPsuAspspPrvKeyInboxRepository extends CrudRepository { Optional findByFintechIdAndPsuIdAndAspspId(long fintechId, long psuId, long aspspId); + void deleteByAspsp(Bank bank); } diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyRepository.java index 3fc3ce09b2..4802c63723 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/fintech/FintechPsuAspspPrvKeyRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa.fintech; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.fintech.FintechPsuAspspPrvKey; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @@ -11,4 +12,5 @@ public interface FintechPsuAspspPrvKeyRepository extends CrudRepository { Optional findByFintechIdAndPsuIdAndAspspId(long fintechId, long psuId, long aspspId); + void deleteByAspsp(Bank bank); } diff --git a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/psu/PsuAspspPrvKeyRepository.java b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/psu/PsuAspspPrvKeyRepository.java index f95ff211ee..bf94bbf0cd 100644 --- a/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/psu/PsuAspspPrvKeyRepository.java +++ b/opba-db/src/main/java/de/adorsys/opba/db/repository/jpa/psu/PsuAspspPrvKeyRepository.java @@ -1,5 +1,6 @@ package de.adorsys.opba.db.repository.jpa.psu; +import de.adorsys.opba.db.domain.entity.Bank; import de.adorsys.opba.db.domain.entity.psu.PsuAspspPrvKey; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @@ -11,4 +12,5 @@ public interface PsuAspspPrvKeyRepository extends CrudRepository { Optional findByPsuIdAndAspspId(long psuId, long aspspId); + void deleteByAspsp(Bank bank); } diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/pom.xml b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/pom.xml index f0979a42bc..86ee4e5038 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/pom.xml +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/pom.xml @@ -23,7 +23,11 @@ org.projectlombok lombok - + + de.adorsys.opba + opba-admin-rest-impl + ${project.version} + de.adorsys.opba opba-banking-rest-impl diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationRequestCommon.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationRequestCommon.java index bf344ae55f..1c139a7fdf 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationRequestCommon.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationRequestCommon.java @@ -709,6 +709,11 @@ public SELF user_anton_brueckner_sees_that_he_needs_to_be_redirected_to_aspsp_an return self(); } + public SELF admin_calls_delete_bank(String bankUuid) { + AdminUtil.adminCallsDeleteBank(bankUuid); + return self(); + } + protected ExtractableResponse startInitialInternalConsentAuthorization(String uriPath, String resourceData) { ExtractableResponse response = startInitialInternalConsentAuthorization(uriPath, resourceData, ACCEPTED); diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationResult.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationResult.java index 09771e3c7b..2f5d046a4f 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationResult.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AccountInformationResult.java @@ -93,6 +93,13 @@ public SELF open_banking_has_consent_for_anton_brueckner_account_list() { return self(); } + @SneakyThrows + @Transactional + public SELF open_banking_has_no_consent_for_anton_brueckner_account_list() { + assertThat(consents.findByServiceSessionIdOrderByModifiedAtDesc(UUID.fromString(serviceSessionId))).isEmpty(); + return self(); + } + @SneakyThrows @Transactional public SELF open_banking_has_no_consent() { @@ -130,6 +137,12 @@ public SELF open_banking_can_read_anton_brueckner_account_data_using_consent_bou return open_banking_can_read_anton_brueckner_account_data_using_consent_bound_to_service_session(true, bankProfileId); } + @SneakyThrows + public SELF admin_check_that_bank_is_deleted(String bankUuid) { + AdminUtil.adminChecksThatBankIsDeleted(bankUuid); + return self(); + } + @SneakyThrows public SELF open_banking_can_read_anton_brueckner_account_data_using_consent_bound_to_service_session( boolean validateResourceId @@ -163,6 +176,17 @@ private void open_banking_can_read_anton_brueckner_account_data_using_consent_bo this.responseContent = response.body().asString(); } + public void open_banking_can_not_read_anton_brueckner_account_data_using_consent_bound_to_service_session_and_bank_profile_id() { + withAccountsHeaders(ANTON_BRUECKNER, SANDBOX_BANK_PROFILE_ID) + .header(SERVICE_SESSION_ID, serviceSessionId) + .when() + .get(AIS_ACCOUNTS_ENDPOINT) + .then() + .statusCode(HttpStatus.INTERNAL_SERVER_ERROR.value()) + .body("message", equalTo("No bank profile for bank: " + SANDBOX_BANK_PROFILE_ID)) + .extract(); + } + @SneakyThrows public SELF open_banking_can_read_user_account_data_using_consent_bound_to_service_session( String user, boolean validateResourceId @@ -456,7 +480,7 @@ public SELF user_anton_brueckner_provided_initial_parameters_to_list_accounts_wi return self(); } - public SELF fintech_calls_consent_activation_for_current_authorization_id(String serviceSessionId) { + public SELF fintech_calls_consent_activation_for_current_authorization_id(String serviceSessionId, HttpStatus status) { withSignatureHeaders(RestAssured .given() .header(SERVICE_SESSION_PASSWORD, SESSION_PASSWORD) @@ -464,12 +488,16 @@ public SELF fintech_calls_consent_activation_for_current_authorization_id(String .when() .post(CONFIRM_CONSENT_ENDPOINT, serviceSessionId) .then() - .statusCode(HttpStatus.OK.value()); + .statusCode(status.value()); return self(); } public SELF fintech_calls_consent_activation_for_current_authorization_id() { - return fintech_calls_consent_activation_for_current_authorization_id(serviceSessionId); + return fintech_calls_consent_activation_for_current_authorization_id(serviceSessionId, HttpStatus.OK); + } + + public SELF fintech_calls_consent_activation_for_current_authorization_id_failed_with_not_found() { + return fintech_calls_consent_activation_for_current_authorization_id(serviceSessionId, HttpStatus.NOT_FOUND); } @SneakyThrows diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AdminUtil.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AdminUtil.java new file mode 100644 index 0000000000..bce540a6d6 --- /dev/null +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/AdminUtil.java @@ -0,0 +1,28 @@ +package de.adorsys.opba.protocol.xs2a.tests.e2e.stages; + +import lombok.experimental.UtilityClass; +import org.springframework.http.HttpStatus; + +import static de.adorsys.opba.protocol.xs2a.tests.e2e.stages.StagesCommonUtil.ADMIN_API; +import static de.adorsys.opba.protocol.xs2a.tests.e2e.stages.StagesCommonUtil.BASIC_AUTH; +import static de.adorsys.opba.protocol.xs2a.tests.e2e.stages.StagesCommonUtil.headersWithAuthorization; + +@UtilityClass +public class AdminUtil { + + public void adminCallsDeleteBank(String bankUuid) { + headersWithAuthorization(BASIC_AUTH) + .when() + .delete(ADMIN_API + "banks/" + bankUuid) + .then() + .statusCode(HttpStatus.OK.value()); + } + + public void adminChecksThatBankIsDeleted(String bankUuid) { + headersWithAuthorization(BASIC_AUTH) + .when() + .get(ADMIN_API + "banks/" + bankUuid) + .then() + .statusCode(HttpStatus.NOT_FOUND.value()); + } +} diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/PaymentResult.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/PaymentResult.java index 0b424e180b..200838b7e2 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/PaymentResult.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/PaymentResult.java @@ -9,6 +9,7 @@ import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; +import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.transaction.annotation.Transactional; @@ -56,6 +57,13 @@ public SELF open_banking_has_stored_payment() { return self(); } + @SneakyThrows + @Transactional + public SELF open_banking_has_no_payment_for_anton_brueckner() { + assertThat(payments.findByServiceSessionIdOrderByModifiedAtDesc(UUID.fromString(paymentServiceSessionId))).isEmpty(); + return self(); + } + public SELF user_logged_in_into_opba_as_anonymous_user_with_credentials_using_fintech_supplied_url_is_forbidden() { String fintechUserTempPassword = UriComponentsBuilder .fromHttpUrl(redirectUriToGetUserParams).build() @@ -222,5 +230,11 @@ public SELF fintech_calls_payment_activation_for_current_authorization_id(String .statusCode(HttpStatus.OK.value()); return self(); } + + @SneakyThrows + public SELF admin_check_that_bank_is_deleted(String bankUuid) { + AdminUtil.adminChecksThatBankIsDeleted(bankUuid); + return self(); + } } diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/StagesCommonUtil.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/StagesCommonUtil.java index 6d510d62fc..9b5ebca4a0 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/StagesCommonUtil.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-tests-common/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/stages/StagesCommonUtil.java @@ -17,6 +17,7 @@ import static de.adorsys.opba.protocol.xs2a.tests.HeaderNames.X_TIMESTAMP_UTC; import static de.adorsys.opba.restapi.shared.HttpHeaders.COMPUTE_PSU_IP_ADDRESS; import static de.adorsys.opba.restapi.shared.HttpHeaders.UserAgentContext.PSU_IP_ADDRESS; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; @UtilityClass @SuppressWarnings({"checkstyle:HideUtilityClassConstructor", "PMD.AvoidUsingHardCodedIP"}) //Checkstyle doesn't recognise Lombok @@ -71,6 +72,9 @@ public class StagesCommonUtil { public static final String POSTBANK_BANK_PROFILE_ID = "e431a602-15ab-48b8-8c9b-ce381d2034c4"; public static final String SPARKASSE_BANK_PROFILE_ID = "f31a87dd-5d3e-41b8-924a-0d85b10288bc"; + public static final String ADMIN_API = "/admin/v1/"; + public static final String BASIC_AUTH = "Basic QWxhZGRpbjpPcGVuU2VzYW1l"; + public static RequestSpecification withAccountsHeaders(String fintechUserId) { return withAccountsHeaders(fintechUserId, SANDBOX_BANK_PROFILE_ID); } @@ -127,6 +131,12 @@ public static RequestSpecification withSignatureHeaders(RequestSpecification spe .header(X_TIMESTAMP_UTC, xTimestampUtc.toString()); } + public static RequestSpecification headersWithAuthorization(String authorization) { + return RestAssured + .given() + .header(AUTHORIZATION, authorization); + } + private static RequestSpecification headersWithoutIpAddress(String fintechUserId, UUID xRequestId, Instant xTimestampUtc) { return headersWithoutIpAddress(fintechUserId, SANDBOX_BANK_PROFILE_ID, xRequestId, xTimestampUtc); } @@ -143,4 +153,7 @@ private static RequestSpecification headersWithoutIpAddress(String fintechUserId .header(X_REQUEST_ID, xRequestId.toString()) .header(X_TIMESTAMP_UTC, xTimestampUtc.toString()); } + + + } diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/MockServers.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/MockServers.java index d2ca63cf7d..c1d12d031a 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/MockServers.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/MockServers.java @@ -46,6 +46,8 @@ public class MockServers> extends CommonGivenStag public static final String POSTBANK_BANK_ID = "01aa84f2-25c0-4e02-8065-c401657e3fb0"; public static final String CONSORS_BANK_BANK_ID = "81cecc67-6d1b-4169-b67c-2de52b99a0cc"; public static final String SPARKASSE_BANK_ID = "03668d3e-c2a7-425a-b50a-f73347fbfb33"; + public static final String SANDBOX_BANK_ID = "adadadad-4000-0000-0000-b0b0b0b0b0b0"; + @Autowired private BankProfileJpaRepository bankProfileJpaRepository; @@ -359,7 +361,7 @@ public SELF embedded_mock_of_sandbox_for_max_musterman_transactions_running_for_ @SneakyThrows private void startWireMock(WireMockConfiguration config) { - startWireMock(config, "adadadad-4000-0000-0000-b0b0b0b0b0b0", defaultBankProfileConfigurer); + startWireMock(config, SANDBOX_BANK_ID, defaultBankProfileConfigurer); } @SneakyThrows diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/WiremockPaymentRequest.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/WiremockPaymentRequest.java index 339c9990ec..25a178fac0 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/WiremockPaymentRequest.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/WiremockPaymentRequest.java @@ -5,6 +5,7 @@ import com.tngtech.jgiven.annotation.ExpectedScenarioState; import com.tngtech.jgiven.integration.spring.JGivenStage; import de.adorsys.opba.protocol.xs2a.tests.e2e.LocationExtractorUtil; +import de.adorsys.opba.protocol.xs2a.tests.e2e.stages.AdminUtil; import de.adorsys.opba.protocol.xs2a.tests.e2e.stages.PaymentRequestCommon; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; @@ -80,6 +81,11 @@ public SELF current_redirected_to_screen_is_payment_result() { return self(); } + public SELF admin_calls_delete_bank(String bankUuid) { + AdminUtil.adminCallsDeleteBank(bankUuid); + return self(); + } + private void extractRedirectOkUriSentByOpbaFromWiremock() { extractRedirectOkUriSentByOpbaFromWiremock(0); } diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/Xs2aProtocolApplication.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/Xs2aProtocolApplication.java index d843436659..47b42fb9ec 100644 --- a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/Xs2aProtocolApplication.java +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/main/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/mocks/Xs2aProtocolApplication.java @@ -1,5 +1,6 @@ package de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks; +import de.adorsys.opba.adminapi.config.EnableAdminApi; import de.adorsys.opba.api.security.internal.EnableTokenBasedApiSecurity; import de.adorsys.opba.consentapi.config.EnableConsentApi; import de.adorsys.opba.db.config.EnableBankingPersistence; @@ -7,7 +8,7 @@ import de.adorsys.opba.tppauthapi.config.EnableTppAuthApi; import de.adorsys.opba.tppbankingapi.config.EnableBankingApi; import org.springframework.boot.autoconfigure.SpringBootApplication; - +@EnableAdminApi @EnableTppAuthApi @EnableConsentApi @EnableBankingApi diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterAnonymousPaymentE2EXs2aProtocolTest.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterAnonymousPaymentE2EXs2aProtocolTest.java new file mode 100644 index 0000000000..6d8d1c7082 --- /dev/null +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterAnonymousPaymentE2EXs2aProtocolTest.java @@ -0,0 +1,78 @@ +package de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock; + +import com.tngtech.jgiven.integration.spring.junit5.SpringScenarioTest; +import de.adorsys.opba.protocol.xs2a.config.protocol.ProtocolUrlsConfiguration; +import de.adorsys.opba.protocol.xs2a.tests.e2e.JGivenConfig; +import de.adorsys.opba.protocol.xs2a.tests.e2e.stages.PaymentResult; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.MockServers; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.WiremockPaymentRequest; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.Xs2aProtocolApplication; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static de.adorsys.opba.protocol.xs2a.tests.TestProfiles.MOCKED_SANDBOX; +import static de.adorsys.opba.protocol.xs2a.tests.TestProfiles.ONE_TIME_POSTGRES_RAMFS; +import static de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.MockServers.SANDBOX_BANK_ID; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * Happy-path test that uses wiremock-stubbed request-responses to drive banking-protocol. + */ +@SuppressWarnings("CPD-START") // Makes no sense to be too abstract +@Transactional(propagation = Propagation.NOT_SUPPORTED) +@SpringBootTest(classes = {Xs2aProtocolApplication.class, JGivenConfig.class}, webEnvironment = RANDOM_PORT, properties = {"spring.datasource.url=jdbc:tc:postgresql:12:////open_banking?TC_INITSCRIPT=init.sql?TC_TMPFS=/testtmpfs1:rw"}) +@ActiveProfiles(profiles = {ONE_TIME_POSTGRES_RAMFS, MOCKED_SANDBOX}) +public class WiremockDeleteBankAfterAnonymousPaymentE2EXs2aProtocolTest extends SpringScenarioTest>, PaymentResult> { + + private final String OPBA_PASSWORD = UUID.randomUUID().toString(); + private final String OPBA_LOGIN = UUID.randomUUID().toString(); + + @Autowired + private ProtocolUrlsConfiguration urlsConfiguration; + + @LocalServerPort + private int port; + + // See https://github.com/spring-projects/spring-boot/issues/14879 for the 'why setting port' + @BeforeEach + void setBaseUrl() { + ProtocolUrlsConfiguration.WebHooks pisUrls = urlsConfiguration.getPis().getWebHooks(); + pisUrls.setOk(pisUrls.getOk().replaceAll("localhost:\\d+", "localhost:" + port)); + pisUrls.setNok(pisUrls.getNok().replaceAll("localhost:\\d+", "localhost:" + port)); + } + + @Test + void testBankDeletionAfterPaymentInitializationUsingRedirect() { + given() + .redirect_mock_of_sandbox_for_anton_brueckner_payments_running() + .set_default_preferred_approach() + .rest_assured_points_to_opba_server_with_fintech_signer_on_banking_api() + .user_registered_in_opba_with_credentials(OPBA_LOGIN, OPBA_PASSWORD); + + when() + .fintech_calls_initiate_payment_for_anton_brueckner_with_anonymous_allowed() + .and() + .user_logged_in_into_opba_as_anonymous_user_with_credentials_using_fintech_supplied_url() + .and() + .user_anton_brueckner_provided_initial_parameters_to_authorize_initiation_payment() + .and() + .user_anton_brueckner_sees_that_he_needs_to_be_redirected_to_aspsp_and_redirects_to_aspsp() + .and() + .open_banking_redirect_from_aspsp_ok_webhook_called_for_api_test() + .and() + .admin_calls_delete_bank(SANDBOX_BANK_ID); + + then() + .admin_check_that_bank_is_deleted(SANDBOX_BANK_ID) + .open_banking_has_no_payment_for_anton_brueckner(); + } +} + diff --git a/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterConsentE2EXs2aProtocolTest.java b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterConsentE2EXs2aProtocolTest.java new file mode 100644 index 0000000000..48cb6f7d8e --- /dev/null +++ b/opba-protocols/xs2a-protocol-tests/xs2a-bdd-wiremock/src/test/java/de/adorsys/opba/protocol/xs2a/tests/e2e/wiremock/WiremockDeleteBankAfterConsentE2EXs2aProtocolTest.java @@ -0,0 +1,78 @@ +package de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock; + +import com.tngtech.jgiven.integration.spring.junit5.SpringScenarioTest; +import de.adorsys.opba.protocol.api.common.Approach; +import de.adorsys.opba.protocol.xs2a.config.protocol.ProtocolUrlsConfiguration; +import de.adorsys.opba.protocol.xs2a.tests.e2e.JGivenConfig; +import de.adorsys.opba.protocol.xs2a.tests.e2e.stages.AccountInformationResult; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.MockServers; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.WiremockAccountInformationRequest; +import de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.Xs2aProtocolApplication; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static de.adorsys.opba.protocol.xs2a.tests.TestProfiles.MOCKED_SANDBOX; +import static de.adorsys.opba.protocol.xs2a.tests.TestProfiles.ONE_TIME_POSTGRES_RAMFS; +import static de.adorsys.opba.protocol.xs2a.tests.e2e.wiremock.mocks.MockServers.SANDBOX_BANK_ID; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@Sql(statements = "UPDATE opb_bank_action SET protocol_bean_name = 'xs2aListTransactions' WHERE protocol_bean_name = 'xs2aSandboxListTransactions'") + +@Transactional(propagation = Propagation.NOT_SUPPORTED) +@SpringBootTest(classes = {Xs2aProtocolApplication.class, JGivenConfig.class}, webEnvironment = RANDOM_PORT, properties = {"spring.datasource.url=jdbc:tc:postgresql:12:////open_banking?TC_INITSCRIPT=init.sql?TC_TMPFS=/testtmpfs2:rw"}) +@ActiveProfiles(profiles = {ONE_TIME_POSTGRES_RAMFS, MOCKED_SANDBOX}) +class WiremockDeleteBankAfterConsentE2EXs2aProtocolTest extends SpringScenarioTest>, AccountInformationResult> { + + private final String OPBA_LOGIN = UUID.randomUUID().toString(); + private final String OPBA_PASSWORD = UUID.randomUUID().toString(); + + @LocalServerPort + private int port; + + @Autowired + private ProtocolUrlsConfiguration urlsConfiguration; + + @BeforeEach + void setBaseUrl() { + ProtocolUrlsConfiguration.WebHooks aisUrls = urlsConfiguration.getAis().getWebHooks(); + aisUrls.setOk(aisUrls.getOk().replaceAll("localhost:\\d+", "localhost:" + port)); + aisUrls.setNok(aisUrls.getNok().replaceAll("localhost:\\d+", "localhost:" + port)); + } + + + @Test + void testBankDeletionAfterAccountsListWithConsentUsingRedirect() { + given() + .redirect_mock_of_sandbox_for_anton_brueckner_accounts_running() + .set_default_preferred_approach() + .preferred_sca_approach_selected_for_all_banks_in_opba(Approach.REDIRECT) + .rest_assured_points_to_opba_server_with_fintech_signer_on_banking_api() + .user_registered_in_opba_with_credentials(OPBA_LOGIN, OPBA_PASSWORD); + + when() + .fintech_calls_list_accounts_for_anton_brueckner() + .and() + .user_logged_in_into_opba_as_opba_user_with_credentials_using_fintech_supplied_url(OPBA_LOGIN, OPBA_PASSWORD) + .and() + .user_anton_brueckner_provided_initial_parameters_to_list_accounts_with_all_accounts_consent_with_ip_address_check() + .and() + .open_banking_redirect_from_aspsp_ok_webhook_called_for_api_test() + .and() + .admin_calls_delete_bank(SANDBOX_BANK_ID); + + then() + .admin_check_that_bank_is_deleted(SANDBOX_BANK_ID) + .open_banking_has_no_consent_for_anton_brueckner_account_list() + .fintech_calls_consent_activation_for_current_authorization_id_failed_with_not_found() + .open_banking_can_not_read_anton_brueckner_account_data_using_consent_bound_to_service_session_and_bank_profile_id(); + } +}