Skip to content

Commit d6932b0

Browse files
authored
[JB][OPS-13493] working solution (ish). + loads of tests/test data re… (#27)
* [JB][OPS-13493] working solution (ish). + loads of tests/test data refactor * fix test * fix test
1 parent 5176f1b commit d6932b0

31 files changed

+732
-372
lines changed

app/uk/gov/hmrc/cardpaymentfrontend/connectors/CardPaymentConnector.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,24 @@ class CardPaymentConnector @Inject() (appConfig: AppConfig, httpClientV2: HttpCl
3232

3333
private val cardPaymentBaseUrl: URL = url"""${appConfig.cardPaymentBaseUrl}"""
3434
private val initiatePaymentUrl: URL = url"$cardPaymentBaseUrl/card-payment/initiate-payment"
35-
private val checkPaymentStatusUrl: String => URL = (transactionNumber: String) => url"$cardPaymentBaseUrl/card-payment/payment-status/$transactionNumber"
36-
private val authAndSettleUrl: String => URL = (transactionNumber: String) => url"$cardPaymentBaseUrl/card-payment/auth-and-settle/$transactionNumber"
35+
private val checkPaymentStatusUrl: String => URL = (transactionReference: String) => url"$cardPaymentBaseUrl/card-payment/payment-status/$transactionReference"
36+
private val authAndSettleUrl: String => URL = (transactionReference: String) => url"$cardPaymentBaseUrl/card-payment/auth-and-settle/$transactionReference"
3737

3838
def initiatePayment(cardPaymentInitiatePaymentRequest: CardPaymentInitiatePaymentRequest)(implicit headerCarrier: HeaderCarrier): Future[CardPaymentInitiatePaymentResponse] =
3939
httpClientV2
4040
.post(initiatePaymentUrl)
4141
.withBody(Json.toJson(cardPaymentInitiatePaymentRequest))
4242
.execute[CardPaymentInitiatePaymentResponse]
4343

44-
def checkPaymentStatus(transactionNumber: String)(implicit headerCarrier: HeaderCarrier): Future[JsBoolean] =
44+
//todo probably delete?
45+
def checkPaymentStatus(transactionReference: String)(implicit headerCarrier: HeaderCarrier): Future[JsBoolean] =
4546
httpClientV2
46-
.get(checkPaymentStatusUrl(transactionNumber))
47+
.get(checkPaymentStatusUrl(transactionReference))
4748
.execute[JsBoolean]
4849

49-
def authAndSettle(transactionNumber: String)(implicit headerCarrier: HeaderCarrier): Future[HttpResponse] =
50+
//todo should we make this strongly typed and return a CardPaymentResult or Option[CardPaymentResult]?
51+
def authAndSettle(transactionReference: String)(implicit headerCarrier: HeaderCarrier): Future[HttpResponse] =
5052
httpClientV2
51-
.post(authAndSettleUrl(transactionNumber))
53+
.post(authAndSettleUrl(transactionReference))
5254
.execute[HttpResponse]
5355
}

app/uk/gov/hmrc/cardpaymentfrontend/controllers/PaymentStatusController.scala

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@ package uk.gov.hmrc.cardpaymentfrontend.controllers
1919
import play.api.mvc.{Action, AnyContent, MessagesControllerComponents, Result}
2020
import uk.gov.hmrc.cardpaymentfrontend.actions.Actions
2121
import uk.gov.hmrc.cardpaymentfrontend.config.AppConfig
22+
import uk.gov.hmrc.cardpaymentfrontend.models.cardpayment.CardPaymentFinishPaymentResponses
2223
import uk.gov.hmrc.cardpaymentfrontend.requests.RequestSupport
2324
import uk.gov.hmrc.cardpaymentfrontend.services.CardPaymentService
2425
import uk.gov.hmrc.cardpaymentfrontend.views.html.iframe.{IframeContainerPage, RedirectToParentPage}
25-
import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse}
26+
import uk.gov.hmrc.http.HeaderCarrier
2627
import uk.gov.hmrc.play.bootstrap.binders.RedirectUrl.idFunctor
2728
import uk.gov.hmrc.play.bootstrap.binders.RedirectUrlPolicy.Id
2829
import uk.gov.hmrc.play.bootstrap.binders.{AbsoluteWithHostnameFromAllowlist, RedirectUrl, RedirectUrlPolicy}
2930
import uk.gov.hmrc.play.bootstrap.frontend.controller.FrontendController
3031

