1defmodule ViewConflictsTest do 2 use CouchTestCase 3 4 @moduletag kind: :single_node 5 6 setup_all do 7 db_name_a = random_db_name() 8 db_name_b = random_db_name() 9 10 {:ok, _} = create_db(db_name_a) 11 {:ok, _} = create_db(db_name_b) 12 13 on_exit(fn -> delete_db(db_name_a) end) 14 on_exit(fn -> delete_db(db_name_b) end) 15 {:ok, [db_name_a: db_name_a, db_name_b: db_name_b]} 16 end 17 18 test "view conflict", context do 19 db_name_a = context[:db_name_a] 20 db_name_b = context[:db_name_b] 21 22 create_doc(db_name_a, %{_id: "foo", bar: 42}) 23 replicate(db_name_a, db_name_b) 24 25 resp = Couch.get("/#{db_name_b}/foo") 26 27 docb = 28 resp.body 29 |> Map.put("bar", 43) 30 31 docb = save(db_name_b, docb) 32 33 resp = Couch.get("/#{db_name_a}/foo") 34 35 doca = 36 resp.body 37 |> Map.put("bar", 41) 38 39 doca = save(db_name_a, doca) 40 41 replicate(db_name_a, db_name_b) 42 43 resp = Couch.get("/#{db_name_b}/foo", query: [conflicts: true]) 44 doc = resp.body 45 assert length(resp.body["_conflicts"]) == 1 46 47 conflict_rev = Enum.at(resp.body["_conflicts"], 0) 48 49 case doc["bar"] do 50 41 -> assert conflict_rev == docb["_rev"] 51 43 -> assert conflict_rev == doca["_rev"] 52 _ -> assert false 53 end 54 55 map_fun = """ 56 function(doc) { 57 if (doc._conflicts) { 58 emit(doc._id, doc._conflicts); 59 } 60 } 61 """ 62 63 results = query(db_name_b, map_fun) 64 65 rev = 66 results 67 |> Map.get("rows") 68 |> Enum.at(0) 69 |> Map.get("value") 70 |> Enum.at(0) 71 72 assert conflict_rev == rev 73 end 74end 75