summaryrefslogtreecommitdiff
path: root/cask/test
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-08 15:22:02 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-08 15:22:02 +0800
commita5320694193fd86b639c53a91fa24fb7f8ea914e (patch)
tree84d5d94f1fa0a6aeee2b7dc81b1f0276e2f38994 /cask/test
parenta89ebd17dab5af6814d58f02d410acb1eb60e592 (diff)
downloadcask-a5320694193fd86b639c53a91fa24fb7f8ea914e.tar.gz
cask-a5320694193fd86b639c53a91fa24fb7f8ea914e.tar.bz2
cask-a5320694193fd86b639c53a91fa24fb7f8ea914e.zip
Refactor decorators into a more traditional delegation model, and use that to implement endpoint-scoped transactions using Quill
Diffstat (limited to 'cask/test')
-rw-r--r--cask/test/src/test/cask/Decorated.scala13
-rw-r--r--cask/test/src/test/cask/ExampleTests.scala26
-rw-r--r--cask/test/src/test/cask/FailureTests.scala8
-rw-r--r--cask/test/src/test/cask/TodoMvcDb.scala77
4 files changed, 119 insertions, 5 deletions
diff --git a/cask/test/src/test/cask/Decorated.scala b/cask/test/src/test/cask/Decorated.scala
index 3925bf1..9fac78a 100644
--- a/cask/test/src/test/cask/Decorated.scala
+++ b/cask/test/src/test/cask/Decorated.scala
@@ -1,16 +1,23 @@
package test.cask
-import cask.model.ParamContext
+import cask.internal.Router
+import cask.model.{ParamContext, Response}
object Decorated extends cask.MainRoutes{
class User{
override def toString = "[haoyi]"
}
class loggedIn extends cask.Decorator {
- def getRawParams(ctx: ParamContext) = Right(cask.Decor("user" -> new User()))
+ def wrapMethodOutput(ctx: ParamContext,
+ delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = {
+ delegate(Map("user" -> new User()))
+ }
}
class withExtra extends cask.Decorator {
- def getRawParams(ctx: ParamContext) = Right(cask.Decor("extra" -> 31337))
+ def wrapMethodOutput(ctx: ParamContext,
+ delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = {
+ delegate(Map("extra" -> 31337))
+ }
}
@withExtra()
diff --git a/cask/test/src/test/cask/ExampleTests.scala b/cask/test/src/test/cask/ExampleTests.scala
index 1196122..6858051 100644
--- a/cask/test/src/test/cask/ExampleTests.scala
+++ b/cask/test/src/test/cask/ExampleTests.scala
@@ -117,5 +117,31 @@ object ExampleTests extends TestSuite{
requests.get(host + "/list/active").text() ==>
"""[]"""
}
+ 'TodoMvcDb - test(TodoMvcDb){ host =>
+ requests.get(host + "/list/all").text() ==>
+ """[{"id":1,"checked":true,"text":"Get started with Cask"},{"id":2,"checked":false,"text":"Profit!"}]"""
+ requests.get(host + "/list/active").text() ==>
+ """[{"id":2,"checked":false,"text":"Profit!"}]"""
+ requests.get(host + "/list/completed").text() ==>
+ """[{"id":1,"checked":true,"text":"Get started with Cask"}]"""
+
+ requests.post(host + "/toggle/2")
+
+ requests.get(host + "/list/all").text() ==>
+ """[{"id":1,"checked":true,"text":"Get started with Cask"},{"id":2,"checked":true,"text":"Profit!"}]"""
+
+ requests.get(host + "/list/active").text() ==>
+ """[]"""
+
+ requests.post(host + "/add", data = "new Task")
+
+ requests.get(host + "/list/active").text() ==>
+ """[{"id":3,"checked":false,"text":"new Task"}]"""
+
+ requests.post(host + "/delete/3")
+
+ requests.get(host + "/list/active").text() ==>
+ """[]"""
+ }
}
}
diff --git a/cask/test/src/test/cask/FailureTests.scala b/cask/test/src/test/cask/FailureTests.scala
index 3ed4249..de3b438 100644
--- a/cask/test/src/test/cask/FailureTests.scala
+++ b/cask/test/src/test/cask/FailureTests.scala
@@ -1,11 +1,15 @@
package test.cask
-import cask.model.ParamContext
+import cask.internal.Router
+import cask.model.{ParamContext, Response}
import utest._
object FailureTests extends TestSuite {
class myDecorator extends cask.Decorator {
- def getRawParams(ctx: ParamContext) = Right(cask.Decor("extra" -> 31337))
+ def wrapMethodOutput(ctx: ParamContext,
+ delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = {
+ delegate(Map("extra" -> 31337))
+ }
}
val tests = Tests{
diff --git a/cask/test/src/test/cask/TodoMvcDb.scala b/cask/test/src/test/cask/TodoMvcDb.scala
new file mode 100644
index 0000000..c6f8191
--- /dev/null
+++ b/cask/test/src/test/cask/TodoMvcDb.scala
@@ -0,0 +1,77 @@
+package test.cask
+import cask.internal.Router
+import cask.model.{ParamContext, Response}
+import com.typesafe.config.ConfigFactory
+import io.getquill._
+
+
+object TodoMvcDb extends cask.MainRoutes{
+ case class Todo(id: Int, checked: Boolean, text: String)
+ object Todo{
+ implicit def todoRW = upickle.default.macroRW[Todo]
+ }
+ object ctx extends SqliteJdbcContext(
+ SnakeCase,
+ ConfigFactory.parseString(
+ s"""{"driverClassName":"org.sqlite.JDBC","jdbcUrl":"jdbc:sqlite:$tmpDb/file.db"}"""
+ )
+ )
+ val tmpDb = java.nio.file.Files.createTempDirectory("todo-cask-sqlite")
+
+ import ctx._
+
+ class transactional extends cask.Decorator{
+ def wrapMethodOutput(pctx: ParamContext,
+ delegate: Map[String, Input] => Router.Result[Response]): Router.Result[Response] = {
+ ctx.transaction(delegate(Map("ctx" -> ctx)))
+ }
+ }
+
+ ctx.executeAction(
+ """CREATE TABLE todo (
+ | id INTEGER PRIMARY KEY AUTOINCREMENT,
+ | checked BOOLEAN,
+ | text TEXT
+ |);
+ |""".stripMargin
+ )
+ ctx.executeAction(
+ """INSERT INTO todo (checked, text) VALUES
+ |(1, 'Get started with Cask'),
+ |(0, 'Profit!');
+ |""".stripMargin
+ )
+
+ @transactional
+ @cask.get("/list/:state")
+ def list(state: String)(ctx: SqliteJdbcContext[_]) = {
+ val filteredTodos = state match{
+ case "all" => run(query[Todo])
+ case "active" => run(query[Todo].filter(!_.checked))
+ case "completed" => run(query[Todo].filter(_.checked))
+ }
+ upickle.default.write(filteredTodos)
+ }
+
+ @transactional
+ @cask.post("/add")
+ def add(request: cask.Request)(ctx: SqliteJdbcContext[_]) = {
+ val body = new String(request.data.readAllBytes())
+ run(query[Todo].insert(_.checked -> lift(false), _.text -> lift(body)).returning(_.id))
+ }
+
+ @transactional
+ @cask.post("/toggle/:index")
+ def toggle(index: Int)(ctx: SqliteJdbcContext[_]) = {
+ run(query[Todo].filter(_.id == lift(index)).update(p => p.checked -> !p.checked))
+ }
+
+ @transactional
+ @cask.post("/delete/:index")
+ def delete(index: Int)(ctx: SqliteJdbcContext[_]) = {
+ run(query[Todo].filter(_.id == lift(index)).delete)
+
+ }
+
+ initialize()
+}