Skip to content

Commit

Permalink
Full API urls in annual statement links
Browse files Browse the repository at this point in the history
  • Loading branch information
jose-puente-digital-hmrc-gov-uk committed Dec 7, 2017
1 parent 5a0d79d commit 7d51b12
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import play.api.libs.json.Json
import play.api.mvc.{Action, EssentialAction}
import uk.gov.hmrc.auth.core.AuthConnector
import uk.gov.hmrc.domain.EmpRef
import uk.gov.hmrc.epayeapi.connectors.EpayeConnector
import uk.gov.hmrc.epayeapi.connectors.{EpayeApiConfig, EpayeConnector}
import uk.gov.hmrc.epayeapi.models.Formats._
import uk.gov.hmrc.epayeapi.models.TaxYear
import uk.gov.hmrc.epayeapi.models.in._
Expand All @@ -35,19 +35,20 @@ import scala.concurrent.ExecutionContext

@Singleton
case class GetAnnualStatementController @Inject() (
config: EpayeApiConfig,
authConnector: AuthConnector,
epayeConnector: EpayeConnector,
implicit val ec: ExecutionContext,
implicit val mat: Materializer
)
extends ApiController {

def getAnnualStatement(empRef: EmpRef, taxYear:TaxYear): EssentialAction =
def getAnnualStatement(empRef: EmpRef, taxYear: TaxYear): EssentialAction =
EmpRefAction(empRef) {
Action.async { request =>
epayeConnector.getAnnualStatement(empRef, taxYear, hc(request)).map {
case EpayeSuccess(epayeAnnualStatement) =>
Ok(Json.toJson(AnnualStatementJson(empRef, taxYear, epayeAnnualStatement)))
Ok(Json.toJson(AnnualStatementJson(config.apiBaseUrl, empRef, taxYear, epayeAnnualStatement)))
case EpayeJsonError(err) =>
Logger.error(s"Upstream returned invalid json: $err")
InternalServerError(Json.toJson(ApiErrorJson.InternalServerError))
Expand Down
29 changes: 12 additions & 17 deletions app/uk/gov/hmrc/epayeapi/models/out/AnnualStatementJson.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package uk.gov.hmrc.epayeapi.models.out

import org.joda.time.LocalDate
import uk.gov.hmrc.domain.EmpRef
import uk.gov.hmrc.epayeapi.models
import uk.gov.hmrc.epayeapi.models.in.{EpayeAnnualStatement, LineItem}
import uk.gov.hmrc.epayeapi.models.{TaxMonth, TaxYear}

Expand Down Expand Up @@ -95,18 +94,19 @@ case class MonthlyChargesJson(

object MonthlyChargesJson {

def from(lineItem: LineItem, empRef: EmpRef, taxYear: TaxYear): Option[MonthlyChargesJson] = {
def from(apiBaseUrl: String, lineItem: LineItem, empRef: EmpRef, taxYear: TaxYear): Option[MonthlyChargesJson] = {
for {
taxMonth <- lineItem.taxMonth
epayeTaxMonth <- lineItem.taxMonth
taxMonth = TaxMonth(taxYear, epayeTaxMonth.month)
} yield MonthlyChargesJson(
taxMonth = models.TaxMonth(taxYear, taxMonth.month),
taxMonth = taxMonth,
amount = lineItem.charges.debit,
clearedByCredits = lineItem.cleared.credit,
clearedByPayments = lineItem.cleared.payment,
balance = lineItem.balance.debit,
dueDate = lineItem.dueDate,
isSpecified = lineItem.isSpecified,
_links = SelfLink(Link(s"${AnnualStatementJson.baseUrlFor(empRef)}/statements/${taxYear.asString}/${taxMonth.month}"))
_links = SelfLink(Link.monthlyStatementLink(apiBaseUrl, empRef, taxYear, taxMonth))
)
}
}
Expand All @@ -131,25 +131,20 @@ case class AnnualStatementJson(
)

object AnnualStatementJson {
val baseUrl = "/organisations/paye"

def baseUrlFor(empRef: EmpRef): String =
s"$baseUrl/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}"

def apply(empRef: EmpRef, taxYear: TaxYear, epayeAnnualStatement: EpayeAnnualStatement): AnnualStatementJson =
def apply(apiBaseUrl: String, empRef: EmpRef, taxYear: TaxYear, epayeAnnualStatement: EpayeAnnualStatement): AnnualStatementJson =
AnnualStatementJson(
taxYear = taxYear,
_embedded = EmbeddedRtiChargesJson(
EarlierYearUpdateJson.extractFrom(epayeAnnualStatement.rti.lineItems),
epayeAnnualStatement.rti.lineItems.flatMap(MonthlyChargesJson.from(_, empRef, taxYear))
epayeAnnualStatement.rti.lineItems.flatMap(MonthlyChargesJson.from(apiBaseUrl, _, empRef, taxYear))
),
nonRtiCharges = epayeAnnualStatement.nonRti.lineItems.flatMap(NonRtiChargesJson.from(_, taxYear)),
_links = AnnualStatementLinksJson(
empRefs = Link(baseUrl),
statements = Link(s"${baseUrlFor(empRef)}/statements"),
self = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.asString}"),
next = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.next.asString}"),
previous = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.previous.asString}")
empRefs = Link.empRefsLink(apiBaseUrl),
statements = Link.statementsLink(apiBaseUrl, empRef),
self = Link.anualStatementLink(apiBaseUrl, empRef, taxYear),
next = Link.anualStatementLink(apiBaseUrl, empRef, taxYear.next),
previous = Link.anualStatementLink(apiBaseUrl, empRef, taxYear.previous)
)
)

Expand Down
20 changes: 10 additions & 10 deletions test/common/Fixtures.scala
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ object Fixtures {
|}
""".stripMargin

def expectedAnnualStatementJson(empRef: EmpRef): JsValue = Json.parse(
def expectedAnnualStatementJson(apiBaseUrl: String, empRef: EmpRef): JsValue = Json.parse(
s"""
|{
| "taxYear": {
Expand Down Expand Up @@ -197,7 +197,7 @@ object Fixtures {
| "isSpecified": false,
| "_links": {
| "self": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18/7"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18/7"
| }
| }
| },
Expand All @@ -215,31 +215,32 @@ object Fixtures {
| "isSpecified": true,
| "_links": {
| "self": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18/3"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18/3"
| }
| }
| }
| ]
| },
| "_links": {
| "empRefs": {
| "href": "/organisations/paye"
| "href": "$apiBaseUrl/organisations/paye/"
| },
| "statements": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements"
| },
| "self": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2017-18"
| },
| "next": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2018-19"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2018-19"
| },
| "previous": {
| "href": "/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2016-17"
| "href": "$apiBaseUrl/organisations/paye/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}/statements/2016-17"
| }
| }
|}
""".stripMargin)
""".stripMargin
)