3132
import javax.inject.{Inject, Singleton}
32-
import scala.concurrent.{ExecutionContext, Future}
33+
import scala.concurrent.ExecutionContext
3334

3435
@Singleton()
3536
class PaymentStatusController @Inject() (
@@ -52,36 +53,34 @@ class PaymentStatusController @Inject() (
5253
.getEither[Id](redirectUrlPolicy)
5354
.fold[Result](
5455
_ => BadRequest("Bad url provided that doesn't match the redirect policy. Check allow list if this is not expected."),
55-
safeUrl => Ok(iframeContainer(safeUrl.url))
56+
safeRedirectUrlOnAllowList => Ok(iframeContainer(safeRedirectUrlOnAllowList.url))
5657
)
5758
}
5859

59-
def returnToHmrc(transactionReference: String): Action[AnyContent] = actions.default { implicit request =>
60-
Ok(redirectToParent(transactionReference))
60+
def returnToHmrc(): Action[AnyContent] = actions.default { implicit request =>
61+
Ok(redirectToParent())
6162
}
6263

6364
//todo append something to the return url so we can extract/work out the session/journey - are we allowed to do this or do we use session?
64-
def paymentStatus(traceId: String): Action[AnyContent] = actions.journeyAction.async { implicit journeyRequest =>
65+
def paymentStatus(): Action[AnyContent] = actions.journeyAction.async { implicit journeyRequest =>
66+
6567
implicit val hc: HeaderCarrier = requestSupport.hc
6668
val transactionRefFromJourney: Option[String] = journeyRequest.journey.order.map(_.transactionReference.value)
67-
for {
68-
paymentStatus <- cardPaymentService.checkPaymentStatus(transactionRefFromJourney.getOrElse(throw new RuntimeException("Could not find transaction ref, pay-api probably didn't update.")))
69-
authAndCaptureResult <- maybeAuthAndSettleResult(transactionRefFromJourney, paymentStatus.value)
70-
} yield Ok(
71-
s"""We're back from the iframe!\n""" +
72-
s"""traceId: $traceId\n""" +
73-
s"""we now need to update the journey in pay-api with the completed payment info\n""" +
74-
s"""CheckPaymentStatus response:\n${paymentStatus.value.toString}\n\n""" +
75-
s"""authAndSettle response:\n${authAndCaptureResult.body}\n\n"""
76-
)
77-
}
7869

79-
//todo in future, lets check the result json and redirect accordingly. (i.e. if it's failed etc)
80-
private def maybeAuthAndSettleResult(transactionRefFromJourney: Option[String], shouldAuthAndSettle: Boolean)(implicit headerCarrier: HeaderCarrier): Future[HttpResponse] = {
81-
if (shouldAuthAndSettle) {
82-
cardPaymentService.authAndSettle(transactionRefFromJourney.getOrElse(throw new RuntimeException("Could not find transaction ref, therefore we can't auth and settle.")))
83-
} else {
84-
Future.successful(HttpResponse.apply(500, "Cannot auth and capture when status is not acceptable. We should redirect accordingly."))
70+
val maybeCardPaymentResultF = for {
71+
authAndCaptureResult <- cardPaymentService.finishPayment(
72+
transactionRefFromJourney.getOrElse(throw new RuntimeException("Could not find transaction ref, therefore we can't auth and settle.")),
73+
journeyRequest.journeyId.value
74+
)
75+
} yield authAndCaptureResult
76+
77+
maybeCardPaymentResultF.map {
78+
case Some(cardPaymentResult) => cardPaymentResult.cardPaymentResult match {
79+
case CardPaymentFinishPaymentResponses.Successful => Redirect(routes.PaymentCompleteController.renderPage)
80+
case CardPaymentFinishPaymentResponses.Failed => Redirect(routes.PaymentFailedController.renderPage0) //todo we haven't built this page preoprly yet
81+
case CardPaymentFinishPaymentResponses.Cancelled => Redirect(routes.PaymentCancelledController.renderPage)
82+
}
83+
case None => InternalServerError
8584
}
8685
}
8786

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright 2025 HM Revenue & Customs
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package uk.gov.hmrc.cardpaymentfrontend.models.cardpayment
18+
19+
import play.api.libs.json._
20+
import uk.gov.hmrc.cardpaymentfrontend.models.cardpayment.CardPaymentFinishPaymentResponses.CardPaymentFinishPaymentResponse
21+
import uk.gov.hmrc.cardpaymentfrontend.models.payapi.{FailWebPaymentRequest, FinishedWebPaymentRequest, SucceedWebPaymentRequest}
22+
import uk.gov.hmrc.cardpaymentfrontend.util.SafeEquals.EqualsOps
23+
24+
import java.time.LocalDateTime
25+
26+
object CardPaymentFinishPaymentResponses {
27+
28+
implicit val format: Format[CardPaymentFinishPaymentResponse] = {
29+
val reads: Reads[CardPaymentFinishPaymentResponse] = Reads {
30+
case JsString(s) if s === "Successful" => JsSuccess(Successful)
31+
case JsString(s) if s === "Failed" => JsSuccess(Failed)
32+
case JsString(s) if s === "Cancelled" => JsSuccess(Cancelled)
33+
case _ => JsError("couldn't parse status as CardPaymentFinishPaymentResponse")
34+
}
35+
val writes: Writes[CardPaymentFinishPaymentResponse] = Writes(status => JsString(status.toString))
36+
37+
Format(reads, writes)
38+
}
39+
40+
sealed trait CardPaymentFinishPaymentResponse
41+
42+
case object Successful extends CardPaymentFinishPaymentResponse
43+
44+
case object Failed extends CardPaymentFinishPaymentResponse
45+
46+
case object Cancelled extends CardPaymentFinishPaymentResponse
47+
48+
}
49+
50+
final case class AdditionalPaymentInfo(cardCategory: Option[String], commissionInPence: Option[Long], transactionTime: Option[LocalDateTime])
51+
52+
object AdditionalPaymentInfo {
53+
@SuppressWarnings(Array("org.wartremover.warts.Any"))
54+
implicit val format: Format[AdditionalPaymentInfo] = Json.format[AdditionalPaymentInfo]
55+
}
56+
57+
final case class CardPaymentResult(cardPaymentResult: CardPaymentFinishPaymentResponse, additionalPaymentInfo: AdditionalPaymentInfo) {
58+
59+
//todo this should probably live somewhere else? also we need to write test for it
60+
def intoUpdateWebPaymentRequest: Option[FinishedWebPaymentRequest] = this.cardPaymentResult match {
61+
case CardPaymentFinishPaymentResponses.Successful =>
62+
Some(SucceedWebPaymentRequest(
63+
additionalPaymentInfo.cardCategory.getOrElse("debit"),
64+
additionalPaymentInfo.commissionInPence,
65+
additionalPaymentInfo.transactionTime.getOrElse(LocalDateTime.now()),
66+
))
67+
case CardPaymentFinishPaymentResponses.Failed =>
68+
Some(FailWebPaymentRequest(
69+
additionalPaymentInfo.transactionTime.getOrElse(LocalDateTime.now()),
70+
additionalPaymentInfo.cardCategory.getOrElse("debit") //todo check if can this be anything?
71+
))
72+
case CardPaymentFinishPaymentResponses.Cancelled => None
73+
}
74+
}
75+
76+
object CardPaymentResult {
77+
@SuppressWarnings(Array("org.wartremover.warts.Any"))
78+
implicit val format: Format[CardPaymentResult] = Json.format[CardPaymentResult]
79+
}

app/uk/gov/hmrc/cardpaymentfrontend/models/payapi/FailWebPaymentRequest.scala

Lines changed: 0 additions & 31 deletions
This file was deleted.

app/uk/gov/hmrc/cardpaymentfrontend/models/payapi/SucceedWebPaymentRequest.scala renamed to app/uk/gov/hmrc/cardpaymentfrontend/models/payapi/FinishedWebPaymentRequest.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,23 @@ import play.api.libs.json.{Json, OFormat}
2020

2121
import java.time.LocalDateTime
2222

23+
sealed trait FinishedWebPaymentRequest
24+
25+
final case class FailWebPaymentRequest(
26+
transactionTime: LocalDateTime,
27+
cardCategory: String
28+
) extends FinishedWebPaymentRequest
29+
30+
object FailWebPaymentRequest {
31+
@SuppressWarnings(Array("org.wartremover.warts.Any"))
32+
implicit val format: OFormat[FailWebPaymentRequest] = Json.format
33+
}
34+
2335
final case class SucceedWebPaymentRequest(
2436
cardCategory: String,
2537
commissionInPence: Option[Long],
2638
transactionTime: LocalDateTime
27-
)
39+
) extends FinishedWebPaymentRequest
2840

2941
object SucceedWebPaymentRequest {
3042
@SuppressWarnings(Array("org.wartremover.warts.Any"))

app/uk/gov/hmrc/cardpaymentfrontend/services/CardPaymentService.scala

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import play.api.Logging
2121
import play.api.libs.json.JsBoolean
2222
import play.api.mvc.RequestHeader
2323
import uk.gov.hmrc.cardpaymentfrontend.connectors.{CardPaymentConnector, PayApiConnector}
24+
import uk.gov.hmrc.cardpaymentfrontend.models.cardpayment.{CardPaymentInitiatePaymentRequest, CardPaymentInitiatePaymentResponse, CardPaymentResult}
25+
import uk.gov.hmrc.cardpaymentfrontend.models.payapi.{BeginWebPaymentRequest, FailWebPaymentRequest, FinishedWebPaymentRequest, SucceedWebPaymentRequest}
2426
import uk.gov.hmrc.cardpaymentfrontend.models.{Address, EmailAddress}
25-
import uk.gov.hmrc.cardpaymentfrontend.models.cardpayment.{CardPaymentInitiatePaymentRequest, CardPaymentInitiatePaymentResponse}
26-
import uk.gov.hmrc.cardpaymentfrontend.models.payapi.BeginWebPaymentRequest
27-
import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse}
27+
import uk.gov.hmrc.http.HeaderCarrier
2828

2929
import javax.inject.{Inject, Singleton}
3030
import scala.concurrent.{ExecutionContext, Future}
@@ -38,7 +38,8 @@ class CardPaymentService @Inject() (cardPaymentConnector: CardPaymentConnector,
3838
maybeEmailFromSession: Option[EmailAddress]
3939
)(implicit headerCarrier: HeaderCarrier, requestHeader: RequestHeader): Future[CardPaymentInitiatePaymentResponse] = {
4040

41-
val urlToComeBackFromAfterIframe: String = uk.gov.hmrc.cardpaymentfrontend.controllers.routes.PaymentStatusController.returnToHmrc(journey.traceId.value).absoluteURL()(requestHeader)
41+
//todo move this to a val outside the function, then we can test it too
42+
val urlToComeBackFromAfterIframe: String = uk.gov.hmrc.cardpaymentfrontend.controllers.routes.PaymentStatusController.returnToHmrc().absoluteURL()(requestHeader)
4243

4344
val cardPaymentInitiatePaymentRequest: CardPaymentInitiatePaymentRequest = CardPaymentInitiatePaymentRequest(
4445
redirectUrl = urlToComeBackFromAfterIframe,
@@ -60,9 +61,17 @@ class CardPaymentService @Inject() (cardPaymentConnector: CardPaymentConnector,
6061
cardPaymentConnector.checkPaymentStatus(transactionReference)
6162
}
6263

63-
def authAndSettle(transactionReference: String)(implicit headerCarrier: HeaderCarrier): Future[HttpResponse] = {
64+
def finishPayment(transactionReference: String, journeyId: String)(implicit headerCarrier: HeaderCarrier): Future[Option[CardPaymentResult]] = {
6465
logger.info("TransactionReference: " + transactionReference) //todo take me out before go live
65-
cardPaymentConnector.authAndSettle(transactionReference)
66+
for {
67+
result <- cardPaymentConnector.authAndSettle(transactionReference)
68+
cardPaymentResult = result.json.asOpt[CardPaymentResult]
69+
maybeWebPaymentRequest: Option[FinishedWebPaymentRequest] = cardPaymentResult.flatMap(_.intoUpdateWebPaymentRequest)
70+
_ <- maybeWebPaymentRequest.fold(payApiConnector.JourneyUpdates.updateCancelWebPayment(journeyId)) {
71+
case r: FailWebPaymentRequest => payApiConnector.JourneyUpdates.updateFailWebPayment(journeyId, r)
72+
case r: SucceedWebPaymentRequest => payApiConnector.JourneyUpdates.updateSucceedWebPayment(journeyId, r)
73+
}
74+
} yield cardPaymentResult
6675
}
6776

6877
}

app/uk/gov/hmrc/cardpaymentfrontend/views/Layout.scala.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
pageTitle: Option[String] = None,
3131
showBackLink: Boolean = true,
3232
backLinkOverride: Option[BackLink] = None,
33+
welshSupported: Boolean = true,
3334
additionalScripts: Option[Html] = None
3435
)(contentBlock: Html)(implicit request: RequestHeader, messages: Messages)
3536

@@ -49,7 +50,7 @@
4950
additionalScriptsBlock = Some(scripts)
5051
),
5152
pageTitle = pageTitle,
52-
isWelshTranslationAvailable = true,
53+
isWelshTranslationAvailable = welshSupported,
5354
backLink = {
5455
if (showBackLink) {
5556
if (backLinkOverride.isDefined) backLinkOverride else Some(BackLink.mimicsBrowserBackButtonViaJavaScript)

app/uk/gov/hmrc/cardpaymentfrontend/views/iframe/IframeContainerPage.scala.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
@(iframeUrl: String)(implicit request: RequestHeader, messages: Messages)
2323
@* TODO: Jake, update the title *@
24-
@layout(pageTitle = Some("IFrame holder page")) {
24+
@layout(pageTitle = Some("IFrame holder page"), welshSupported = false) {
2525
@Html(s"""<link rel="stylesheet" media="all" type="text/css" href="${controllers.routes.Assets.versioned("stylesheets/barclaycard-iframe.css").toString}">""")
2626
<h1 class="govuk-heading-xl">IFrame holder page</h1>
2727

app/uk/gov/hmrc/cardpaymentfrontend/views/iframe/RedirectToParentPage.scala.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
@this(layout: Layout)
2121

22-
@(transactionReference: String)(implicit request: RequestHeader, messages: Messages)
22+
@()(implicit request: RequestHeader, messages: Messages)
2323

2424
@scripts = {<script src="@{controllers.routes.Assets.versioned("javascripts/escape-iframe.js")}" @{CSPNonce.attr}></script>}
2525

@@ -28,5 +28,5 @@
2828
<a rel="noreferrer"
2929
id="returnControlLink"
3030
target="_parent"
31-
href="@{uk.gov.hmrc.cardpaymentfrontend.controllers.routes.PaymentStatusController.paymentStatus(transactionReference)}"></a>
31+
href="@{uk.gov.hmrc.cardpaymentfrontend.controllers.routes.PaymentStatusController.paymentStatus()}"></a>
3232
}

conf/app.routes

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ POST /check-your-details uk.gov.hmrc.cardpaymentfrontend
2222
GET /show-iframe uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentStatusController.showIframe(iframeUrl: RedirectUrl)
2323
#this is the one that they come back to from iframe, for some reason it's an empty bodied post. It essentially renders some html which clicks a link that routes to /return
2424
+nocsrf
25-
POST /return-to-hmrc/:traceId uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentStatusController.returnToHmrc(traceId: String)
26-
GET /payment-status/:traceId uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentStatusController.paymentStatus(traceId: String)
25+
POST /return-to-hmrc uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentStatusController.returnToHmrc()
26+
GET /payment-status uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentStatusController.paymentStatus()
2727

2828
GET /payment-complete uk.gov.hmrc.cardpaymentfrontend.controllers.PaymentCompleteController.renderPage
2929

conf/application.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,4 @@ urls {
9393
}
9494

9595
# used to stop malicious urls being inserted
96-
iframeHostNameAllowList = [ "localhost", "pp.eshapay.net" ] #todo: we need to add the prod url to this array.
96+
iframeHostNameAllowList = [ "localhost", "pp.eshapay.net" ] #todo: we need to add the prod url to this array. (do qa too)

test/uk/gov/hmrc/cardpaymentfrontend/actions/ActionRefinerSpec.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ class ActionRefinerSpec extends ItSpec {
3737
}
3838

3939
"should return a right with JourneyRequest when pay-api returns a journey" in {
40-
PayApiStub.stubForFindBySessionId2xx(TestJourneys.PfSa.testPfSaJourneyCreated)
40+
PayApiStub.stubForFindBySessionId2xx(TestJourneys.PfSa.journeyBeforeBeginWebPayment)
4141
val result: Either[Result, JourneyRequest[AnyContent]] = systemUnderTest.refine(fakeRequest).futureValue
4242
result.isRight shouldBe true
43-
result.map(_.journey) shouldBe Right(TestJourneys.PfSa.testPfSaJourneyCreated)
43+
result.map(_.journey) shouldBe Right(TestJourneys.PfSa.journeyBeforeBeginWebPayment)
4444
}
4545
}
4646

@@ -51,15 +51,15 @@ class ActionRefinerSpec extends ItSpec {
5151
def fakeRequest(journey: Journey[JourneySpecificData]): JourneyRequest[AnyContent] = new JourneyRequest(journey, FakeRequest())
5252

5353
"should return a left when journey in JourneyRequest is not in a 'terminal state' (i.e. finished)" in {
54-
val request = fakeRequest(TestJourneys.PfSa.testPfSaJourneyCreated)
54+
val request = fakeRequest(TestJourneys.PfSa.journeyBeforeBeginWebPayment)
5555
systemUnderTest.refine(request).futureValue shouldBe Left(Results.NotFound("Journey not in valid state"))
5656
}
5757

5858
"should return a right when journey in JourneyRequest is in a 'terminal state' (i.e. finished)" in {
59-
val request = fakeRequest(TestJourneys.PfSa.testPfSaJourneySuccessDebit)
59+
val request = fakeRequest(TestJourneys.PfSa.journeyAfterSucceedDebitWebPayment)
6060
val result: Either[Result, JourneyRequest[AnyContent]] = systemUnderTest.refine(request).futureValue
6161
result.isRight shouldBe true
62-
result.map(_.journey) shouldBe Right(TestJourneys.PfSa.testPfSaJourneySuccessDebit)
62+
result.map(_.journey) shouldBe Right(TestJourneys.PfSa.journeyAfterSucceedDebitWebPayment)
6363
}
6464
}
6565

0 commit comments

Comments
 (0)