diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-08 15:22:02 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-08 15:22:02 +0800 |
commit | a5320694193fd86b639c53a91fa24fb7f8ea914e (patch) | |
tree | 84d5d94f1fa0a6aeee2b7dc81b1f0276e2f38994 /cask/test/src/test/cask | |
parent | a89ebd17dab5af6814d58f02d410acb1eb60e592 (diff) | |
download | cask-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/src/test/cask')
-rw-r--r-- | cask/test/src/test/cask/Decorated.scala | 13 | ||||
-rw-r--r-- | cask/test/src/test/cask/ExampleTests.scala | 26 | ||||
-rw-r--r-- | cask/test/src/test/cask/FailureTests.scala | 8 | ||||
-rw-r--r-- | cask/test/src/test/cask/TodoMvcDb.scala | 77 |
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() +} |