Add filtered with query replication test
diff --git a/test/couch_replicator_filtered_tests.erl b/test/couch_replicator_filtered_tests.erl
index 71aabfb..d39aabd 100644
--- a/test/couch_replicator_filtered_tests.erl
+++ b/test/couch_replicator_filtered_tests.erl
@@ -21,6 +21,16 @@
     {<<"filters">>, {[
         {<<"testfilter">>, <<"
             function(doc, req){if (doc.class == 'mammal') return true;}
+        ">>},
+        {<<"queryfilter">>, <<"
+            function(doc, req) {
+                if (doc.class && req.query.starts) {
+                    return doc.class.indexOf(req.query.starts) === 0;
+                }
+                else {
+                    return false;
+                }
+            }
         ">>}
     ]}}
 ]}).
@@ -50,6 +60,18 @@
         }
     }.
 
+query_filtered_replication_test_() ->
+    Pairs = [{local, local}, {local, remote},
+             {remote, local}, {remote, remote}],
+    {
+        "Filtered with query replication tests",
+        {
+            foreachx,
+            fun setup/1, fun teardown/2,
+            [{Pair, fun should_succeed_with_query/2} || Pair <- Pairs]
+        }
+    }.
+
 should_succeed({From, To}, {_Ctx, {Source, Target}}) ->
     RepObject = {[
         {<<"source">>, db_url(From, Source)},
@@ -72,6 +94,32 @@
         ?_assert(lists:all(fun(Valid) -> Valid end, AllReplies))}
     ]}.
 
+should_succeed_with_query({From, To}, {_Ctx, {Source, Target}}) ->
+    RepObject = {[
+        {<<"source">>, db_url(From, Source)},
+        {<<"target">>, db_url(To, Target)},
+        {<<"filter">>, <<"filter_ddoc/queryfilter">>},
+        {<<"query_params">>, {[
+            {<<"starts">>, <<"a">>}
+        ]}}
+    ]},
+    {ok, _} = couch_replicator:replicate(RepObject, ?ADMIN_USER),
+    FilterFun = fun(_DocId, {Props}) ->
+        case couch_util:get_value(<<"class">>, Props) of
+            <<"a", _/binary>> -> true;
+            _ -> false
+        end
+    end,
+    {ok, TargetDbInfo, AllReplies} = compare_dbs(Source, Target, FilterFun),
+    {lists:flatten(io_lib:format("~p -> ~p", [From, To])), [
+        {"Target DB has proper number of docs",
+        ?_assertEqual(2, proplists:get_value(doc_count, TargetDbInfo))},
+        {"Target DB doesn't have deleted docs",
+        ?_assertEqual(0, proplists:get_value(doc_del_count, TargetDbInfo))},
+        {"All the docs filtered as expected",
+        ?_assert(lists:all(fun(Valid) -> Valid end, AllReplies))}
+    ]}.
+
 compare_dbs(Source, Target, FilterFun) ->
     {ok, SourceDb} = couch_db:open_int(Source, []),
     {ok, TargetDb} = couch_db:open_int(Target, []),
@@ -120,6 +168,7 @@
     ]}),
     Doc2 = couch_doc:from_json_obj({[
         {<<"_id">>, <<"doc2">>},
+        {<<"class">>, <<"amphibians">>},
         {<<"value">>, 2}
 
     ]}),
@@ -129,7 +178,13 @@
         {<<"value">>, 3}
 
     ]}),
-    {ok, _} = couch_db:update_docs(Db, [DDoc, Doc1, Doc2, Doc3]),
+    Doc4 = couch_doc:from_json_obj({[
+        {<<"_id">>, <<"doc4">>},
+        {<<"class">>, <<"arthropods">>},
+        {<<"value">>, 2}
+
+    ]}),
+    {ok, _} = couch_db:update_docs(Db, [DDoc, Doc1, Doc2, Doc3, Doc4]),
     couch_db:ensure_full_commit(Db),
     couch_db:close(Db).