Add tests for filter by filter function
diff --git a/test/couch_changes_tests.erl b/test/couch_changes_tests.erl
index fa64e9e..3c0e5f6 100644
--- a/test/couch_changes_tests.erl
+++ b/test/couch_changes_tests.erl
@@ -66,6 +66,7 @@
                 filter_by_design(),
                 continuous_feed(),
                 %%filter_by_custom_function()
+                filter_by_filter_function(),
                 filter_by_view()
             ]
         }
@@ -131,6 +132,19 @@
         }
     }.
 
+filter_by_filter_function() ->
+    {
+        "Filter by filters",
+        {
+            foreach,
+            fun setup/0, fun teardown/1,
+            [
+                fun should_filter_by_doc_attribute/1,
+                fun should_filter_by_user_ctx/1
+            ]
+        }
+    }.
+
 filter_by_view() ->
     {
         "Filter _view",
@@ -590,6 +604,60 @@
              ?assert(Heartbeats3 > Heartbeats2)
         end)}.
 
+should_filter_by_doc_attribute({DbName, _}) ->
+    ?_test(
+        begin
+            DDocId = <<"_design/app">>,
+            DDoc = couch_doc:from_json_obj({[
+                {<<"_id">>, DDocId},
+                {<<"language">>, <<"javascript">>},
+                {<<"filters">>, {[
+                    {<<"valid">>, <<"function(doc, req) {"
+                    " if (doc._id == 'doc3') {"
+                        " return true; "
+                    "} }">>}
+                ]}}
+            ]}),
+            ChArgs = #changes_args{filter = "app/valid"},
+            Req = {json_req, null},
+            ok = update_ddoc(DbName, DDoc),
+            {Rows, LastSeq, UpSeq} = run_changes_query(DbName, ChArgs, Req),
+            ?assertEqual(1, length(Rows)),
+            [#row{seq = Seq, id = Id}] = Rows,
+            ?assertEqual(<<"doc3">>, Id),
+            ?assertEqual(6, Seq),
+            ?assertEqual(UpSeq, LastSeq)
+        end).
+
+should_filter_by_user_ctx({DbName, _}) ->
+    ?_test(
+        begin
+            DDocId = <<"_design/app">>,
+            DDoc = couch_doc:from_json_obj({[
+                {<<"_id">>, DDocId},
+                {<<"language">>, <<"javascript">>},
+                {<<"filters">>, {[
+                    {<<"valid">>, <<"function(doc, req) {"
+                    " if (req.userCtx.name == doc._id) {"
+                        " return true; "
+                    "} }">>}
+                ]}}
+            ]}),
+            ChArgs = #changes_args{filter = "app/valid"},
+            UserCtx = #user_ctx{name = <<"doc3">>, roles = []},
+            DbRec = #db{name = DbName, user_ctx = UserCtx},
+            Req = {json_req, {[{
+                <<"userCtx">>, couch_util:json_user_ctx(DbRec)
+            }]}},
+            ok = update_ddoc(DbName, DDoc),
+            {Rows, LastSeq, UpSeq} = run_changes_query(DbName, ChArgs, Req),
+            ?assertEqual(1, length(Rows)),
+            [#row{seq = Seq, id = Id}] = Rows,
+            ?assertEqual(<<"doc3">>, Id),
+            ?assertEqual(6, Seq),
+            ?assertEqual(UpSeq, LastSeq)
+        end).
+
 should_filter_by_view({DbName, _}) ->
     ?_test(
         begin