You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by do...@apache.org on 2020/04/04 16:20:54 UTC

[couchdb] branch 3.x updated: Port view_offset.js to elixir test suite

This is an automated email from the ASF dual-hosted git repository.

dottorblaster pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/3.x by this push:
     new c1dd946  Port view_offset.js to elixir test suite
c1dd946 is described below

commit c1dd946d83f3f0c2ea0eb58ba82bc3bd909fafa4
Author: Alessio Biancalana <do...@apache.org>
AuthorDate: Thu Mar 26 23:27:35 2020 +0100

    Port view_offset.js to elixir test suite
---
 test/elixir/README.md                  |   2 +-
 test/elixir/lib/couch/db_test.ex       |  26 ++++++++-
 test/elixir/test/view_offsets_test.exs | 100 +++++++++++++++++++++++++++++++++
 test/javascript/tests/view_offsets.js  |   2 +
 4 files changed, 128 insertions(+), 2 deletions(-)

diff --git a/test/elixir/README.md b/test/elixir/README.md
index 708fcbe..49a2abd 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 47a0676..e3f32f8 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 0000000..20aa1ca
--- /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 8b39cc2..179c963 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;