Fix validation for ddoc name
diff --git a/src/couch_doc.erl b/src/couch_doc.erl
index 11063d9..af14038 100644
--- a/src/couch_doc.erl
+++ b/src/couch_doc.erl
@@ -169,6 +169,10 @@
 
 validate_docid(<<"">>) ->
     throw({illegal_docid, <<"Document id must not be empty">>});
+validate_docid(<<"_design/">>) ->
+    throw({illegal_docid, <<"Illegal document id `_design/`">>});
+validate_docid(<<"_local/">>) ->
+    throw({illegal_docid, <<"Illegal document id `_local/`">>});
 validate_docid(Id) when is_binary(Id) ->
     case couch_util:validate_utf8(Id) of
         false -> throw({illegal_docid, <<"Document id must be valid UTF-8">>});
diff --git a/test/couch_doc_tests.erl b/test/couch_doc_tests.erl
index 2025c25..fce4ff7 100644
--- a/test/couch_doc_tests.erl
+++ b/test/couch_doc_tests.erl
@@ -72,6 +72,34 @@
         couch_doc:len_doc_to_multi_part_stream(Boundary, JsonBytes, Atts, true),
     ok.
 
+validate_docid_test_() ->
+    {setup,
+        fun() ->
+            ok = meck:new(couch_db_plugin, [passthrough]),
+            meck:expect(couch_db_plugin, validate_docid, fun(_) -> false end)
+        end,
+        fun(_) ->
+            meck:unload(couch_db_plugin)
+        end,
+        [
+            ?_assertEqual(ok, couch_doc:validate_docid(<<"idx">>)),
+            ?_assertEqual(ok, couch_doc:validate_docid(<<"_design/idx">>)),
+            ?_assertEqual(ok, couch_doc:validate_docid(<<"_local/idx">>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<>>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<16#80>>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<"_idx">>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<"_">>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<"_design/">>)),
+            ?_assertThrow({illegal_docid, _},
+                couch_doc:validate_docid(<<"_local/">>))
+        ]
+    }.
+
 request(start) ->
     {ok, Doc} = file:read_file(?REQUEST_FIXTURE),
     {Doc, fun() -> request(stop) end};