summaryrefslogtreecommitdiff
path: root/test/elixir/test/view_multi_key_all_docs_test.exs
diff options
context:
space:
mode:
Diffstat (limited to 'test/elixir/test/view_multi_key_all_docs_test.exs')
-rw-r--r--test/elixir/test/view_multi_key_all_docs_test.exs194
1 files changed, 194 insertions, 0 deletions
diff --git a/test/elixir/test/view_multi_key_all_docs_test.exs b/test/elixir/test/view_multi_key_all_docs_test.exs
new file mode 100644
index 000000000..c98390580
--- /dev/null
+++ b/test/elixir/test/view_multi_key_all_docs_test.exs
@@ -0,0 +1,194 @@
+defmodule ViewMultiKeyAllDocsTest do
+ use CouchTestCase
+
+ @moduletag :view_multi_key_all_docs
+ @moduletag kind: :single_node
+
+ @keys ["10", "15", "30", "37", "50"]
+
+ setup_all do
+ db_name = random_db_name()
+ {:ok, _} = create_db(db_name)
+ on_exit(fn -> delete_db(db_name) end)
+
+ bulk_save(db_name, make_docs(0..99))
+
+ {:ok, [db_name: db_name]}
+ end
+
+ test "keys in POST body", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, nil, @keys)
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == length(@keys)
+
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == @keys
+ end
+
+ test "keys in GET parameters", context do
+ db_name = context[:db_name]
+ resp = all_docs(db_name, keys: :jiffy.encode(@keys))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == length(@keys)
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == @keys
+ end
+
+ test "keys in POST body (limit)", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, [limit: 1], @keys)
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 1
+ assert Enum.at(rows, 0)["id"] == Enum.at(@keys, 0)
+ end
+
+ test "keys in GET parameters (limit)", context do
+ db_name = context[:db_name]
+ resp = all_docs(db_name, limit: 1, keys: :jiffy.encode(@keys))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 1
+ assert Enum.at(rows, 0)["id"] == Enum.at(@keys, 0)
+ end
+
+ test "keys in POST body (skip)", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, [skip: 2], @keys)
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 3
+
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == Enum.drop(@keys, 2)
+ end
+
+ test "keys in GET parameters (skip)", context do
+ db_name = context[:db_name]
+ resp = all_docs(db_name, skip: 2, keys: :jiffy.encode(@keys))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 3
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == Enum.drop(@keys, 2)
+ end
+
+ test "keys in POST body (descending)", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, [descending: true], @keys)
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == length(@keys)
+
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == Enum.reverse(@keys)
+ end
+
+ test "keys in GET parameters (descending)", context do
+ db_name = context[:db_name]
+ resp = all_docs(db_name, descending: true, keys: :jiffy.encode(@keys))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == length(@keys)
+ rows_id = Enum.map(rows, & &1["id"])
+ assert rows_id == Enum.reverse(@keys)
+ end
+
+ test "keys in POST body (descending, skip, limit)", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, [descending: "true", skip: 3, limit: 1], @keys)
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 1
+
+ key =
+ @keys
+ |> Enum.reverse()
+ |> Enum.drop(3)
+ |> Enum.at(0)
+
+ assert Enum.at(rows, 0)["id"] == key
+ end
+
+ test "keys in GET parameters (descending, skip, limit)", context do
+ db_name = context[:db_name]
+
+ resp =
+ all_docs(db_name, descending: "true", skip: 3, limit: 1, keys: :jiffy.encode(@keys))
+
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 1
+
+ key =
+ @keys
+ |> Enum.reverse()
+ |> Enum.drop(3)
+ |> Enum.at(0)
+
+ assert Enum.at(rows, 0)["id"] == key
+ end
+
+ test "POST - get invalid rows when the key doesn't exist", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, nil, ["1211", "i_dont_exist", "0"])
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 3
+ assert Enum.at(rows, 0)["error"] == "not_found"
+ assert not Map.has_key?(Enum.at(rows, 0), "id")
+ assert Enum.at(rows, 1)["error"] == "not_found"
+ assert not Map.has_key?(Enum.at(rows, 1), "id")
+ assert Enum.at(rows, 2)["id"] == Enum.at(rows, 2)["key"]
+ assert Enum.at(rows, 2)["key"] == "0"
+ end
+
+ test "GET - get invalid rows when the key doesn't exist", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, keys: :jiffy.encode(["1211", "i_dont_exist", "0"]))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert length(rows) == 3
+ assert Enum.at(rows, 0)["error"] == "not_found"
+ assert not Map.has_key?(Enum.at(rows, 0), "id")
+ assert Enum.at(rows, 1)["error"] == "not_found"
+ assert not Map.has_key?(Enum.at(rows, 1), "id")
+ assert Enum.at(rows, 2)["id"] == Enum.at(rows, 2)["key"]
+ assert Enum.at(rows, 2)["key"] == "0"
+ end
+
+ test "empty keys", context do
+ db_name = context[:db_name]
+
+ resp = all_docs(db_name, keys: :jiffy.encode([]))
+ assert resp.status_code == 200
+ rows = resp.body["rows"]
+ assert Enum.empty?(rows)
+ end
+
+ defp all_docs(db_name, options, keys \\ nil) do
+ resp =
+ case keys do
+ nil ->
+ Couch.get("/#{db_name}/_all_docs", query: options)
+
+ _ ->
+ Couch.post("/#{db_name}/_all_docs",
+ query: options,
+ body: %{"keys" => keys}
+ )
+ end
+
+ resp
+ end
+end