summaryrefslogtreecommitdiff
path: root/test/elixir/test/view_conflicts_test.exs
blob: 89d9cb4eb23c679bdc9e90959bfd0df0e680a653 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
defmodule ViewConflictsTest do
  use CouchTestCase

  @moduletag :view_conflicts
  @moduletag kind: :single_node

  setup_all do
    db_name_a = random_db_name()
    db_name_b = random_db_name()

    {:ok, _} = create_db(db_name_a)
    {:ok, _} = create_db(db_name_b)

    on_exit(fn -> delete_db(db_name_a) end)
    on_exit(fn -> delete_db(db_name_b) end)
    {:ok, [db_name_a: db_name_a, db_name_b: db_name_b]}
  end

  test "view conflict", context do
    db_name_a = context[:db_name_a]
    db_name_b = context[:db_name_b]

    create_doc(db_name_a, %{_id: "foo", bar: 42})
    replicate(db_name_a, db_name_b)

    resp = Couch.get("/#{db_name_b}/foo")

    docb =
      resp.body
      |> Map.put("bar", 43)

    docb = save(db_name_b, docb)

    resp = Couch.get("/#{db_name_a}/foo")

    doca =
      resp.body
      |> Map.put("bar", 41)

    doca = save(db_name_a, doca)

    replicate(db_name_a, db_name_b)

    resp = Couch.get("/#{db_name_b}/foo", query: [conflicts: true])
    doc = resp.body
    assert length(resp.body["_conflicts"]) == 1

    conflict_rev = Enum.at(resp.body["_conflicts"], 0)

    case doc["bar"] do
      41 -> assert conflict_rev == docb["_rev"]
      43 -> assert conflict_rev == doca["_rev"]
      _ -> assert false
    end

    map_fun = """
    function(doc) {
      if (doc._conflicts) {
        emit(doc._id, doc._conflicts);
      }
    }
    """

    results = query(db_name_b, map_fun)

    rev =
      results
      |> Map.get("rows")
      |> Enum.at(0)
      |> Map.get("value")
      |> Enum.at(0)

    assert conflict_rev == rev
  end
end