def authorisedEnrolmentJson(empRef: EmpRef): String = {
s"""
Expand All @@ -266,5 +267,4 @@ object Fixtures {
""".stripMargin
}


}
5 changes: 4 additions & 1 deletion test/integration/GetAnnualStatementSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class GetAnnualStatementSpec extends WordSpec

"AnnualStatement API should return a statement " should {
"containing EYU data" in {
val apiBaseUrl = app.configuration.underlying.getString("api.baseUrl")

val empRef = EmpRefGenerator.getEmpRef

val annualStatementUrl =
Expand All @@ -54,7 +56,8 @@ class GetAnnualStatementSpec extends WordSpec
.get(annualStatementUrl).withAuthHeader()
.thenAssertThat()
.bodyIsOfJson(
Fixtures.expectedAnnualStatementJson(empRef))
Fixtures.expectedAnnualStatementJson(apiBaseUrl, empRef)
)
}
}
}
5 changes: 0 additions & 5 deletions test/uk/gov/hmrc/epayeapi/models/JsonFixtures.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@ object JsonFixtures {
lazy val annualStatement: String = getResourceAsString("/epaye/annual-statement/annual-statement.json")
}

val baseUrl = "/organisations/paye"

def baseUrlFor(empRef: EmpRef): String =
s"$baseUrl/${empRef.taxOfficeNumber}/${empRef.taxOfficeReference}"

