|
|
|
package controllers
|
|
|
|
|
|
|
|
import com.alexitc.playsonify.core.FutureApplicationResult
|
|
|
|
import com.alexitc.playsonify.play.PublicErrorRenderer
|
|
|
|
import com.xsn.explorer.errors.MasternodeNotFoundError
|
|
|
|
import com.xsn.explorer.helpers.DummyXSNService
|
|
|
|
import com.xsn.explorer.models.rpc.Masternode
|
|
|
|
import com.xsn.explorer.models.{Address, IPAddress, TransactionId}
|
|
|
|
import com.xsn.explorer.services.XSNService
|
|
|
|
import controllers.common.MyAPISpec
|
|
|
|
import org.scalactic.{Bad, Good}
|
|
|
|
import play.api.inject.bind
|
|
|
|
import play.api.libs.json.JsValue
|
|
|
|
import play.api.test.Helpers._
|
|
|
|
|
|
|
|
import scala.concurrent.Future
|
|
|
|
|
|
|
|
class MasternodesControllerSpec extends MyAPISpec {
|
|
|
|
|
|
|
|
val masternodes = List(
|
|
|
|
Masternode(
|
|
|
|
txid = TransactionId.from("c3efb8b60bda863a3a963d340901dc2b870e6ea51a34276a8f306d47ffb94f01").get,
|
|
|
|
ip = "45.77.136.212:62583",
|
|
|
|
protocol = "70208",
|
|
|
|
status = "WATCHDOG_EXPIRED",
|
|
|
|
activeSeconds = 513323,
|
|
|
|
lastSeen = 1524349009,
|
|
|
|
payee = Address.from("XqdmM7rop8Sdgn8UjyNh3Povc3rhNSXYw2").get),
|
|
|
|
|
|
|
|
Masternode(
|
|
|
|
txid = TransactionId.from("b02f99d87194c9400ab147c070bf621770684906dedfbbe9ba5f3a35c26b8d01").get,
|
|
|
|
ip = "45.32.148.13:62583",
|
|
|
|
protocol = "70208",
|
|
|
|
status = "ENABLED",
|
|
|
|
activeSeconds = 777344,
|
|
|
|
lastSeen = 1524349028,
|
|
|
|
payee = Address.from("XdNDRAiMUC9KiVRzhCTg9w44jQRdCpCRe3").get)
|
|
|
|
)
|
|
|
|
|
|
|
|
val masternode = masternodes.last
|
|
|
|
|
|
|
|
val xsnService = new DummyXSNService {
|
|
|
|
override def getMasternodes(): FutureApplicationResult[List[Masternode]] = {
|
|
|
|
Future.successful(Good(masternodes))
|
|
|
|
}
|
|
|
|
|
|
|
|
override def getMasternode(ipAddress: IPAddress): FutureApplicationResult[Masternode] = {
|
|
|
|
if (masternode.ip.startsWith(ipAddress.string)) {
|
|
|
|
Future.successful(Good(masternode))
|
|
|
|
} else {
|
|
|
|
Future.successful(Bad(MasternodeNotFoundError).accumulating)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override val application = guiceApplicationBuilder
|
|
|
|
.overrides(bind[XSNService].to(xsnService))
|
|
|
|
.build
|
|
|
|
|
|
|
|
"GET /masternodes" should {
|
|
|
|
"return the masternodes" in {
|
|
|
|
val expected = masternodes.head
|
|
|
|
val response = GET("/masternodes?offset=1&limit=10&orderBy=activeSeconds:desc")
|
|
|
|
status(response) mustEqual OK
|
|
|
|
|
|
|
|
val json = contentAsJson(response)
|
|
|
|
(json \ "total").as[Int] mustEqual 2
|
|
|
|
|
|
|
|
val jsonList = (json \ "data").as[List[JsValue]]
|
|
|
|
jsonList.size mustEqual 1
|
|
|
|
|
|
|
|
val item = jsonList.head
|
|
|
|
(item \ "txid").as[String] mustEqual expected.txid.string
|
|
|
|
(item \ "payee").as[String] mustEqual expected.payee.string
|
|
|
|
(item \ "ip").as[String] mustEqual expected.ip
|
|
|
|
(item \ "protocol").as[String] mustEqual expected.protocol
|
|
|
|
(item \ "lastSeen").as[Long] mustEqual expected.lastSeen
|
|
|
|
(item \ "activeSeconds").as[Long] mustEqual expected.activeSeconds
|
|
|
|
(item \ "status").as[String] mustEqual expected.status
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
"GET /masternodes/:ip" should {
|
|
|
|
"return the masternode" in {
|
|
|
|
val expected = masternode
|
|
|
|
val response = GET("/masternodes/45.32.148.13")
|
|
|
|
status(response) mustEqual OK
|
|
|
|
|
|
|
|
val json = contentAsJson(response)
|
|
|
|
(json \ "activeSeconds").as[Long] mustEqual expected.activeSeconds
|
|
|
|
(json \ "ip").as[String] mustEqual expected.ip
|
|
|
|
(json \ "lastSeen").as[Long] mustEqual expected.lastSeen
|
|
|
|
(json \ "payee").as[String] mustEqual expected.payee.string
|
|
|
|
(json \ "protocol").as[String] mustEqual expected.protocol
|
|
|
|
(json \ "status").as[String] mustEqual expected.status
|
|
|
|
(json \ "txid").as[String] mustEqual expected.txid.string
|
|
|
|
}
|
|
|
|
|
|
|
|
"fail on masternode not found" in {
|
|
|
|
val response = GET("/masternodes/45.32.149.13")
|
|
|
|
status(response) mustEqual NOT_FOUND
|
|
|
|
|
|
|
|
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 "ip"
|
|
|
|
(error \ "message").as[String].nonEmpty mustEqual true
|
|
|
|
}
|
|
|
|
|
|
|
|
"fail on bad ip format" in {
|
|
|
|
val response = GET("/masternodes/45.32.149.1333")
|
|
|
|
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 "ip"
|
|
|
|
(error \ "message").as[String].nonEmpty mustEqual true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|