|
|
|
package controllers
|
|
|
|
|
|
|
|
import com.alexitc.playsonify.PublicErrorRenderer
|
|
|
|
import com.alexitc.playsonify.core.FutureApplicationResult
|
|
|
|
import com.xsn.explorer.errors.AddressFormatError
|
|
|
|
import com.xsn.explorer.helpers.DummyXSNService
|
|
|
|
import com.xsn.explorer.models._
|
|
|
|
import com.xsn.explorer.models.rpc.AddressBalance
|
|
|
|
import com.xsn.explorer.services.XSNService
|
|
|
|
import controllers.common.MyAPISpec
|
|
|
|
import org.scalactic.{One, Or}
|
|
|
|
import play.api.inject.bind
|
|
|
|
import play.api.libs.json.JsValue
|
|
|
|
import play.api.test.Helpers._
|
|
|
|
|
|
|
|
import scala.concurrent.Future
|
|
|
|
|
|
|
|
|
|
|
|
class AddressesControllerSpec extends MyAPISpec {
|
|
|
|
|
|
|
|
def addressDetails(balance: Int, received: Int, txCount: Int) = {
|
|
|
|
AddressDetails(AddressBalance(BigDecimal(balance), BigDecimal(received)), txCount)
|
|
|
|
}
|
|
|
|
|
|
|
|
val addressEmpty = addressDetails(0, 0, 0)
|
|
|
|
val addressFilled = addressDetails(100, 200, 25)
|
|
|
|
|
|
|
|
val customXSNService = new DummyXSNService {
|
|
|
|
val map = Map(
|
|
|
|
"Xi3sQfMQsy2CzMZTrnKW6HFGp1VqFThdLw" -> addressEmpty,
|
|
|
|
"XnH3bC9NruJ4wnu4Dgi8F3wemmJtcxpKp6" -> addressFilled
|
|
|
|
)
|
|
|
|
|
|
|
|
override def getAddressBalance(address: Address): FutureApplicationResult[AddressBalance] = {
|
|
|
|
val maybe = map.get(address.string).map(_.balance)
|
|
|
|
val result = Or.from(maybe, One(AddressFormatError))
|
|
|
|
Future.successful(result)
|
|
|
|
}
|
|
|
|
|
|
|
|
override def getTransactionCount(address: Address): FutureApplicationResult[Int] = {
|
|
|
|
val maybe = map.get(address.string).map(_.transactionCount)
|
|
|
|
val result = Or.from(maybe, One(AddressFormatError))
|
|
|
|
Future.successful(result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override val application = guiceApplicationBuilder
|
|
|
|
.overrides(bind[XSNService].to(customXSNService))
|
|
|
|
.build()
|
|
|
|
|
|
|
|
"GET /addresses/:address" should {
|
|
|
|
def url(address: String) = s"/addresses/$address"
|
|
|
|
|
|
|
|
"retrieve address information" in {
|
|
|
|
val address = addressFilled
|
|
|
|
val response = GET(url("XnH3bC9NruJ4wnu4Dgi8F3wemmJtcxpKp6"))
|
|
|
|
|
|
|
|
status(response) mustEqual OK
|
|
|
|
val json = contentAsJson(response)
|
|
|
|
(json \ "balance").as[BigDecimal] mustEqual address.balance.balance
|
|
|
|
(json \ "received").as[BigDecimal] mustEqual address.balance.received
|
|
|
|
(json \ "transactionCount").as[Int] mustEqual address.transactionCount
|
|
|
|
}
|
|
|
|
|
|
|
|
"fail on bad address format" in {
|
|
|
|
|
|
|
|
val address = "XnH3bC9NruJ4wnu4Dgi8F3wemmJtcxpKp"
|
|
|
|
val response = GET(url(address))
|
|
|
|
|
|
|
|
status(response) mustEqual BAD_REQUEST
|
|
|
|
val json = contentAsJson(response)
|
|
|
|
val errorList = (json \ "errors").as[List[JsValue]]
|
|
|
|
|
|
|
|
errorList.size mustEqual 1
|
|
|
|
val error = errorList.head
|
|
|
|
|
|
|
|
(error \ "type").as[String] mustEqual PublicErrorRenderer.FieldValidationErrorType
|
|
|
|
(error \ "field").as[String] mustEqual "address"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|