val emptyEpayeAnnualStatement =
EpayeAnnualStatement(
rti = AnnualStatementTable(
Expand Down
26 changes: 13 additions & 13 deletions test/uk/gov/hmrc/epayeapi/models/out/AnnualStatementJsonSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,26 @@ package uk.gov.hmrc.epayeapi.models.out
import common.EmpRefGenerator
import org.joda.time.LocalDate
import org.scalatest.{Matchers, WordSpec}
import uk.gov.hmrc.domain.EmpRef
import uk.gov.hmrc.epayeapi.models.JsonFixtures.{baseUrl, baseUrlFor, emptyEpayeAnnualStatement}
import uk.gov.hmrc.epayeapi.models.JsonFixtures.emptyEpayeAnnualStatement
import uk.gov.hmrc.epayeapi.models.in._
import uk.gov.hmrc.epayeapi.models.{TaxMonth, TaxYear}

class AnnualStatementJsonSpec extends WordSpec with Matchers {
val apiBaseUrl = "[API_BASE_URL]"
val empRef = EmpRefGenerator.getEmpRef
val dueDate = new LocalDate(2017, 5, 22)

val taxYear = TaxYear(2016)

"AnnualStatementJson.apply._links" should {
"contain the right links" in {
AnnualStatementJson(empRef, taxYear, emptyEpayeAnnualStatement)._links shouldBe
AnnualStatementJson(apiBaseUrl, empRef, taxYear, emptyEpayeAnnualStatement)._links shouldBe
AnnualStatementLinksJson(
empRefs = Link(baseUrl),
statements = Link(s"${baseUrlFor(empRef)}/statements"),
self = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.asString}"),
next = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.next.asString}"),
previous = Link(s"${baseUrlFor(empRef)}/statements/${taxYear.previous.asString}")
empRefs = Link.empRefsLink(apiBaseUrl),
statements = Link.statementsLink(apiBaseUrl, empRef),
self = Link.anualStatementLink(apiBaseUrl, empRef, taxYear),
next = Link.anualStatementLink(apiBaseUrl, empRef, taxYear.next),
previous = Link.anualStatementLink(apiBaseUrl, empRef, taxYear.previous)
)
}
}
Expand Down Expand Up @@ -72,7 +72,7 @@ class AnnualStatementJsonSpec extends WordSpec with Matchers {
)
)

AnnualStatementJson(empRef, taxYear, epayeAnnualStatement)._embedded.earlierYearUpdate shouldBe
AnnualStatementJson(apiBaseUrl, empRef, taxYear, epayeAnnualStatement)._embedded.earlierYearUpdate shouldBe
Some(EarlierYearUpdateJson(
amount = 100,
clearedByCredits = 20,
Expand All @@ -82,7 +82,7 @@ class AnnualStatementJsonSpec extends WordSpec with Matchers {
))
}
"return a None if it is not present" in {
AnnualStatementJson(empRef, taxYear, emptyEpayeAnnualStatement)._embedded.earlierYearUpdate shouldBe None
AnnualStatementJson(apiBaseUrl, empRef, taxYear, emptyEpayeAnnualStatement)._embedded.earlierYearUpdate shouldBe None
}
}

Expand All @@ -102,7 +102,7 @@ class AnnualStatementJsonSpec extends WordSpec with Matchers {
codeText = None
)

MonthlyChargesJson.from(lineItem, empRef, taxYear) shouldBe
MonthlyChargesJson.from(apiBaseUrl, lineItem, empRef, taxYear) shouldBe
Some(MonthlyChargesJson(
taxMonth = TaxMonth(taxYear, taxMonth.month),
amount = 100,
Expand All @@ -111,7 +111,7 @@ class AnnualStatementJsonSpec extends WordSpec with Matchers {
balance = 100 - 10 - 20,
dueDate = dueDate,
isSpecified = true,
_links = SelfLink(Link(s"${baseUrlFor(empRef)}/statements/${taxYear.asString}/${taxMonth.asString}"))
_links = SelfLink(Link.monthlyStatementLink(apiBaseUrl, empRef, taxYear, taxMonth))
))
}
"return a None if the taxMonth field is None" in {
Expand All @@ -127,7 +127,7 @@ class AnnualStatementJsonSpec extends WordSpec with Matchers {
codeText = None
)

MonthlyChargesJson.from(lineItem, empRef, taxYear) shouldBe None
MonthlyChargesJson.from(apiBaseUrl, lineItem, empRef, taxYear) shouldBe None
}
}

Expand Down

0 comments on commit 7d51b12

Please sign in to comment.