You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ju...@apache.org on 2020/07/07 07:42:31 UTC

[couchdb] branch master updated: Port view_collation_raw.js to elixir

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

juanjo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 23b4aa7  Port view_collation_raw.js to elixir
23b4aa7 is described below

commit 23b4aa78e09cceb9424ab1b0b9891755ecb46ba7
Author: Juanjo Rodriguez <ju...@apache.org>
AuthorDate: Wed Jul 1 08:36:25 2020 +0200

    Port view_collation_raw.js to elixir
---
 test/elixir/README.md                        |   2 +-
 test/elixir/test/view_collation_raw_test.exs | 159 +++++++++++++++++++++++++++
 test/javascript/tests/view_collation_raw.js  |   1 +
 3 files changed, 161 insertions(+), 1 deletion(-)

diff --git a/test/elixir/README.md b/test/elixir/README.md
index 80879af..44cca52d 100644
--- a/test/elixir/README.md
+++ b/test/elixir/README.md
@@ -99,7 +99,7 @@ X means done, - means partially
   - [X] Port utf8.js
   - [X] Port uuids.js
   - [X] Port view_collation.js
-  - [ ] Port view_collation_raw.js
+  - [X] Port view_collation_raw.js
   - [ ] Port view_compaction.js
   - [ ] Port view_conflicts.js
   - [ ] Port view_errors.js
diff --git a/test/elixir/test/view_collation_raw_test.exs b/test/elixir/test/view_collation_raw_test.exs
new file mode 100644
index 0000000..ee272d7
--- /dev/null
+++ b/test/elixir/test/view_collation_raw_test.exs
@@ -0,0 +1,159 @@
+defmodule ViewCollationRawTest do
+  use CouchTestCase
+
+  @moduledoc """
+  Test CouchDB View Raw Collation Behavior
+  This is a port of the view_collation_raw.js suite
+  """
+
+  @values [
+    # Then numbers
+    1,
+    2,
+    3,
+    4,
+    false,
+    :null,
+    true,
+
+    # Then objects, compared each key value in the list until different.
+    # Larger objects sort after their subset objects
+    {[a: 1]},
+    {[a: 2]},
+    {[b: 1]},
+    {[b: 2]},
+    # Member order does matter for collation
+    {[b: 2, a: 1]},
+    {[b: 2, c: 2]},
+
+    # Then arrays, compared element by element until different.
+    # Longer arrays sort after their prefixes
+    ["a"],
+    ["b"],
+    ["b", "c"],
+    ["b", "c", "a"],
+    ["b", "d"],
+    ["b", "d", "e"],
+
+    # Then text, case sensitive
+    "A",
+    "B",
+    "a",
+    "aa",
+    "b",
+    "ba",
+    "bb"
+  ]
+
+  setup_all do
+    db_name = random_db_name()
+    {:ok, _} = create_db(db_name)
+    on_exit(fn -> delete_db(db_name) end)
+
+    {docs, _} =
+      Enum.flat_map_reduce(@values, 1, fn value, idx ->
+        doc = %{:_id => Integer.to_string(idx), :foo => value}
+        {[doc], idx + 1}
+      end)
+
+    resp = Couch.post("/#{db_name}/_bulk_docs", body: %{:docs => docs})
+    Enum.each(resp.body, &assert(&1["ok"]))
+
+    map_fun = "function(doc) { emit(doc.foo, null); }"
+
+    map_doc = %{
+      :language => "javascript",
+      :views => %{:test => %{:map => map_fun, :options => %{:collation => "raw"}}}
+    }
+
+    resp = Couch.put("/#{db_name}/_design/test", body: map_doc)
+    assert resp.body["ok"]
+
+    {:ok, [db_name: db_name]}
+  end
+
+  test "ascending collation order", context do
+    retry_until(fn ->
+      resp = Couch.get(url(context))
+      pairs = Enum.zip(resp.body["rows"], @values)
+
+      Enum.each(pairs, fn {row, value} ->
+        assert row["key"] == convert(value)
+      end)
+    end)
+  end
+
+  test "raw semantics in key ranges", context do
+    retry_until(fn ->
+      resp =
+        Couch.get(url(context),
+          query: %{"startkey" => :jiffy.encode("Z"), "endkey" => :jiffy.encode("a")}
+        )
+
+      assert length(resp.body["rows"]) == 1
+      assert Enum.at(resp.body["rows"], 0)["key"] == "a"
+    end)
+  end
+
+  test "descending collation order", context do
+    retry_until(fn ->
+      resp = Couch.get(url(context), query: %{"descending" => "true"})
+      pairs = Enum.zip(resp.body["rows"], Enum.reverse(@values))
+
+      Enum.each(pairs, fn {row, value} ->
+        assert row["key"] == convert(value)
+      end)
+    end)
+  end
+
+  test "key query option", context do
+    Enum.each(@values, fn value ->
+      retry_until(fn ->
+        resp = Couch.get(url(context), query: %{:key => :jiffy.encode(value)})
+        assert length(resp.body["rows"]) == 1
+        assert Enum.at(resp.body["rows"], 0)["key"] == convert(value)
+      end)
+    end)
+  end
+
+  test "inclusive_end=true", context do
+    query = %{:endkey => :jiffy.encode("b"), :inclusive_end => true}
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "b"
+
+    query = Map.put(query, :descending, true)
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "b"
+  end
+
+  test "inclusive_end=false", context do
+    query = %{:endkey => :jiffy.encode("b"), :inclusive_end => false}
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "aa"
+
+    query = Map.put(query, :descending, true)
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "ba"
+
+    query = %{
+      :endkey => :jiffy.encode("b"),
+      :endkey_docid => 10,
+      :inclusive_end => false
+    }
+
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "aa"
+
+    query = Map.put(query, :endkey_docid, 11)
+    resp = Couch.get(url(context), query: query)
+    assert Enum.at(resp.body["rows"], -1)["key"] == "aa"
+  end
+
+  def url(context) do
+    "/#{context[:db_name]}/_design/test/_view/test"
+  end
+
+  def convert(value) do
+    :jiffy.decode(:jiffy.encode(value), [:return_maps])
+  end
+end
diff --git a/test/javascript/tests/view_collation_raw.js b/test/javascript/tests/view_collation_raw.js
index 9b02ff4..ee990bc 100644
--- a/test/javascript/tests/view_collation_raw.js
+++ b/test/javascript/tests/view_collation_raw.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.elixir = true;
 couchTests.view_collation_raw = function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});