Skip to content

Commit aefe5b0

Browse files
authored
[DL-16937] retrieveFinancialData: Accept IF OK or HIP CREATED responses from penalties backend (#1051)
1 parent e2b9f14 commit aefe5b0

3 files changed

Lines changed: 123 additions & 113 deletions

File tree

app/v1/connectors/httpparsers/FinancialDataHttpParser.scala

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
package v1.connectors.httpparsers
1818

1919
import play.api.http.Status._
20-
import play.api.libs.json.{JsError, JsSuccess, JsValue, Json}
21-
import uk.gov.hmrc.http.{HttpReads, HttpResponse}
20+
import play.api.libs.json.{ JsError, JsSuccess, JsValue, Json }
21+
import uk.gov.hmrc.http.{ HttpReads, HttpResponse }
2222
import utils.Logging
2323
import v1.connectors.Outcome
2424
import v1.models.errors._
2525
import v1.models.outcomes.ResponseWrapper
26-
import v1.models.response.financialData.{FinancialDataErrors, FinancialDataResponse}
26+
import v1.models.response.financialData.{ FinancialDataErrors, FinancialDataResponse }
2727

2828
object FinancialDataHttpParser extends Logging {
2929

@@ -66,7 +66,7 @@ object FinancialDataHttpParser extends Logging {
6666
case ("INVALID_DATE_RANGE") => DownstreamError
6767
case ("SERVER_ERROR") => DownstreamError
6868
case ("SERVICE_UNAVAILABLE") => DownstreamError
69-
case _ => MtdError(error.code, error.reason)
69+
case _ => MtdError(error.code, error.reason)
7070
}
7171
}
7272

@@ -85,12 +85,13 @@ object FinancialDataHttpParser extends Logging {
8585
def read(method: String, url: String, response: HttpResponse): Outcome[FinancialDataResponse] = {
8686
val responseCorrelationId = retrieveCorrelationId(response)
8787
response.status match {
88-
case OK => response.json.validate[FinancialDataResponse] match {
89-
case JsSuccess(model, _) => Right(ResponseWrapper(responseCorrelationId, model))
90-
case JsError(errors) =>
91-
errorConnectorLog(s"[FinancialDataResponseReads][read] invalid JSON errors: $errors")(response)
92-
Left(ErrorWrapper(responseCorrelationId, InvalidJson))
93-
}
88+
case OK | CREATED =>
89+
response.json.validate[FinancialDataResponse] match {
90+
case JsSuccess(model, _) => Right(ResponseWrapper(responseCorrelationId, model))
91+
case JsError(errors) =>
92+
errorConnectorLog(s"[FinancialDataResponseReads][read] invalid JSON errors: $errors")(response)
93+
Left(ErrorWrapper(responseCorrelationId, InvalidJson))
94+
}
9495
case status =>
9596
val mtdErrors = errorHelper(response.json)
9697
errorConnectorLog(s"[FinancialDataHttpParser][read] status: ${status} with Error ${mtdErrors}")(response)

func/test/v1/endpoints/FinancialDataControllerISpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ class FinancialDataControllerISpec extends IntegrationBaseSpec {
7474

7575
"a valid request is made" must {
7676

77-
"return 200 and penalties data" in new Test {
77+
"return 201 and penalties data" in new Test {
7878

7979
override def setupStubs(): StubMapping = {
8080
AuditStub.audit()
8181
AuthStub.authorised()
82-
PenaltiesStub.onSuccess(PenaltiesStub.GET, FinancialDataConstants.financialDataUrl(), OK, FinancialDataConstants.testDownstreamFinancialDetails)
82+
PenaltiesStub.onSuccess(PenaltiesStub.GET, FinancialDataConstants.financialDataUrl(), CREATED, FinancialDataConstants.testDownstreamFinancialDetails)
8383
}
8484

8585
val response: WSResponse = await(request.get())

test/v1/connectors/httpparsers/FinancialDataHttpParserSpec.scala

Lines changed: 110 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package v1.connectors.httpparsers
1818

1919
import play.api.http.Status
20-
import play.api.http.Status._
21-
import play.api.libs.json.{JsValue, Json}
20+
import play.api.http.Status.{ CREATED, OK }
21+
import play.api.libs.json.{ JsValue, Json }
2222
import support.UnitSpec
2323
import uk.gov.hmrc.http.HttpResponse
2424
import v1.connectors.httpparsers.FinancialDataHttpParser.FinancialDataHttpReads
25-
import v1.constants.{FinancialDataConstants, PenaltiesConstants}
25+
import v1.constants.{ FinancialDataConstants, PenaltiesConstants }
2626
import v1.models.errors._
2727

2828
class FinancialDataHttpParserSpec extends UnitSpec {
@@ -31,83 +31,92 @@ class FinancialDataHttpParserSpec extends UnitSpec {
3131

3232
"FinancialDataHttpReads" when {
3333

34-
"response is OK (200)" when {
34+
Seq(OK, CREATED).foreach { successResponse =>
35+
s"response is a $successResponse" when {
3536

36-
"json is valid" must {
37+
"json is valid" must {
3738

38-
"return Right(FinancialDataResponse) min" in {
39+
"return Right(FinancialDataResponse) min" in {
3940

40-
val result = FinancialDataHttpReads.read("", "",
41-
HttpResponse(
42-
status = Status.OK,
43-
json = FinancialDataConstants.testDownstreamFinancialDetails,
44-
headers = Map(
45-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
41+
val result = FinancialDataHttpReads.read(
42+
"",
43+
"",
44+
HttpResponse(
45+
status = successResponse,
46+
json = FinancialDataConstants.testDownstreamFinancialDetails,
47+
headers = Map(
48+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
49+
)
4650
)
4751
)
48-
)
4952

50-
result shouldBe Right(FinancialDataConstants.wrappedFinancialDataResponse())
51-
}
53+
result shouldBe Right(FinancialDataConstants.wrappedFinancialDataResponse())
54+
}
5255

53-
"return Right(FinancialDataResponse) max" in {
56+
"return Right(FinancialDataResponse) max" in {
5457

55-
val result = FinancialDataHttpReads.read("", "",
56-
HttpResponse(
57-
status = Status.OK,
58-
json = FinancialDataConstants.testDownstreamFinancialDetails,
59-
headers = Map(
60-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
58+
val result = FinancialDataHttpReads.read(
59+
"",
60+
"",
61+
HttpResponse(
62+
status = successResponse,
63+
json = FinancialDataConstants.testDownstreamFinancialDetails,
64+
headers = Map(
65+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
66+
)
6167
)
6268
)
63-
)
6469

65-
result shouldBe Right(FinancialDataConstants.wrappedFinancialDataResponse(FinancialDataConstants.testFinancialDataResponse))
66-
}
70+
result shouldBe Right(FinancialDataConstants.wrappedFinancialDataResponse(FinancialDataConstants.testFinancialDataResponse))
71+
}
6772

68-
"return Right(FinancialDataResponse) No Document Details" in {
73+
"return Right(FinancialDataResponse) No Document Details" in {
6974

70-
val result = FinancialDataHttpReads.read("", "",
71-
HttpResponse(
72-
status = Status.OK,
73-
json = FinancialDataConstants.testDownstreamFinancialDetailsNoDocumentDetails,
74-
headers = Map(
75-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
75+
val result = FinancialDataHttpReads.read(
76+
"",
77+
"",
78+
HttpResponse(
79+
status = successResponse,
80+
json = FinancialDataConstants.testDownstreamFinancialDetailsNoDocumentDetails,
81+
headers = Map(
82+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
83+
)
7684
)
7785
)
78-
)
7986

80-
result shouldBe Right(FinancialDataConstants.wrappedFinancialDataResponse(FinancialDataConstants.testFinancialNoDocumentDetailsDataResponse))
87+
result shouldBe Right(
88+
FinancialDataConstants.wrappedFinancialDataResponse(FinancialDataConstants.testFinancialNoDocumentDetailsDataResponse))
89+
}
8190
}
82-
}
8391

84-
"json is invalid" must {
85-
86-
"return Left(InvalidJson)" in {
87-
88-
val jsonObject =
89-
Json.parse("""{
90-
| "getFinancialData": {
91-
| "financialDetails": {
92-
| "documentDetails": {
93-
| "test": "test"
94-
| }
95-
| }
96-
| }
97-
|}
98-
|""".stripMargin)
99-
100-
val result = FinancialDataHttpReads.read("", "",
101-
HttpResponse(
102-
status = Status.OK,
103-
json = jsonObject,
104-
headers = Map(
105-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
106-
)
107-
)
108-
)
109-
110-
result shouldBe Left(FinancialDataConstants.errorWrapper(InvalidJson))
92+
"json is invalid" must {
93+
94+
"return Left(InvalidJson)" in {
95+
96+
val jsonObject =
97+
Json.parse("""{
98+
| "getFinancialData": {
99+
| "financialDetails": {
100+
| "documentDetails": {
101+
| "test": "test"
102+
| }
103+
| }
104+
| }
105+
|}
106+
|""".stripMargin)
107+
108+
val result = FinancialDataHttpReads.read("",
109+
"",
110+
HttpResponse(
111+
status = successResponse,
112+
json = jsonObject,
113+
headers = Map(
114+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
115+
)
116+
))
117+
118+
result shouldBe Left(FinancialDataConstants.errorWrapper(InvalidJson))
119+
}
111120
}
112121
}
113122
}
@@ -116,8 +125,7 @@ class FinancialDataHttpParserSpec extends UnitSpec {
116125

117126
"return Left(InvalidVrn)" in {
118127

119-
val error = Json.parse(
120-
"""
128+
val error = Json.parse("""
121129
|{
122130
|"failures": [{
123131
|"code":"INVALID_IDNUMBER",
@@ -126,15 +134,15 @@ class FinancialDataHttpParserSpec extends UnitSpec {
126134
|}
127135
|""".stripMargin)
128136

129-
val result = FinancialDataHttpReads.read("", "",
130-
HttpResponse(
131-
status = Status.BAD_REQUEST,
132-
json = error,
133-
headers = Map(
134-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
135-
)
136-
)
137-
)
137+
val result = FinancialDataHttpReads.read("",
138+
"",
139+
HttpResponse(
140+
status = Status.BAD_REQUEST,
141+
json = error,
142+
headers = Map(
143+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
144+
)
145+
))
138146
result shouldBe Left(FinancialDataConstants.errorWrapper(MtdError("VRN_INVALID", "The provided VRN is invalid")))
139147
}
140148
}
@@ -143,8 +151,7 @@ class FinancialDataHttpParserSpec extends UnitSpec {
143151

144152
"return Left(VrnNotFound)" in {
145153

146-
val error = Json.parse(
147-
"""
154+
val error = Json.parse("""
148155
|{
149156
|"failures": [{
150157
|"code":"NO_DATA_FOUND",
@@ -153,15 +160,15 @@ class FinancialDataHttpParserSpec extends UnitSpec {
153160
|}
154161
|""".stripMargin)
155162

156-
val result = FinancialDataHttpReads.read("", "",
157-
HttpResponse(
158-
status = Status.NOT_FOUND,
159-
json = error,
160-
headers = Map(
161-
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
162-
)
163-
)
164-
)
163+
val result = FinancialDataHttpReads.read("",
164+
"",
165+
HttpResponse(
166+
status = Status.NOT_FOUND,
167+
json = error,
168+
headers = Map(
169+
"CorrelationId" -> Seq(FinancialDataConstants.correlationId)
170+
)
171+
))
165172
result shouldBe Left(FinancialDataConstants.errorWrapper(FinancialNotDataFound))
166173
}
167174
}
@@ -172,8 +179,7 @@ class FinancialDataHttpParserSpec extends UnitSpec {
172179

173180
val status = Status.INTERNAL_SERVER_ERROR
174181

175-
val error = Json.parse(
176-
"""
182+
val error = Json.parse("""
177183
|{
178184
|"failures": [{
179185
|"code":"INTERNAL_SERVICE_ERROR",
@@ -182,15 +188,15 @@ class FinancialDataHttpParserSpec extends UnitSpec {
182188
|}
183189
|""".stripMargin)
184190

185-
val result = FinancialDataHttpReads.read("", "",
186-
HttpResponse(
187-
status = status,
188-
json = error,
189-
headers = Map(
190-
"CorrelationId" -> Seq(PenaltiesConstants.correlationId)
191-
)
192-
)
193-
)
191+
val result = FinancialDataHttpReads.read("",
192+
"",
193+
HttpResponse(
194+
status = status,
195+
json = error,
196+
headers = Map(
197+
"CorrelationId" -> Seq(PenaltiesConstants.correlationId)
198+
)
199+
))
194200
result shouldBe Left(FinancialDataConstants.errorWrapper(MtdError("INTERNAL_SERVICE_ERROR", "Something went wrong")))
195201
}
196202
}
@@ -201,7 +207,7 @@ class FinancialDataHttpParserSpec extends UnitSpec {
201207
Json.parse(s"""
202208
|{
203209
| "failures": [{
204-
| "code":"${code}",
210+
| "code":"$code",
205211
| "reason":"Some reason"
206212
| }]
207213
| }
@@ -244,11 +250,14 @@ class FinancialDataHttpParserSpec extends UnitSpec {
244250

245251
"return multi errors when passed multiple errors bad " in {
246252
val result = FinancialDataHttpReads.errorHelper(multiJsonString())
247-
result shouldBe MtdError("INVALID_REQUEST", "Invalid request financial details",
248-
Some(Json.toJson(Seq(
249-
FinancialInvalidIdNumber,
250-
FinancialInvalidSearchItem
251-
))))
253+
result shouldBe MtdError("INVALID_REQUEST",
254+
"Invalid request financial details",
255+
Some(
256+
Json.toJson(
257+
Seq(
258+
FinancialInvalidIdNumber,
259+
FinancialInvalidSearchItem
260+
))))
252261
}
253262

254263
"return INTERNAL_SERVER_ERROR when passed multiple errors including one which maps to INTERNAL_SERVER_ERROR" in {

0 commit comments

Comments
 (0)