summaryrefslogtreecommitdiff
path: root/test/elixir/test/replicator_db_by_doc_id_test.exs
diff options
context:
space:
mode:
Diffstat (limited to 'test/elixir/test/replicator_db_by_doc_id_test.exs')
-rw-r--r--test/elixir/test/replicator_db_by_doc_id_test.exs121
1 files changed, 121 insertions, 0 deletions
diff --git a/test/elixir/test/replicator_db_by_doc_id_test.exs b/test/elixir/test/replicator_db_by_doc_id_test.exs
new file mode 100644
index 000000000..2e68f2ca9
--- /dev/null
+++ b/test/elixir/test/replicator_db_by_doc_id_test.exs
@@ -0,0 +1,121 @@
+defmodule ReplicatorDBByDocIdTest do
+ use CouchTestCase
+
+ @moduledoc """
+ This is a port of the replicator_db_by_doc_id.js suite
+ """
+
+ @docs [
+ %{
+ _id: "foo1",
+ value: 11
+ },
+ %{
+ _id: "foo2",
+ value: 22
+ },
+ %{
+ _id: "foo3",
+ value: 33
+ }
+ ]
+
+ test "replicatior db by doc id" do
+ name = random_db_name()
+ src_db_name = name <> "_src"
+ tgt_db_name = name <> "_tgt"
+
+ create_db(src_db_name)
+ create_db(tgt_db_name)
+ delete_db_on_exit([src_db_name, tgt_db_name])
+
+ # Populate src DB
+ ddocs = [
+ %{
+ _id: "_design/mydesign",
+ language: "javascript"
+ }
+ ]
+
+ docs = @docs ++ ddocs
+ bulk_save(src_db_name, docs)
+
+ src_db_url = Couch.process_url("/#{src_db_name}")
+ tgt_db_url = build_tgt_uri(tgt_db_name)
+
+ replication_doc = %{
+ _id: "foo_cont_rep_#{name}",
+ source: src_db_url,
+ target: tgt_db_url,
+ doc_ids: ["foo666", "foo3", "_design/mydesign", "foo999", "foo1"]
+ }
+
+ {:ok, repdoc} = create_doc("_replicator", replication_doc)
+ delete_doc_on_exit("_replicator", repdoc.body["id"])
+
+ retry_until(fn ->
+ resp = Couch.get("/_replicator/#{replication_doc[:_id]}")
+ assert resp.body["_replication_state"] == "completed"
+ resp
+ end)
+
+ copy_resp = Couch.get("/#{tgt_db_name}/foo1")
+ assert copy_resp.status_code == 200
+ assert copy_resp.body["value"] === 11
+
+ copy_resp = Couch.get("/#{tgt_db_name}/foo2")
+ assert copy_resp.status_code == 404
+
+ copy_resp = Couch.get("/#{tgt_db_name}/foo3")
+ assert copy_resp.status_code == 200
+ assert copy_resp.body["value"] === 33
+
+ copy_resp = Couch.get("/#{tgt_db_name}/foo666")
+ assert copy_resp.status_code == 404
+
+ copy_resp = Couch.get("/#{tgt_db_name}/foo999")
+ assert copy_resp.status_code == 404
+
+ # Javascript test suite was executed with admin party
+ # the design doc was created during replication.
+ # Elixir test suite is executed configuring an admin.
+ # The auth info should be provided for the tgt db in order to
+ # create the design doc during replication
+ copy_resp = Couch.get("/#{tgt_db_name}/_design/mydesign")
+ assert copy_resp.status_code == 200
+
+ resp = Couch.get("/_replicator/#{replication_doc[:_id]}")
+ assert resp.status_code == 200
+ assert resp.body["_replication_stats"]["revisions_checked"] == 3
+ assert resp.body["_replication_stats"]["missing_revisions_found"] == 3
+ assert resp.body["_replication_stats"]["docs_read"] == 3
+ assert resp.body["_replication_stats"]["docs_written"] == 3
+ assert resp.body["_replication_stats"]["doc_write_failures"] == 0
+ end
+
+ defp build_tgt_uri(db_name) do
+ username = System.get_env("EX_USERNAME") || "adm"
+ password = System.get_env("EX_PASSWORD") || "pass"
+
+ "/#{db_name}"
+ |> Couch.process_url()
+ |> URI.parse()
+ |> Map.put(:userinfo, "#{username}:#{password}")
+ |> URI.to_string()
+ end
+
+ def delete_db_on_exit(db_names) when is_list(db_names) do
+ on_exit(fn ->
+ Enum.each(db_names, fn name ->
+ delete_db(name)
+ end)
+ end)
+ end
+
+ def delete_doc_on_exit(db_name, doc_id) do
+ on_exit(fn ->
+ resp = Couch.get("/#{db_name}/#{doc_id}")
+ Couch.delete("/#{db_name}/#{doc_id}?rev=#{resp.body["_rev"]}")
+ end)
+ end
+end