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};