summaryrefslogtreecommitdiff
path: root/src/fabric/test/fabric2_changes_fold_tests.erl
blob: 892b448b4d000206e20748aa898b978ec76563a2 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(fabric2_changes_fold_tests).


-include_lib("couch/include/couch_db.hrl").
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("eunit/include/eunit.hrl").


-define(DOC_COUNT, 25).


changes_fold_test_() ->
    {
        "Test changes fold operations",
        {
            setup,
            fun setup/0,
            fun cleanup/1,
            {with, [
                fun fold_changes_basic/1,
                fun fold_changes_since_now/1,
                fun fold_changes_since_seq/1,
                fun fold_changes_basic_rev/1,
                fun fold_changes_since_now_rev/1,
                fun fold_changes_since_seq_rev/1
            ]}
        }
    }.


setup() ->
    Ctx = test_util:start_couch([fabric]),
    {ok, Db} = fabric2_db:create(?tempdb(), [{user_ctx, ?ADMIN_USER}]),
    Rows = lists:map(fun(Val) ->
        DocId = fabric2_util:uuid(),
        Doc = #doc{
            id = DocId,
            body = {[{<<"value">>, Val}]}
        },
        {ok, RevId} = fabric2_db:update_doc(Db, Doc, []),
        UpdateSeq = fabric2_db:get_update_seq(Db),
        #{
            id => DocId,
            sequence => UpdateSeq,
            deleted => false,
            rev_id => RevId
        }
    end, lists:seq(1, ?DOC_COUNT)),
    {Db, Rows, Ctx}.


cleanup({Db, _DocIdRevs, Ctx}) ->
    ok = fabric2_db:delete(fabric2_db:name(Db), []),
    test_util:stop_couch(Ctx).


fold_changes_basic({Db, DocRows, _}) ->
    {ok, Rows} = fabric2_db:fold_changes(Db, 0, fun fold_fun/2, []),
    ?assertEqual(lists:reverse(DocRows), Rows).


fold_changes_since_now({Db, _, _}) ->
    {ok, Rows} = fabric2_db:fold_changes(Db, now, fun fold_fun/2, []),
    ?assertEqual([], Rows).


fold_changes_since_seq({_, [], _}) ->
    ok;

fold_changes_since_seq({Db, [Row | RestRows], _}) ->
    #{sequence := Since} = Row,
    {ok, Rows} = fabric2_db:fold_changes(Db, Since, fun fold_fun/2, []),
    ?assertEqual(lists:reverse(RestRows), Rows),
    fold_changes_since_seq({Db, RestRows, nil}).


fold_changes_basic_rev({Db, _, _}) ->
    Opts = [{dir, rev}],
    {ok, Rows} = fabric2_db:fold_changes(Db, 0, fun fold_fun/2, [], Opts),
    ?assertEqual([], Rows).


fold_changes_since_now_rev({Db, DocRows, _}) ->
    Opts = [{dir, rev}],
    {ok, Rows} = fabric2_db:fold_changes(Db, now, fun fold_fun/2, [], Opts),
    ?assertEqual(DocRows, Rows).


fold_changes_since_seq_rev({_, [], _}) ->
    ok;

fold_changes_since_seq_rev({Db, DocRows, _}) ->
    #{sequence := Since} = lists:last(DocRows),
    Opts = [{dir, rev}],
    {ok, Rows} = fabric2_db:fold_changes(Db, Since, fun fold_fun/2, [], Opts),
    ?assertEqual(DocRows, Rows),
    RestRows = lists:sublist(DocRows, length(DocRows) - 1),
    fold_changes_since_seq_rev({Db, RestRows, nil}).


fold_fun(#{} = Change, Acc) ->
    {ok, [Change | Acc]}.