| % 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(couch_mrview_changes_since_tests). |
| |
| -include_lib("couch/include/couch_eunit.hrl"). |
| -include_lib("couch/include/couch_db.hrl"). |
| |
| -define(TIMEOUT, 1000). |
| |
| |
| |
| setup() -> |
| {ok, Db} = couch_mrview_test_util:init_db(?tempdb(), changes), |
| Db. |
| |
| teardown(Db) -> |
| couch_db:close(Db), |
| couch_server:delete(Db#db.name, [?ADMIN_CTX]), |
| ok. |
| |
| |
| changes_since_test() -> |
| { |
| "changes_since tests", |
| { |
| setup, |
| fun test_util:start_couch/0, fun test_util:stop_couch/1, |
| { |
| foreach, |
| fun setup/0, fun teardown/1, |
| [ |
| fun test_basic/1, |
| fun test_range/1, |
| fun test_basic_since/1, |
| fun test_range_since/1, |
| fun test_basic_count/1, |
| fun test_range_count/1, |
| fun test_basic_count_since/1, |
| fun test_range_count_since/1, |
| fun test_compact/1, |
| fun test_remove_key/1 |
| ] |
| } |
| } |
| }. |
| |
| test_basic(Db) -> |
| Result = run_query(Db, 0, []), |
| Expect = {ok, [ |
| {{2, 1, <<"1">>}, 1}, |
| {{3, 10, <<"10">>}, 10}, |
| {{4, 2, <<"2">>}, 2}, |
| {{5, 3, <<"3">>}, 3}, |
| {{6, 4, <<"4">>}, 4}, |
| {{7, 5, <<"5">>}, 5}, |
| {{8, 6, <<"6">>}, 6}, |
| {{9, 7, <<"7">>}, 7}, |
| {{10, 8, <<"8">>}, 8}, |
| {{11, 9, <<"9">>}, 9} |
| ]}, |
| ?_assertEqual(Result, Expect). |
| |
| |
| test_range(Db) -> |
| Result = run_query(Db, 0, [{start_key, 3}, {end_key, 5}]), |
| Expect = {ok, [ |
| {{5, 3, <<"3">>}, 3}, |
| {{6, 4, <<"4">>}, 4}, |
| {{7, 5, <<"5">>}, 5} |
| ]}, |
| ?_assertEqual(Result, Expect). |
| |
| test_basic_since(Db) -> |
| Result = run_query(Db, 5, []), |
| Expect = {ok, [ |
| {{6, 4, <<"4">>}, 4}, |
| {{7, 5, <<"5">>}, 5}, |
| {{8, 6, <<"6">>}, 6}, |
| {{9, 7, <<"7">>}, 7}, |
| {{10, 8, <<"8">>}, 8}, |
| {{11, 9, <<"9">>}, 9} |
| ]}, |
| ?_assertEqual(Result, Expect). |
| |
| test_range_since(Db) -> |
| Result = run_query(Db, 5, [{start_key, 3}, {end_key, 5}]), |
| Expect = {ok, [ |
| {{6, 4, <<"4">>}, 4}, |
| {{7, 5, <<"5">>}, 5} |
| ]}, |
| ?_assertEqual(Result, Expect). |
| |
| test_basic_count(Db) -> |
| Result = run_count_query(Db, 0, []), |
| ?_assertEqual(Result, 10). |
| |
| test_range_count(Db) -> |
| Result = run_count_query(Db, 0, [{start_key, 3}, {end_key, 5}]), |
| ?_assertEqual(Result, 3). |
| |
| test_basic_count_since(Db) -> |
| Result = run_count_query(Db, 5, []), |
| ?_assertEqual(Result, 6). |
| |
| test_range_count_since(Db) -> |
| Result = run_count_query(Db, 5, [{start_key, 3}, {end_key, 5}]), |
| ?_assertEqual(Result, 2). |
| |
| test_compact(Db) -> |
| Result = couch_mrview:compact(Db, <<"_design/bar">>), |
| ?_assertEqual(Result, ok), |
| Count = run_count_query(Db, 0, []), |
| ?_assertEqual(Count, 10). |
| |
| test_remove_key(Db) -> |
| %% add new doc |
| Doc = couch_mrview_test_util:doc(11), |
| {ok, Rev} = couch_db:update_doc(Db, Doc, []), |
| RevStr = couch_doc:rev_to_str(Rev), |
| {ok, _} = couch_db:ensure_full_commit(Db), |
| {ok, Db1} = couch_db:reopen(Db), |
| Result = run_count_query(Db1, 0, []), |
| ?_assertEqual(Result, 11), |
| %% check new view key |
| Result1 = run_query(Db1, 0, [{start_key, 11}, {end_key, 11}]), |
| Expect = {ok, [ |
| {{12, 11, <<"11">>}, 11} |
| ]}, |
| ?_assertEqual(Result1, Expect), |
| |
| %% delete doc |
| Doc2 = couch_doc:from_json_obj({[ |
| {<<"_id">>, <<"11">>}, |
| {<<"_rev">>, RevStr}, |
| {<<"_deleted">>, true} |
| ]}), |
| {ok, _} = couch_db:update_doc(Db1, Doc2, []), |
| {ok, Db2} = couch_db:reopen(Db1), |
| Result2 = run_count_query(Db2, 0, []), |
| ?_assertEqual(Result2, 11), |
| %% check new view key |
| Result3 = run_query(Db2, 0, [{start_key, 11}, {end_key, 11}]), |
| Expect2 = {ok, [ |
| {{13, 11, <<"11">>}, {[{<<"_removed">>, true}]}} |
| ]}, |
| ?_assertEqual(Result3, Expect2). |
| |
| run_query(Db, Since, Opts) -> |
| Fun = fun(KV, Acc) -> {ok, [KV | Acc]} end, |
| {ok, R} = couch_mrview:view_changes_since(Db, <<"_design/bar">>, <<"baz">>, |
| Since, Fun, Opts, []), |
| {ok, lists:reverse(R)}. |
| |
| run_count_query(Db, Since, Opts) -> |
| couch_mrview:count_view_changes_since(Db, <<"_design/bar">>, <<"baz">>, |
| Since, Opts). |