-
Notifications
You must be signed in to change notification settings - Fork 5
/
ErrorHandlingSpec.scala
139 lines (116 loc) · 5.95 KB
/
ErrorHandlingSpec.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.gu.holidaystopprocessor
import java.time.LocalDate
import cats.implicits._
import com.gu.holiday_stops.{HolidayCreditUpdate, OverallFailure, SalesforceHolidayWriteError, Subscription, ZuoraHolidayWriteError}
import com.gu.holidaystopprocessor.Fixtures._
import com.gu.salesforce.holiday_stops.SalesforceHolidayStopRequestsDetail.{HolidayStopRequestsDetail, ProductName, SubscriptionName}
import org.scalatest._
/**
* Make sure short-circuiting does not happen.
*/
class ErrorHandlingSpec extends FlatSpec with Matchers with OptionValues {
val getHolidayStopRequestsFromSalesforce: ProductName => Either[OverallFailure, List[HolidayStopRequestsDetail]] = {
_ =>
Right(List(
mkHolidayStopRequestDetails(mkHolidayStopRequest("R1", LocalDate.of(2019, 8, 2), SubscriptionName("A-S1")), "C1"),
mkHolidayStopRequestDetails(mkHolidayStopRequest("R2", LocalDate.of(2019, 9, 1), SubscriptionName("A-S2")), "C3"),
mkHolidayStopRequestDetails(mkHolidayStopRequest("R3", LocalDate.of(2019, 8, 9), SubscriptionName("A-S3")), "C4")
))
}
val subscription: Subscription = mkSubscriptionWithHolidayStops()
val updateSubscription: (Subscription, HolidayCreditUpdate) => Either[ZuoraHolidayWriteError, Unit] = {
case _ => Right(())
}
"Error handling" should "not short-circuit if some writes to Zuora fail (but others succeed), and Salesforce write succeeds" in {
val getSubscription: SubscriptionName => Either[ZuoraHolidayWriteError, Subscription] = {
case subName if subName.value == "A-S1" => Right(subscription)
case subName if subName.value == "A-S2" => Left(ZuoraHolidayWriteError("zuora boom")) // NOTE: this line is key to the test
case subName if subName.value == "A-S3" => Right(subscription)
}
val writeHolidayStopsToSalesforce: List[HolidayStopResponse] => Either[SalesforceHolidayWriteError, Unit] = {
case _ => Right(())
}
val result = HolidayStopProcess.processHolidayStops(
config.holidayCreditProduct,
config.guardianWeeklyProductRatePlanIds,
getHolidayStopRequestsFromSalesforce,
getSubscription,
updateSubscription,
writeHolidayStopsToSalesforce
)
val (failedZuoraResponses, successfulZuoraResponses) = result.holidayStopResults.separate
failedZuoraResponses.size shouldBe 1
successfulZuoraResponses.size shouldBe 2
(failedZuoraResponses.size + successfulZuoraResponses.size) shouldBe 3
result.overallFailure.value shouldBe (OverallFailure("zuora boom"))
}
it should "not short-circuit if all Zuora writes succeeds, and Salesforce write fails" in {
val getSubscription: SubscriptionName => Either[ZuoraHolidayWriteError, Subscription] = {
case subName if subName.value == "A-S1" => Right(subscription)
case subName if subName.value == "A-S2" => Right(subscription)
case subName if subName.value == "A-S3" => Right(subscription)
}
val writeHolidayStopsToSalesforce: List[HolidayStopResponse] => Either[SalesforceHolidayWriteError, Unit] = {
case _ => Left(SalesforceHolidayWriteError("salesforce boom")) // NOTE: this line is key to the test
}
val result = HolidayStopProcess.processHolidayStops(
config.holidayCreditProduct,
config.guardianWeeklyProductRatePlanIds,
getHolidayStopRequestsFromSalesforce,
getSubscription,
updateSubscription,
writeHolidayStopsToSalesforce
)
val (failedZuoraResponses, successfulZuoraResponses) = result.holidayStopResults.separate
failedZuoraResponses.size shouldBe 0
successfulZuoraResponses.size shouldBe 3
(failedZuoraResponses.size + successfulZuoraResponses.size) shouldBe 3
result.overallFailure.value shouldBe (OverallFailure("salesforce boom"))
}
it should "collect all Zuora failures" in {
val getSubscription: SubscriptionName => Either[ZuoraHolidayWriteError, Subscription] = {
case subName if subName.value == "A-S1" => Left(ZuoraHolidayWriteError("zuora boom 1"))
case subName if subName.value == "A-S2" => Left(ZuoraHolidayWriteError("zuora boom 2"))
case subName if subName.value == "A-S3" => Left(ZuoraHolidayWriteError("zuora boom 3"))
}
val writeHolidayStopsToSalesforce: List[HolidayStopResponse] => Either[SalesforceHolidayWriteError, Unit] = {
case _ => Right(())
}
val result = HolidayStopProcess.processHolidayStops(
config.holidayCreditProduct,
config.guardianWeeklyProductRatePlanIds,
getHolidayStopRequestsFromSalesforce,
getSubscription,
updateSubscription,
writeHolidayStopsToSalesforce
)
val (failedZuoraResponses, successfulZuoraResponses) = result.holidayStopResults.separate
failedZuoraResponses.size shouldBe 3
successfulZuoraResponses.size shouldBe 0
(failedZuoraResponses.size + successfulZuoraResponses.size) shouldBe 3
result.overallFailure.value shouldBe (OverallFailure("zuora boom 1"))
}
it should "be None if all Zuora writes succeed and Salesforce write succeeds" in {
val getSubscription: SubscriptionName => Either[ZuoraHolidayWriteError, Subscription] = {
case subName if subName.value == "A-S1" => Right(subscription)
case subName if subName.value == "A-S2" => Right(subscription)
case subName if subName.value == "A-S3" => Right(subscription)
}
val writeHolidayStopsToSalesforce: List[HolidayStopResponse] => Either[SalesforceHolidayWriteError, Unit] = {
case _ => Right(())
}
val result = HolidayStopProcess.processHolidayStops(
config.holidayCreditProduct,
config.guardianWeeklyProductRatePlanIds,
getHolidayStopRequestsFromSalesforce,
getSubscription,
updateSubscription,
writeHolidayStopsToSalesforce
)
val (failedZuoraResponses, successfulZuoraResponses) = result.holidayStopResults.separate
failedZuoraResponses.size shouldBe 0
successfulZuoraResponses.size shouldBe 3
(failedZuoraResponses.size + successfulZuoraResponses.size) shouldBe 3
result.overallFailure should be(None)
}
}