diff --git a/test/elixir/README.md b/test/elixir/README.md index 48f936fcbd6..1b515c2da37 100644 --- a/test/elixir/README.md +++ b/test/elixir/README.md @@ -27,7 +27,7 @@ X means done, - means partially - [ ] Port batch_save.js - [ ] Port bulk_docs.js - [X] Port changes.js - - [ ] Port coffee.js + - [X] Port coffee.js - [ ] Port compact.js - [X] Port config.js - [ ] Port conflicts.js diff --git a/test/elixir/test/coffee_test.exs b/test/elixir/test/coffee_test.exs new file mode 100644 index 00000000000..19b1e6987f2 --- /dev/null +++ b/test/elixir/test/coffee_test.exs @@ -0,0 +1,68 @@ +defmodule CoffeeTest do + use CouchTestCase + + @moduletag :coffee + + @moduledoc """ + Test basic coffeescript functionality. + This is a port of the coffee.js test suite. + """ + + @tag :with_db + test "CoffeeScript basic functionality", context do + db_name = context[:db_name] + + docs = [ + %{:_id => "a", :foo => 100}, + %{:foo => 1}, + %{:foo => 1}, + %{:foo => 2}, + %{:foo => 2}, + %{:bar => 1}, + %{:bar => 1}, + %{:bar => 2}, + %{:bar => 2} + ] + + resp = Couch.post("/#{db_name}/_bulk_docs", body: %{docs: docs}) + + design_doc = %{ + :_id => "_design/coffee", + :language => "coffeescript", + :views => %{ + :myview => %{ + :map => "(doc) -> if doc.foo\n emit(doc.foo, 1)", + :reduce => "(keys, values, rereduce) ->\n sum = 0\n for x in values\n sum = sum + x\n sum" + } + }, + :shows => %{ + :myshow => "(doc) ->\n \"Foo #\{doc.foo}\"" + }, + :lists => %{ + :mylist => + "(head, req) ->\n while row = getRow()\n send(toJSON({\"resp\": \"Foo #\{row.value}\"}))\n return" + }, + :filters => %{ + :filter => "(doc) ->\n doc.foo" + } + } + + design_resp = Couch.put("/#{db_name}/_design/coffee", body: design_doc) + assert design_resp.status_code === 201 + + assert resp.status_code === 201 and length(resp.body) === length(docs) + + %{"rows" => values} = Couch.get("/#{db_name}/_design/coffee/_view/myview").body + + assert 5 === hd(values)["value"] + + assert Couch.get("/#{db_name}/_design/coffee/_show/myshow/a").body === "Foo 100" + + %{"resp" => list_output} = Couch.get("/#{db_name}/_design/coffee/_list/mylist/myview").body + assert list_output === "Foo 5" + + %{"results" => changes_results} = Couch.get("/#{db_name}/_changes", query: %{"filter" => "coffee/filter"}).body + + assert length(changes_results) === 5 + end +end