summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe David Borba Manana <fdmanana@apache.org>2011-11-13 11:36:29 +0000
committerFilipe David Borba Manana <fdmanana@apache.org>2011-11-13 11:36:29 +0000
commit2b80b5995ea6f425dd736e16b5a77d5a25178581 (patch)
treeb835b996adcb9af21c700da83911b964851c8af3
parent84940845230b7ce04cc0ffee2575e0541ab607c7 (diff)
downloadcouchdb-2b80b5995ea6f425dd736e16b5a77d5a25178581.tar.gz
Add more tests to test/etap/073-changes.t
Cover deleted changes and built-in filter `_design`.
-rwxr-xr-xtest/etap/073-changes.t99
1 files changed, 94 insertions, 5 deletions
diff --git a/test/etap/073-changes.t b/test/etap/073-changes.t
index 64e710163..efefa5d58 100755
--- a/test/etap/073-changes.t
+++ b/test/etap/073-changes.t
@@ -40,7 +40,8 @@
-record(row, {
id,
- seq
+ seq,
+ deleted = false
}).
@@ -50,7 +51,7 @@ test_db_name() -> <<"couch_test_changes">>.
main(_) ->
test_util:init_code_path(),
- etap:plan(28),
+ etap:plan(39),
case (catch test()) of
ok ->
etap:end_tests();
@@ -67,6 +68,7 @@ test() ->
test_by_doc_ids(),
test_by_doc_ids_with_since(),
test_by_doc_ids_continuous(),
+ test_design_docs_only(),
couch_server_sup:stop(),
ok.
@@ -134,7 +136,7 @@ test_by_doc_ids_with_since() ->
{ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}]}),
{ok, _Rev4} = save_doc(Db, {[{<<"_id">>, <<"doc4">>}]}),
{ok, _Rev5} = save_doc(Db, {[{<<"_id">>, <<"doc5">>}]}),
- {ok, _Rev3_2} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3}]}),
+ {ok, Rev3_2} = save_doc(Db, {[{<<"_id">>, <<"doc3">>}, {<<"_rev">>, Rev3}]}),
{ok, _Rev6} = save_doc(Db, {[{<<"_id">>, <<"doc6">>}]}),
{ok, _Rev7} = save_doc(Db, {[{<<"_id">>, <<"doc7">>}]}),
{ok, _Rev8} = save_doc(Db, {[{<<"_id">>, <<"doc8">>}]}),
@@ -158,6 +160,45 @@ test_by_doc_ids_with_since() ->
etap:is(Seq1, 6, "First row has seq 6"),
stop(Consumer),
+
+ ChangesArgs2 = #changes_args{
+ filter = "_doc_ids",
+ since = 6
+ },
+ Consumer2 = spawn_consumer(test_db_name(), ChangesArgs2, Req),
+
+ {Rows2, LastSeq2} = wait_finished(Consumer2),
+ {ok, Db3} = couch_db:open_int(test_db_name(), []),
+ UpSeq2 = couch_db:get_update_seq(Db3),
+ couch_db:close(Db3),
+ etap:is(LastSeq2, UpSeq2, "LastSeq is same as database update seq number"),
+ etap:is(length(Rows2), 0, "Received 0 change rows"),
+
+ stop(Consumer2),
+
+ {ok, _Rev3_3} = save_doc(
+ Db,
+ {[{<<"_id">>, <<"doc3">>}, {<<"_deleted">>, true}, {<<"_rev">>, Rev3_2}]}),
+
+ ChangesArgs3 = #changes_args{
+ filter = "_doc_ids",
+ since = 9
+ },
+ Consumer3 = spawn_consumer(test_db_name(), ChangesArgs3, Req),
+
+ {Rows3, LastSeq3} = wait_finished(Consumer3),
+ {ok, Db4} = couch_db:open_int(test_db_name(), []),
+ UpSeq3 = couch_db:get_update_seq(Db4),
+ couch_db:close(Db4),
+ etap:is(LastSeq3, UpSeq3, "LastSeq is same as database update seq number"),
+ etap:is(length(Rows3), 1, "Received 1 changes rows"),
+ etap:is(
+ [#row{seq = LastSeq3, id = <<"doc3">>, deleted = true}],
+ Rows3,
+ "Received row with doc3 deleted"),
+
+ stop(Consumer3),
+
delete_db(Db).
@@ -227,6 +268,53 @@ test_by_doc_ids_continuous() ->
delete_db(Db).
+test_design_docs_only() ->
+ {ok, Db} = create_db(test_db_name()),
+
+ {ok, _Rev1} = save_doc(Db, {[{<<"_id">>, <<"doc1">>}]}),
+ {ok, _Rev2} = save_doc(Db, {[{<<"_id">>, <<"doc2">>}]}),
+ {ok, Rev3} = save_doc(Db, {[{<<"_id">>, <<"_design/foo">>}]}),
+
+ ChangesArgs = #changes_args{
+ filter = "_design"
+ },
+ Consumer = spawn_consumer(test_db_name(), ChangesArgs, {json, null}),
+
+ {Rows, LastSeq} = wait_finished(Consumer),
+ {ok, Db2} = couch_db:open_int(test_db_name(), []),
+ UpSeq = couch_db:get_update_seq(Db2),
+ couch_db:close(Db2),
+
+ etap:is(LastSeq, UpSeq, "LastSeq is same as database update seq number"),
+ etap:is(length(Rows), 1, "Received 1 changes rows"),
+ etap:is(Rows, [#row{seq = 3, id = <<"_design/foo">>}], "Received row with ddoc"),
+
+ stop(Consumer),
+
+ {ok, Db3} = couch_db:open_int(
+ test_db_name(), [{user_ctx, #user_ctx{roles = [<<"_admin">>]}}]),
+ {ok, _Rev3_2} = save_doc(
+ Db3,
+ {[{<<"_id">>, <<"_design/foo">>}, {<<"_rev">>, Rev3},
+ {<<"_deleted">>, true}]}),
+
+ Consumer2 = spawn_consumer(test_db_name(), ChangesArgs, {json, null}),
+
+ {Rows2, LastSeq2} = wait_finished(Consumer2),
+ UpSeq2 = UpSeq + 1,
+ couch_db:close(Db3),
+
+ etap:is(LastSeq2, UpSeq2, "LastSeq is same as database update seq number"),
+ etap:is(length(Rows2), 1, "Received 1 changes rows"),
+ etap:is(
+ Rows2,
+ [#row{seq = 4, id = <<"_design/foo">>, deleted = true}],
+ "Received row with deleted ddoc"),
+
+ stop(Consumer2),
+ delete_db(Db).
+
+
save_doc(Db, Json) ->
Doc = couch_doc:from_json_obj(Json),
{ok, Rev} = couch_db:update_doc(Db, Doc, []),
@@ -303,7 +391,8 @@ spawn_consumer(DbName, ChangesArgs0, Req) ->
Callback = fun({change, {Change}, _}, _, Acc) ->
Id = couch_util:get_value(<<"id">>, Change),
Seq = couch_util:get_value(<<"seq">>, Change),
- [#row{id = Id, seq = Seq} | Acc];
+ Del = couch_util:get_value(<<"deleted">>, Change, false),
+ [#row{id = Id, seq = Seq, deleted = Del} | Acc];
({stop, LastSeq}, _, Acc) ->
Parent ! {consumer_finished, lists:reverse(Acc), LastSeq},
stop_loop(Parent, Acc);
@@ -335,7 +424,7 @@ maybe_pause(Parent, Acc) ->
pause_loop(Parent, Acc);
{stop, Ref} ->
Parent ! {ok, Ref},
- Acc
+ throw({stop, Acc})
after 0 ->
Acc
end.