diff --git a/src/main/java/com/yau/digitalrmb/payment/infrastructure/persistence/JdbcPaymentResourceRepository.java b/src/main/java/com/yau/digitalrmb/payment/infrastructure/persistence/JdbcPaymentResourceRepository.java index b21899c..56bd367 100644 --- a/src/main/java/com/yau/digitalrmb/payment/infrastructure/persistence/JdbcPaymentResourceRepository.java +++ b/src/main/java/com/yau/digitalrmb/payment/infrastructure/persistence/JdbcPaymentResourceRepository.java @@ -52,7 +52,7 @@ public class JdbcPaymentResourceRepository implements PaymentResourceRepository @Override public PaymentParticipant loadPayer(PaymentActor actor) { - WalletPrerequisiteReference reference = walletProjection.referenceForSubject( + WalletPrerequisiteReference reference = walletProjection.ensureForSubject( new InstitutionKeySubject(actor.getUserId(), actor.getSchoolId(), actor.getClassId())); return loadParticipant(reference); } @@ -62,7 +62,7 @@ public class JdbcPaymentResourceRepository implements PaymentResourceRepository if (teachingPayeeWhitelist.isTeachingWallet(payeeWalletId)) { return loadParticipant(teachingPayeeWhitelist.resolve(payeeWalletId)); } - return loadParticipant(walletProjection.referenceForWallet(payeeWalletId)); + return loadParticipant(walletProjection.ensureForWallet(payeeWalletId)); } @Override diff --git a/src/test/java/com/yau/digitalrmb/payment/interfaces/rest/PaymentControllerTest.java b/src/test/java/com/yau/digitalrmb/payment/interfaces/rest/PaymentControllerTest.java index f71e843..8a3d4ae 100644 --- a/src/test/java/com/yau/digitalrmb/payment/interfaces/rest/PaymentControllerTest.java +++ b/src/test/java/com/yau/digitalrmb/payment/interfaces/rest/PaymentControllerTest.java @@ -238,6 +238,39 @@ class PaymentControllerTest { "WALLET_B_7D8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6")); } + @Test + void refreshActionsProjectCompletedModuleThreeWalletsWhenSharedRowsAreMissing() throws Exception { + clearSharedWalletProjection(); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM digital_wallet WHERE wallet_id IN (?,?)", + Integer.class, PAYER_WALLET, PAYEE_WALLET)).isZero(); + + String created = mockMvc.perform(post("/api/v1/payment/attempts").with(payer())) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + String attemptId = JsonPath.read(created, "$.data.attemptId"); + + mockMvc.perform(post("/api/v1/payment/attempts/{id}/steps/01/actions/refresh-payer", attemptId) + .with(payer()).contentType(MediaType.APPLICATION_JSON).content("{}")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.actionStatus").value("COMPLETED")) + .andExpect(jsonPath("$.data.output.walletId").value(PAYER_WALLET)); + mockMvc.perform(post("/api/v1/payment/attempts/{id}/steps/01/actions/refresh-payee", attemptId) + .with(payer()).contentType(MediaType.APPLICATION_JSON) + .content("{\"payeeWalletId\":\"" + PAYEE_WALLET + "\"}")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.actionStatus").value("COMPLETED")) + .andExpect(jsonPath("$.data.output.walletId").value(PAYEE_WALLET)); + + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM digital_wallet WHERE wallet_id IN (?,?)", + Integer.class, PAYER_WALLET, PAYEE_WALLET)).isEqualTo(2); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM wallet_certificate WHERE wallet_id IN (?,?)", + Integer.class, PAYER_WALLET, PAYEE_WALLET)).isEqualTo(2); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM wallet_contract WHERE wallet_id IN (?,?)", + Integer.class, PAYER_WALLET, PAYEE_WALLET)).isEqualTo(2); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM wallet_bank_binding WHERE wallet_id IN (?,?)", + Integer.class, PAYER_WALLET, PAYEE_WALLET)).isEqualTo(2); + } + @Test void rejectsPaymentWhenPayerHasNoWalletOwnedCoins() throws Exception { String created = mockMvc.perform(post("/api/v1/payments").with(payer()).contentType(MediaType.APPLICATION_JSON) @@ -427,13 +460,17 @@ class PaymentControllerTest { } private void cleanWalletState() { + clearSharedWalletProjection(); + WalletOpeningTestData.deleteWalletFacts(jdbc, PAYER_USER); + WalletOpeningTestData.deleteWalletFacts(jdbc, PAYEE_USER); + } + + private void clearSharedWalletProjection() { jdbc.update("DELETE FROM wallet_bank_binding WHERE wallet_id IN (?,?)", PAYER_WALLET, PAYEE_WALLET); jdbc.update("DELETE FROM wallet_contract WHERE wallet_id IN (?,?)", PAYER_WALLET, PAYEE_WALLET); jdbc.update("DELETE FROM wallet_certificate WHERE wallet_id IN (?,?)", PAYER_WALLET, PAYEE_WALLET); jdbc.update("DELETE FROM simulated_bank_account WHERE user_id IN (?,?)", PAYER_USER, PAYEE_USER); jdbc.update("DELETE FROM digital_wallet WHERE wallet_id IN (?,?)", PAYER_WALLET, PAYEE_WALLET); - WalletOpeningTestData.deleteWalletFacts(jdbc, PAYER_USER); - WalletOpeningTestData.deleteWalletFacts(jdbc, PAYEE_USER); } private void cleanPaymentData() {