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