summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessio Biancalana <dottorblaster@apache.org>2020-03-26 23:27:35 +0100
committerAlessio Biancalana <dottorblaster@gmail.com>2020-04-04 18:20:46 +0200
commitc1dd946d83f3f0c2ea0eb58ba82bc3bd909fafa4 (patch)
treef008d408935b15921e3b3fe6b437148f58266c30
parent68558f17d672e1c2c0e466bf7215d820cf3ca0b2 (diff)
downloadcouchdb-c1dd946d83f3f0c2ea0eb58ba82bc3bd909fafa4.tar.gz
Port view_offset.js to elixir test suite
-rw-r--r--test/elixir/README.md2
-rw-r--r--test/elixir/lib/couch/db_test.ex26
-rw-r--r--test/elixir/test/view_offsets_test.exs100
-rw-r--r--test/javascript/tests/view_offsets.js2
4 files changed, 128 insertions, 2 deletions
diff --git a/test/elixir/README.md b/test/elixir/README.md
index 708fcbe6c..49a2abd3e 100644
--- a/test/elixir/README.md
+++ b/test/elixir/README.md
@@ -107,7 +107,7 @@ X means done, - means partially
- [ ] Port view_multi_key_all_docs.js
- [ ] Port view_multi_key_design.js
- [ ] Port view_multi_key_temp.js
- - [ ] Port view_offsets.js
+ - [X] Port view_offsets.js
- [X] Port view_pagination.js
- [ ] Port view_sandboxing.js
- [ ] Port view_update_seq.js
diff --git a/test/elixir/lib/couch/db_test.ex b/test/elixir/lib/couch/db_test.ex
index 47a067652..e3f32f839 100644
--- a/test/elixir/lib/couch/db_test.ex
+++ b/test/elixir/lib/couch/db_test.ex
@@ -192,6 +192,13 @@ defmodule Couch.DBTest do
resp.body
end
+ def save(db_name, document) do
+ resp = Couch.put("/#{db_name}/#{document["_id"]}", body: document)
+ assert resp.status_code in [201, 202]
+ assert resp.body["ok"]
+ Map.put(document, "_rev", resp.body["rev"])
+ end
+
def bulk_save(db_name, docs) do
resp =
Couch.post(
@@ -271,6 +278,24 @@ defmodule Couch.DBTest do
resp.body
end
+ def view(db_name, view_name, options \\ nil, keys \\ nil) do
+ [view_root, view_name] = String.split(view_name, "/")
+
+ resp =
+ case keys do
+ nil ->
+ Couch.get("/#{db_name}/_design/#{view_root}/_view/#{view_name}", query: options)
+
+ _ ->
+ Couch.post("/#{db_name}/_design/#{view_root}/_view/#{view_name}",
+ body: %{"keys" => keys}
+ )
+ end
+
+ assert resp.status_code in [200, 201]
+ resp
+ end
+
def sample_doc_foo do
%{
_id: "foo",
@@ -300,7 +325,6 @@ defmodule Couch.DBTest do
end
end
-
def request_stats(path_steps, is_test) do
path =
List.foldl(
diff --git a/test/elixir/test/view_offsets_test.exs b/test/elixir/test/view_offsets_test.exs
new file mode 100644
index 000000000..20aa1ca9d
--- /dev/null
+++ b/test/elixir/test/view_offsets_test.exs
@@ -0,0 +1,100 @@
+defmodule ViewOffsetTest do
+ use CouchTestCase
+
+ @moduletag :view_offsets
+
+ @moduledoc """
+ Tests about view offsets.
+ This is a port of the view_offsets.js javascript test suite.
+ """
+
+ @docs [
+ %{"_id" => "a1", "letter" => "a", "number" => 1, "foo" => "bar"},
+ %{"_id" => "a2", "letter" => "a", "number" => 2, "foo" => "bar"},
+ %{"_id" => "a3", "letter" => "a", "number" => 3, "foo" => "bar"},
+ %{"_id" => "b1", "letter" => "b", "number" => 1, "foo" => "bar"},
+ %{"_id" => "b2", "letter" => "b", "number" => 2, "foo" => "bar"},
+ %{"_id" => "b3", "letter" => "b", "number" => 3, "foo" => "bar"},
+ %{"_id" => "b4", "letter" => "b", "number" => 4, "foo" => "bar"},
+ %{"_id" => "b5", "letter" => "b", "number" => 5, "foo" => "bar"},
+ %{"_id" => "c1", "letter" => "c", "number" => 1, "foo" => "bar"},
+ %{"_id" => "c2", "letter" => "c", "number" => 2, "foo" => "bar"}
+ ]
+
+ @design_doc %{
+ "_id" => "_design/test",
+ "views" => %{
+ "offset" => %{
+ "map" => "function(doc) { emit([doc.letter, doc.number], doc); }"
+ }
+ }
+ }
+
+ @tag :with_db
+ test "basic view offsets", context do
+ db_name = context[:db_name]
+ save(db_name, @design_doc)
+ bulk_save(db_name, @docs)
+
+ [
+ [["c", 2], 0],
+ [["c", 1], 1],
+ [["b", 5], 2],
+ [["b", 4], 3],
+ [["b", 3], 4],
+ [["b", 2], 5],
+ [["b", 1], 6],
+ [["a", 3], 7],
+ [["a", 2], 8],
+ [["a", 1], 9]
+ ]
+ |> Enum.each(fn [start_key, offset] ->
+ result =
+ view(db_name, "test/offset", %{
+ "startkey" => :jiffy.encode(start_key),
+ "descending" => true
+ })
+
+ assert result.body["offset"] === offset
+ end)
+ end
+
+ test "repeated view offsets" do
+ 0..14 |> Enum.each(fn _ -> repeated_view_offset_test_fun end)
+ end
+
+ def repeated_view_offset_test_fun do
+ db_name = random_db_name()
+ create_db(db_name)
+
+ save(db_name, @design_doc)
+ bulk_save(db_name, @docs)
+
+ first_response =
+ view(db_name, "test/offset", %{
+ "startkey" => :jiffy.encode(["b", 4]),
+ "startkey_docid" => "b4",
+ "endkey" => :jiffy.encode(["b"]),
+ "descending" => true,
+ "limit" => 2,
+ "skip" => 1
+ })
+
+ second_response =
+ view(db_name, "test/offset", %{
+ "startkey" => :jiffy.encode(["c", 3])
+ })
+
+ third_response =
+ view(db_name, "test/offset", %{
+ "startkey" => :jiffy.encode(["b", 6]),
+ "endkey" => :jiffy.encode(["b", 7])
+ })
+
+ assert first_response.body["offset"] === 4
+ assert second_response.body["offset"] === length(@docs)
+ assert third_response.body["offset"] === 8
+
+ delete_db(db_name)
+ end
+end
diff --git a/test/javascript/tests/view_offsets.js b/test/javascript/tests/view_offsets.js
index 8b39cc247..179c96360 100644
--- a/test/javascript/tests/view_offsets.js
+++ b/test/javascript/tests/view_offsets.js
@@ -10,6 +10,8 @@
// License for the specific language governing permissions and limitations under
// the License.
+couchTests.elixir = true;
+
couchTests.view_offsets = function(debug) {
if (debug) debugger;