summaryrefslogtreecommitdiff
path: root/test/elixir/test/bulk_docs_test.exs
diff options
context:
space:
mode:
Diffstat (limited to 'test/elixir/test/bulk_docs_test.exs')
-rw-r--r--test/elixir/test/bulk_docs_test.exs155
1 files changed, 0 insertions, 155 deletions
diff --git a/test/elixir/test/bulk_docs_test.exs b/test/elixir/test/bulk_docs_test.exs
deleted file mode 100644
index cbbc53340..000000000
--- a/test/elixir/test/bulk_docs_test.exs
+++ /dev/null
@@ -1,155 +0,0 @@
-defmodule BulkDocsTest do
- use CouchTestCase
-
- @moduletag :bulk_docs
- @moduletag kind: :single_node
-
- @moduledoc """
- Test CouchDB bulk docs
- This is a port of bulk_docs.js
- """
-
- @doc_range 1..5
-
- @tag :with_db
- test "bulk docs can create, update, & delete many docs per request", ctx do
- db = ctx[:db_name]
- docs = create_docs(@doc_range)
- resp = bulk_post(docs, db)
- assert revs_start_with(resp.body, "1-")
- docs = rev(docs, resp.body)
- # Modify each doc's `string` field and re-post
- docs =
- Enum.map(docs, fn doc = %{string: string} ->
- %{doc | string: string <> ".00"}
- end)
-
- resp = bulk_post(docs, db)
- assert revs_start_with(resp.body, "2-")
- docs = rev(docs, resp.body)
- # Confirm changes were applied for each doc
- assert Enum.all?(docs, fn doc ->
- String.ends_with?(Couch.get("/#{db}/#{doc._id}").body["string"], ".00")
- end)
-
- docs = Enum.map(docs, &Map.put(&1, :_deleted, true))
- resp = bulk_post(docs, db)
- assert revs_start_with(resp.body, "3-")
- # Confirm docs were deleted
- assert Enum.all?(docs, fn doc ->
- resp = Couch.get("/#{db}/#{doc._id}")
- assert resp.status_code == 404
- assert resp.body["error"] == "not_found"
- assert resp.body["reason"] == "deleted"
- end)
- end
-
- @tag :with_db
- @tag :skip_on_jenkins
- test "bulk docs can detect conflicts", ctx do
- db = ctx[:db_name]
- docs = create_docs(@doc_range)
- resp = bulk_post(docs, db)
- assert revs_start_with(resp.body, "1-")
- docs = rev(docs, resp.body)
- # Update just the first doc to create a conflict in subsequent bulk update
- doc = hd(docs)
- resp = Couch.put("/#{db}/#{doc._id}", body: doc)
- assert resp.status_code in [201, 202]
- # Attempt to delete all docs
- docs = Enum.map(docs, fn doc -> Map.put(doc, :_deleted, true) end)
-
- retry_until(fn ->
- resp = bulk_post(docs, db)
- # Confirm first doc not updated, and result has no rev field
- res = hd(resp.body)
- assert res["id"] == "1" and res["error"] == "conflict"
- assert Map.get(res, "rev") == nil
- # Confirm other docs updated normally
- assert revs_start_with(tl(resp.body), "2-")
- end)
- end
-
- @tag :with_db
- test "bulk docs supplies `id` if not provided in doc", ctx do
- docs = [%{foo: "bar"}]
- res = hd(bulk_post(docs, ctx[:db_name]).body)
- assert res["id"]
- assert res["rev"]
- end
-
- @tag :with_db
- test "bulk docs raises error for `all_or_nothing` option", ctx do
- opts = [body: %{docs: create_docs(@doc_range), all_or_nothing: true}]
- resp = Couch.post("/#{ctx[:db_name]}/_bulk_docs", opts)
- assert resp.status_code == 417
- assert Enum.all?(resp.body, &(Map.get(&1, "error") == "not_implemented"))
- expected_reason = "all_or_nothing is not supported"
- assert Enum.all?(resp.body, &(Map.get(&1, "reason") == expected_reason))
- end
-
- @tag :with_db
- test "bulk docs raises conflict error for combined update & delete", ctx do
- db = ctx[:db_name]
- doc = %{_id: "id", val: "val"}
- resp = Couch.put("/#{db}/#{doc._id}", body: doc)
- doc = rev(doc, resp.body)
- update = %{doc | val: "newval"}
- delete = Map.put(doc, :_deleted, true)
- body = bulk_post([update, delete], db).body
- assert Enum.count(body, &(Map.get(&1, "error") == "conflict")) == 1
- assert Enum.count(body, &Map.get(&1, "rev")) == 1
- end
-
- @tag :with_db
- test "bulk docs raises error for missing `docs` parameter", ctx do
- docs = [%{foo: "bar"}]
- resp = Couch.post("/#{ctx[:db_name]}/_bulk_docs", body: %{doc: docs})
- assert_bad_request(resp, "POST body must include `docs` parameter.")
- end
-
- @tag :with_db
- test "bulk docs raises error for invlaid `docs` parameter", ctx do
- resp = Couch.post("/#{ctx[:db_name]}/_bulk_docs", body: %{docs: "foo"})
- assert_bad_request(resp, "`docs` parameter must be an array.")
- end
-
- @tag :with_db
- test "bulk docs raises error for invlaid `new_edits` parameter", ctx do
- opts = [body: %{docs: [], new_edits: 0}]
- resp = Couch.post("/#{ctx[:db_name]}/_bulk_docs", opts)
- assert_bad_request(resp, "`new_edits` parameter must be a boolean.")
- end
-
- @tag :with_db
- test "bulk docs emits conflict error for duplicate doc `_id`s", ctx do
- docs = [%{_id: "0", a: 0}, %{_id: "1", a: 1}, %{_id: "1", a: 2}, %{_id: "3", a: 3}]
- rows = bulk_post(docs, ctx[:db_name]).body
- assert Enum.at(rows, 1)["id"] == "1"
- assert Enum.at(rows, 1)["ok"]
- assert Enum.at(rows, 2)["error"] == "conflict"
- end
-
- defp bulk_post(docs, db) do
- retry_until(fn ->
- resp = Couch.post("/#{db}/_bulk_docs", body: %{docs: docs})
-
- assert resp.status_code in [201, 202] and length(resp.body) == length(docs), """
- Expected 201 and the same number of response rows as in request, but got
- #{pretty_inspect(resp)}
- """
-
- resp
- end)
- end
-
- defp revs_start_with(rows, prefix) do
- Enum.all?(rows, fn %{"rev" => rev} -> String.starts_with?(rev, prefix) end)
- end
-
- defp assert_bad_request(resp, reason) do
- assert resp.status_code == 400
- assert resp.body["error"] == "bad_request"
- assert resp.body["reason"] == reason
- end
-end