blob: 05425d3880c24d6b8edd9737feb4e93a43e0645d [file] [log] [blame]
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -pa ./src/couchdb -pa ./src/mochiweb -sasl errlog_type false -noshell
% 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.
%% XXX: Figure out how to -include("couch_db.hrl")
-record(doc, {id= <<"">>, revs={0, []}, body={[]},
atts=[], deleted=false, meta=[]}).
-record(att, {name, type, att_len, disk_len, md5= <<>>, revpos=0, data,
encoding=identity}).
default_config() ->
test_util:build_file("etc/couchdb/default_dev.ini").
main(_) ->
test_util:init_code_path(),
etap:plan(12),
case (catch test()) of
ok ->
etap:end_tests();
Other ->
etap:diag(io_lib:format("Test died abnormally: ~p", [Other])),
etap:bail()
end,
ok.
test() ->
couch_config:start_link([default_config()]),
couch_config:set("attachments", "compression_level", "0"),
ok = test_to_json_success(),
ok.
test_to_json_success() ->
Cases = [
{
#doc{},
{[{<<"_id">>, <<"">>}]},
"Empty docs are {\"_id\": \"\"}"
},
{
#doc{id= <<"foo">>},
{[{<<"_id">>, <<"foo">>}]},
"_id is added."
},
{
#doc{revs={5, ["foo"]}},
{[{<<"_id">>, <<>>}, {<<"_rev">>, <<"5-foo">>}]},
"_rev is added."
},
{
[revs],
#doc{revs={5, [<<"first">>, <<"second">>]}},
{[
{<<"_id">>, <<>>},
{<<"_rev">>, <<"5-first">>},
{<<"_revisions">>, {[
{<<"start">>, 5},
{<<"ids">>, [<<"first">>, <<"second">>]}
]}}
]},
"_revisions include with revs option"
},
{
#doc{body={[{<<"foo">>, <<"bar">>}]}},
{[{<<"_id">>, <<>>}, {<<"foo">>, <<"bar">>}]},
"Arbitrary fields are added."
},
{
#doc{deleted=true, body={[{<<"foo">>, <<"bar">>}]}},
{[{<<"_id">>, <<>>}, {<<"_deleted">>, true}]},
"Deleted docs drop body members."
},
{
#doc{meta=[
{revs_info, 4, [{<<"fin">>, deleted}, {<<"zim">>, missing}]}
]},
{[
{<<"_id">>, <<>>},
{<<"_revs_info">>, [
{[{<<"rev">>, <<"4-fin">>}, {<<"status">>, <<"deleted">>}]},
{[{<<"rev">>, <<"3-zim">>}, {<<"status">>, <<"missing">>}]}
]}
]},
"_revs_info field is added correctly."
},
{
#doc{meta=[{local_seq, 5}]},
{[{<<"_id">>, <<>>}, {<<"_local_seq">>, 5}]},
"_local_seq is added as an integer."
},
{
#doc{meta=[{conflicts, [{3, <<"yep">>}, {1, <<"snow">>}]}]},
{[
{<<"_id">>, <<>>},
{<<"_conflicts">>, [<<"3-yep">>, <<"1-snow">>]}
]},
"_conflicts is added as an array of strings."
},
{
#doc{meta=[{deleted_conflicts, [{10923, <<"big_cowboy_hat">>}]}]},
{[
{<<"_id">>, <<>>},
{<<"_deleted_conflicts">>, [<<"10923-big_cowboy_hat">>]}
]},
"_deleted_conflicsts is added as an array of strings."
},
{
#doc{atts=[
#att{
name = <<"big.xml">>,
type = <<"xml/sucks">>,
data = fun() -> ok end,
revpos = 1,
att_len = 400,
disk_len = 400
},
#att{
name = <<"fast.json">>,
type = <<"json/ftw">>,
data = <<"{\"so\": \"there!\"}">>,
revpos = 1,
att_len = 16,
disk_len = 16
}
]},
{[
{<<"_id">>, <<>>},
{<<"_attachments">>, {[
{<<"big.xml">>, {[
{<<"content_type">>, <<"xml/sucks">>},
{<<"revpos">>, 1},
{<<"length">>, 400},
{<<"stub">>, true}
]}},
{<<"fast.json">>, {[
{<<"content_type">>, <<"json/ftw">>},
{<<"revpos">>, 1},
{<<"length">>, 16},
{<<"stub">>, true}
]}}
]}}
]},
"Attachments attached as stubs only include a length."
},
{
[attachments],
#doc{atts=[
#att{
name = <<"stuff.txt">>,
type = <<"text/plain">>,
data = fun() -> <<"diet pepsi">> end,
revpos = 1,
att_len = 10,
disk_len = 10
},
#att{
name = <<"food.now">>,
type = <<"application/food">>,
revpos = 1,
data = <<"sammich">>
}
]},
{[
{<<"_id">>, <<>>},
{<<"_attachments">>, {[
{<<"stuff.txt">>, {[
{<<"content_type">>, <<"text/plain">>},
{<<"revpos">>, 1},
{<<"data">>, <<"ZGlldCBwZXBzaQ==">>}
]}},
{<<"food.now">>, {[
{<<"content_type">>, <<"application/food">>},
{<<"revpos">>, 1},
{<<"data">>, <<"c2FtbWljaA==">>}
]}}
]}}
]},
"Attachments included inline with attachments option."
}
],
lists:foreach(fun
({Doc, EJson, Mesg}) ->
etap:is(couch_doc:to_json_obj(Doc, []), EJson, Mesg);
({Options, Doc, EJson, Mesg}) ->
etap:is(couch_doc:to_json_obj(Doc, Options), EJson, Mesg)
end, Cases),
ok.