Add a failing test for reduce key grouping

I needed to refactor a few things to support multiple ddocs in the
collation test module.

COUCHDB-1805
diff --git a/src/couch_mrview_test_util.erl b/src/couch_mrview_test_util.erl
index 153d8ea..8cebd6d 100644
--- a/src/couch_mrview_test_util.erl
+++ b/src/couch_mrview_test_util.erl
@@ -89,7 +89,7 @@
     ]});
 ddoc(red) ->
     couch_doc:from_json_obj({[
-        {<<"_id">>, <<"_design/bar">>},
+        {<<"_id">>, <<"_design/red">>},
         {<<"views">>, {[
             {<<"baz">>, {[
                 {<<"map">>, <<
@@ -98,6 +98,15 @@
                     "}\n"
                 >>},
                 {<<"reduce">>, <<"function(keys, vals) {return sum(vals);}">>}
+            ]}},
+            {<<"zing">>, {[
+                {<<"map">>, <<
+                    "function(doc) {\n"
+                    "  if(doc.foo !== undefined)\n"
+                    "    emit(doc.foo, null);\n"
+                    "}"
+                >>},
+                {<<"reduce">>, <<"_count">>}
             ]}}
         ]}}
     ]}).
diff --git a/test/couch_mrview_collation_tests.erl b/test/couch_mrview_collation_tests.erl
index 4a03359..c4a714d 100644
--- a/test/couch_mrview_collation_tests.erl
+++ b/test/couch_mrview_collation_tests.erl
@@ -58,7 +58,8 @@
 
 setup() ->
     {ok, Db1} = couch_mrview_test_util:new_db(?tempdb(), map),
-    {ok, Db2} = couch_mrview_test_util:save_docs(Db1, make_docs()),
+    Docs = [couch_mrview_test_util:ddoc(red) | make_docs()],
+    {ok, Db2} = couch_mrview_test_util:save_docs(Db1, Docs),
     Db2.
 
 teardown(Db) ->
@@ -84,7 +85,8 @@
                     fun should_collate_with_inclusive_end_rev/1,
                     fun should_collate_without_inclusive_end_fwd/1,
                     fun should_collate_without_inclusive_end_rev/1,
-                    fun should_collate_with_endkey_docid/1
+                    fun should_collate_with_endkey_docid/1,
+                    fun should_use_collator_for_reduce_grouping/1
                 ]
             }
         }
@@ -173,6 +175,12 @@
         ?assertEqual(Expect1, Result1)
     end).
 
+should_use_collator_for_reduce_grouping(Db) ->
+    UniqueKeys = lists:usort(fun(A, B) ->
+        not couch_ejson_compare:less_json(B, A)
+    end, ?VALUES),
+    {ok, [{meta,_} | Rows]} = reduce_query(Db, [{group_level, exact}]),
+    ?_assertEqual(length(UniqueKeys), length(Rows)).
 
 make_docs() ->
     {Docs, _} = lists:foldl(fun(V, {Docs0, Count}) ->
@@ -194,3 +202,6 @@
 
 run_query(Db, Opts) ->
     couch_mrview:query_view(Db, <<"_design/bar">>, <<"zing">>, Opts).
+
+reduce_query(Db, Opts) ->
+    couch_mrview:query_view(Db, <<"_design/red">>, <<"zing">>, Opts).
diff --git a/test/couch_mrview_red_views_tests.erl b/test/couch_mrview_red_views_tests.erl
index ae3e454..3100785 100644
--- a/test/couch_mrview_red_views_tests.erl
+++ b/test/couch_mrview_red_views_tests.erl
@@ -92,4 +92,4 @@
 
 
 run_query(Db, Opts) ->
-    couch_mrview:query_view(Db, <<"_design/bar">>, <<"baz">>, Opts).
+    couch_mrview:query_view(Db, <<"_design/red">>, <<"baz">>, Opts).