diff --git a/src/main/java/uk/gov/pay/connector/charge/service/ChargeService.java b/src/main/java/uk/gov/pay/connector/charge/service/ChargeService.java index 29cd1efb8..075808a36 100644 --- a/src/main/java/uk/gov/pay/connector/charge/service/ChargeService.java +++ b/src/main/java/uk/gov/pay/connector/charge/service/ChargeService.java @@ -142,6 +142,7 @@ import static uk.gov.pay.connector.charge.model.domain.ChargeStatus.PAYMENT_NOTIFICATION_CREATED; import static uk.gov.pay.connector.charge.model.domain.ChargeStatus.fromString; import static uk.gov.pay.connector.charge.model.domain.Exemption3dsType.CORPORATE; +import static uk.gov.pay.connector.gateway.PaymentGatewayName.STRIPE; import static uk.gov.pay.connector.gateway.PaymentGatewayName.WORLDPAY; import static uk.gov.pay.connector.paymentprocessor.model.Exemption3ds.EXEMPTION_NOT_REQUESTED; import static uk.gov.service.payments.commons.model.AuthorisationMode.AGREEMENT; @@ -155,6 +156,7 @@ import static uk.gov.service.payments.commons.model.ErrorIdentifier.NON_HTTPS_RETURN_URL_NOT_ALLOWED_FOR_A_LIVE_ACCOUNT; import static uk.gov.service.payments.commons.model.Source.CARD_AGENT_INITIATED_MOTO; import static uk.gov.service.payments.commons.model.Source.CARD_API; +import static uk.gov.service.payments.commons.model.Source.CARD_EXTERNAL_TELEPHONE; import static uk.gov.service.payments.commons.model.Source.CARD_PAYMENT_LINK; public class ChargeService { @@ -1177,7 +1179,7 @@ private void checkIfGatewayAccountDisabled(GatewayAccountEntity gatewayAccount) } private void checkIfAmountBelowMinimum(Source source, Long amount, GatewayAccountEntity gatewayAccount, String paymentProvider) { - if (source == CARD_API && amount < MINIMUM_STRIPE_PAYMENT_AMOUNT && PaymentGatewayName.valueFrom(paymentProvider) == PaymentGatewayName.STRIPE) { + if (source != CARD_EXTERNAL_TELEPHONE && amount < MINIMUM_STRIPE_PAYMENT_AMOUNT && PaymentGatewayName.valueFrom(paymentProvider) == STRIPE) { throw new ChargeException("Payments under 30 pence are not allowed for Stripe accounts", AMOUNT_BELOW_MINIMUM, SC_UNPROCESSABLE_ENTITY); } checkIfZeroAmountAllowed(amount, gatewayAccount); diff --git a/src/test/java/uk/gov/pay/connector/charge/service/ChargeServiceCreateTest.java b/src/test/java/uk/gov/pay/connector/charge/service/ChargeServiceCreateTest.java index 1b5625eff..310886a67 100644 --- a/src/test/java/uk/gov/pay/connector/charge/service/ChargeServiceCreateTest.java +++ b/src/test/java/uk/gov/pay/connector/charge/service/ChargeServiceCreateTest.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -729,8 +730,9 @@ void shouldThrowException_whenGatewayAccountDisabled() { verify(mockedChargeDao, never()).persist(any(ChargeEntity.class)); } - @Test - void shouldThrowException_whenPaymentProviderIsStripeAndAmountUnder30Pence() { + @ParameterizedTest + @EnumSource(value = Source.class, names = { "CARD_API", "CARD_PAYMENT_LINK", "CARD_AGENT_INITIATED_MOTO" }) + void shouldThrowException_whenPaymentProviderIsStripeAndAmountUnder30Pence(Source source) { GatewayAccountCredentialsEntity stripeGatewayAccountCredentialsEntity = GatewayAccountCredentialsEntityFixture .aGatewayAccountCredentialsEntity() .withGatewayAccountEntity(gatewayAccount) @@ -740,7 +742,7 @@ void shouldThrowException_whenPaymentProviderIsStripeAndAmountUnder30Pence() { .build(); ChargeCreateRequest request = requestBuilder .withAmount(29) - .withSource(CARD_API) + .withSource(source) .build(); when(mockedGatewayAccountDao.findById(GATEWAY_ACCOUNT_ID)).thenReturn(Optional.of(gatewayAccount)); when(mockGatewayAccountCredentialsService.getCurrentOrActiveCredential(gatewayAccount)).thenReturn(stripeGatewayAccountCredentialsEntity); diff --git a/src/test/java/uk/gov/pay/connector/it/resources/ChargesApiResourceCreateIT.java b/src/test/java/uk/gov/pay/connector/it/resources/ChargesApiResourceCreateIT.java index 89aadb87b..c09509ef7 100644 --- a/src/test/java/uk/gov/pay/connector/it/resources/ChargesApiResourceCreateIT.java +++ b/src/test/java/uk/gov/pay/connector/it/resources/ChargesApiResourceCreateIT.java @@ -16,12 +16,16 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; import uk.gov.pay.connector.extension.AppWithPostgresAndSqsExtension; import uk.gov.pay.connector.gateway.PaymentGatewayName; import uk.gov.pay.connector.gatewayaccount.model.GatewayAccountType; import uk.gov.pay.connector.it.base.ITestBaseExtension; import uk.gov.pay.connector.it.dao.DatabaseFixtures; import uk.gov.service.payments.commons.model.ErrorIdentifier; +import uk.gov.service.payments.commons.model.Source; import javax.ws.rs.core.Response.Status; import java.sql.Timestamp; @@ -383,8 +387,9 @@ void when_amount_is_zero_and_account_does_not_allow_zero_amount() { .body("error_identifier", is(ErrorIdentifier.ZERO_AMOUNT_NOT_ALLOWED.toString())); } - @Test - void when_amount_is_under_30p_for_api_payment_for_Stripe_account() { + @ParameterizedTest + @ValueSource( strings = { "CARD_API", "CARD_PAYMENT_LINK", "CARD_AGENT_INITIATED_MOTO" }) + void when_amount_is_under_30p_for_api_payment_for_Stripe_account(String source) { DatabaseFixtures.TestAccount stripeTestAccount = app.getDatabaseFixtures() .aTestAccount() .withPaymentProvider("stripe") @@ -397,7 +402,7 @@ void when_amount_is_under_30p_for_api_payment_for_Stripe_account() { "reference", "Test reference", "description", "Test description", "return_url", "http://service.local/success-page/", - "source", "CARD_API" + "source", source ))) .post(format("/v1/api/accounts/%s/charges", stripeTestAccount.getAccountId())) .then() @@ -900,8 +905,9 @@ void when_amount_is_zero_if_account_does_not_allow_zero_amount() { .body("error_identifier", is(ErrorIdentifier.ZERO_AMOUNT_NOT_ALLOWED.toString())); } - @Test - void when_amount_is_under_30p_for_api_payment_for_Stripe_account() { + @ParameterizedTest + @ValueSource( strings = { "CARD_API", "CARD_PAYMENT_LINK", "CARD_AGENT_INITIATED_MOTO" }) + void when_amount_is_under_30p_for_api_payment_for_Stripe_account(String source) { DatabaseFixtures.TestAccount stripeTestAccount = app.getDatabaseFixtures() .aTestAccount() .withPaymentProvider("stripe") @@ -915,7 +921,7 @@ void when_amount_is_under_30p_for_api_payment_for_Stripe_account() { "reference", "Test reference", "description", "Test description", "return_url", "http://service.local/success-page/", - "source", "CARD_API" + "source", source ))) .post(format("/v1/api/service/%s/account/%s/charges", VALID_SERVICE_ID, GatewayAccountType.TEST)) .then()