Skip to content

Instantly share code, notes, and snippets.

@fomkin
Last active May 9, 2016 11:41
Show Gist options
  • Save fomkin/e22edfe56e6cdce11c0511caf81032d1 to your computer and use it in GitHub Desktop.
Save fomkin/e22edfe56e6cdce11c0511caf81032d1 to your computer and use it in GitHub Desktop.
import scala.concurrent.Future
import scala.util.{Failure, Success}
object Czar {
class Context
case class ApiTestException(message: String, context: Context, cause: Option[Throwable] = None)
extends Exception(message)
}
trait Czar {
import Czar._
implicit val ec = scala.concurrent.ExecutionContext.Implicits.global
val GRAY = "\u001b[37m"
val BALLOTX = "\u2717"
val CHECKMARK = "\u2713"
def assert(description: String)(condition: Boolean)(implicit context: Context): Future[Unit] = {
if (condition) Future.successful(())
else Future.failed(ApiTestException(description, context))
}
def assertMatch[T, R](x: T)(f: PartialFunction[T, R])(implicit context: Context): Future[R] = {
if (f.isDefinedAt(x)) ok(f(x)) else fail(s"Match error: $x")
}
def ok[T](x: T): Future[T] = Future.successful(x)
def fail[T](s: String)(implicit context: Context): Future[T] = {
Future.failed(ApiTestException(s, context))
}
def step[T](description: String)(f: Context => Future[T]) = {
val context = new Context()
def error(s: String) = s"$description\n -> $s"
def printResult(color: String, sing: String, message: String) =
println(" ["+color+sing+Console.RESET+"] " + message)
f(context) recover {
case e if !e.isInstanceOf[ApiTestException] ⇒
throw ApiTestException(e.getMessage, context, Some(e))
} andThen {
case Failure(ApiTestException(message, `context`, None)) => printResult(Console.RED, BALLOTX, error(message))
case Failure(ApiTestException(message, `context`, Some(e))) =>
val padding = " " * 5
val stackTrace = padding + e.getStackTrace.mkString(s"\n$padding")
printResult(Console.RED, BALLOTX, error(s"$message\n$stackTrace"))
case Failure(ApiTestException(message, _, _)) => printResult(GRAY, " ", description)
case Failure(e) => printResult(Console.RED, BALLOTX, error(e.getMessage))
case Success(_) => printResult(Console.GREEN, CHECKMARK, description)
}
}
}
@fomkin
Copy link
Author

fomkin commented May 5, 2016

object CreateProjectScenario extends Czar with Defaults {

  val projectStep = step("Create a project") { implicit context 
    for {
      token  CreateAccountScenario.tokenStep
      newProject = EditProject("New Project", Currency.Rur)
      request = (endpoint / "project" / "create").
        POST.
        setHeader("Authorization", s"Bearer $token").
        setContentType("application/json", "UTF-8").
        setBody(write(newProject))
      response  Http(request OK asPushka[UserResponse.Success[String]])
      _  assert("Should be success")(response.responseType == "success")
    } yield {
      response.data
    }
  }

  val lookupNewProject = step("Lookup new project") { implicit context 
    for {
      token  CreateAccountScenario.tokenStep
      projectId  projectStep
      request = (endpoint / "account").
        GET.setHeader("Authorization", s"Bearer $token")
      response  Http(request OK asPushka[UserResponse.Success[Account]])
      _  assert("Account should contain created project")(
        response.data.projects.exists(_.startsWith(projectId)))
    } yield {
      ()
    }
  }

}

@fomkin
Copy link
Author

fomkin commented May 5, 2016

object CreateProjectScenario extends Czar with Defaults {

  val projectStep = step("Create a project") { implicit context 
    for {
      token  CreateAccountScenario.tokenStep
      newProject = EditProject("New Project", Currency.Rur)
      request = (endpoint / "project" / "create").
        POST.
        setHeader("Authorization", s"Bearer $token").
        setContentType("application/json", "UTF-8").
        setBody(write(newProject))
      response  Http(request OK asPushka[UserResponse.Success[String]])
      _  assert("Should be success")(response.responseType == "success")
    } yield {
      response.data
    }
  }

  val lookupNewProject = step("Lookup new project") { implicit context 
    for {
      token  CreateAccountScenario.tokenStep
      projectId  projectStep
      request = (endpoint / "account").
        GET.setHeader("Authorization", s"Bearer $token")
      response  Http(request OK asPushka[UserResponse.Success[Account]])
      _  assert("Account should contain created project")(
        response.data.projects.exists(_.startsWith(projectId)))
    } yield {
      ()
    }
  }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment