blob: 916b63207ee37a7d266eefd347f7d2245663521c [file] [log] [blame]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-module(couch_db_doc_tests).
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch/include/couch_db.hrl").
start() ->
test_util:start_couch([ioq]).
setup() ->
DbName = ?tempdb(),
config:set("couchdb", "stem_interactive_updates", "false", false),
{ok, Db} = couch_db:create(DbName, [?ADMIN_CTX]),
couch_db:close(Db),
DbName.
teardown(DbName) ->
ok = couch_server:delete(DbName, [?ADMIN_CTX]),
ok.
couch_db_doc_test_() ->
{
"CouchDB doc tests",
{
setup,
fun start/0, fun test_util:stop_couch/1,
{
foreach,
fun setup/0, fun teardown/1,
[
fun should_truncate_number_of_revisions/1,
fun should_raise_bad_request_on_invalid_rev/1,
fun should_allow_access_in_doc_keys_test/1
]
}
}
}.
should_truncate_number_of_revisions(DbName) ->
DocId = <<"foo">>,
Db = open_db(DbName),
couch_db:set_revs_limit(Db, 5),
Rev = create_doc(Db, DocId),
Rev10 = add_revisions(Db, DocId, Rev, 10),
{ok, [{ok, #doc{revs = {11, Revs}}}]} = open_doc_rev(Db, DocId, Rev10),
?_assertEqual(5, length(Revs)).
should_raise_bad_request_on_invalid_rev(DbName) ->
DocId = <<"foo">>,
InvalidRev1 = <<"foo">>,
InvalidRev2 = <<"a-foo">>,
InvalidRev3 = <<"1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">>,
Expect = {bad_request, <<"Invalid rev format">>},
Db = open_db(DbName),
create_doc(Db, DocId),
[
{InvalidRev1,
?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev1, 1))},
{InvalidRev2,
?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev2, 1))},
{InvalidRev3,
?_assertThrow(Expect, add_revisions(Db, DocId, InvalidRev3, 1))}
].
should_allow_access_in_doc_keys_test(_DbName) ->
Json = <<"{\"_id\":\"foo\",\"_access\":[\"test\"]}">>,
EJson = couch_util:json_decode(Json),
Expected = {[{<<"_id">>,<<"foo">>}, {<<"_access">>, [<<"test">>]}]},
EJson = Expected,
Doc = couch_doc:from_json_obj(EJson),
NewEJson = couch_doc:to_json_obj(Doc, []),
?_assertEqual(NewEJson, Expected).
open_db(DbName) ->
{ok, Db} = couch_db:open_int(DbName, [?ADMIN_CTX]),
Db.
create_doc(Db, DocId) ->
add_revision(Db, DocId, undefined).
open_doc_rev(Db0, DocId, Rev) ->
{ok, Db} = couch_db:reopen(Db0),
couch_db:open_doc_revs(Db, DocId, [couch_doc:parse_rev(Rev)], []).
add_revision(Db, DocId, undefined) ->
add_revision(Db, DocId, []);
add_revision(Db, DocId, Rev) when is_binary(Rev) ->
add_revision(Db, DocId, [{<<"_rev">>, Rev}]);
add_revision(Db0, DocId, Rev) ->
{ok, Db} = couch_db:reopen(Db0),
Doc = couch_doc:from_json_obj({[
{<<"_id">>, DocId},
{<<"value">>, DocId}
] ++ Rev}),
{ok, NewRev} = couch_db:update_doc(Db, Doc, []),
couch_doc:rev_to_str(NewRev).
add_revisions(Db, DocId, Rev, N) ->
lists:foldl(fun(_, OldRev) ->
add_revision(Db, DocId, OldRev)
end, Rev, lists:seq(1, N)).