-
Notifications
You must be signed in to change notification settings - Fork 5
/
ContributionStepsTest.scala
104 lines (84 loc) · 3.82 KB
/
ContributionStepsTest.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.gu.newproduct.api.addsubscription
import java.time.LocalDate
import com.gu.i18n.Currency
import com.gu.newproduct.TestData
import com.gu.newproduct.api.addsubscription.email.contributions.SendConfirmationEmailContributions.ContributionsEmailData
import com.gu.newproduct.api.addsubscription.validation.contribution.ContributionValidations.ValidatableFields
import com.gu.newproduct.api.addsubscription.validation.{Failed, Passed}
import com.gu.newproduct.api.addsubscription.zuora.CreateSubscription
import com.gu.newproduct.api.addsubscription.zuora.CreateSubscription.{ChargeOverride, SubscriptionName, ZuoraCreateSubRequest}
import com.gu.newproduct.api.addsubscription.zuora.GetAccount.SfContactId
import com.gu.newproduct.api.productcatalog.{AmountMinorUnits, PlanId}
import com.gu.newproduct.api.productcatalog.ZuoraIds.{PlanAndCharge, ProductRatePlanChargeId, ProductRatePlanId}
import com.gu.test.JsonMatchers.JsonMatcher
import com.gu.util.apigateway.ApiGatewayRequest
import com.gu.util.reader.AsyncTypes._
import com.gu.util.reader.Types.ApiGatewayOp.ContinueProcessing
import com.gu.util.resthttp.Types
import com.gu.util.resthttp.Types.ClientSuccess
import org.scalatest.{FlatSpec, Matchers}
import play.api.libs.json._
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.language.postfixOps
class ContributionStepsTest extends FlatSpec with Matchers {
case class ExpectedOut(subscriptionNumber: String)
it should "run end to end with fakes" in {
val planAndCharge = PlanAndCharge(
ProductRatePlanId("ratePlanId"),
ProductRatePlanChargeId("ratePlanChargeId")
)
def getPlanAndCharge(planId: PlanId) = Some(planAndCharge)
val expectedIn = ZuoraCreateSubRequest(
planAndCharge.productRatePlanId,
ZuoraAccountId("acccc"),
Some(ChargeOverride(
AmountMinorUnits(123),
planAndCharge.productRatePlanChargeId
)),
LocalDate.of(2018, 7, 28),
CaseId("case"),
AcquisitionSource("CSR"),
CreatedByCSR("bob")
)
def fakeCreate(in: CreateSubscription.ZuoraCreateSubRequest): Types.ClientFailableOp[CreateSubscription.SubscriptionName] = {
in shouldBe expectedIn
ClientSuccess(SubscriptionName("well done"))
}
def fakeSendEmails(sfContactId: Option[SfContactId], contributionsEmailData: ContributionsEmailData) = {
ContinueProcessing(()).toAsync
}
def fakeValidateRequest(fields: ValidatableFields, currency: Currency) = {
fields.amountMinorUnits.map(Passed(_)).getOrElse(Failed("missing amount"))
}
def fakeGetCustomerData(zuoraAccountId: ZuoraAccountId) = ContinueProcessing(TestData.contributionCustomerData)
val requestInput = JsObject(Map(
"acquisitionCase" -> JsString("case"),
"amountMinorUnits" -> JsNumber(123),
"startDate" -> JsString("2018-07-18"),
"zuoraAccountId" -> JsString("acccc"),
"acquisitionSource" -> JsString("CSR"),
"createdByCSR" -> JsString("bob"),
"planId" -> JsString("monthly_contribution")
))
implicit val format: OFormat[ExpectedOut] = Json.format[ExpectedOut]
val expectedOutput = ExpectedOut("well done")
val fakeAddContributionSteps = Steps.addContributionSteps(
getPlanAndCharge,
fakeGetCustomerData,
fakeValidateRequest,
fakeCreate,
fakeSendEmails
) _
val dummyVoucherSteps = (req: AddSubscriptionRequest) => {
fail("unexpected execution of voucher steps while processing contribution request!")
}
val futureActual = Steps.handleRequest(
addContribution = fakeAddContributionSteps,
addVoucher = dummyVoucherSteps
)(ApiGatewayRequest(None, Some(Json.stringify(requestInput)), None, None))
val actual = Await.result(futureActual, 30 seconds)
actual.statusCode should be("200")
actual.body jsonMatchesFormat expectedOutput
}
}