blob: 3da62f042164b8ed927d359fec987617775525cd [file] [log] [blame]
defmodule AttachmentViewTest do
use CouchTestCase
@moduletag :attachments
@moduledoc """
Test CouchDB attachment views requests
This is a port of the attachment_views.js suite
"""
@tag :with_db
test "manages attachments in views successfully", context do
db_name = context[:db_name]
attachment_data = "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
attachment_template_1 = %{
"_attachments" => %{
"foo.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
}
}
}
attachment_template_2 = %{
"_attachments" => %{
"foo.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
},
"bar.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
}
}
}
attachment_template_3 = %{
"_attachments" => %{
"foo.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
},
"bar.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
},
"baz.txt" => %{
"content_type" => "text/plain",
"data" => attachment_data
}
}
}
bulk_save(db_name, make_docs(0..9))
bulk_save(db_name, make_docs(10..19, attachment_template_1))
bulk_save(db_name, make_docs(20..29, attachment_template_2))
bulk_save(db_name, make_docs(30..39, attachment_template_3))
map_function = """
function(doc) {
var count = 0;
for(var idx in doc._attachments) {
count = count + 1;
}
emit(parseInt(doc._id), count);
}
"""
reduce_function = """
function(key, values) {
return sum(values);
}
"""
result = query(db_name, map_function, reduce_function)
assert length(result["rows"]) == 1
assert Enum.at(result["rows"], 0)["value"] == 60
result =
query(db_name, map_function, reduce_function, %{
startkey: 10,
endkey: 19
})
assert length(result["rows"]) == 1
assert Enum.at(result["rows"], 0)["value"] == 10
result = query(db_name, map_function, reduce_function, %{startkey: 20, endkey: 29})
assert length(result["rows"]) == 1
assert Enum.at(result["rows"], 0)["value"] == 20
result =
query(db_name, map_function, nil, %{
startkey: 30,
endkey: 39,
include_docs: true
})
assert length(result["rows"]) == 10
assert Enum.at(result["rows"], 0)["value"] == 3
attachment = Enum.at(result["rows"], 0)["doc"]["_attachments"]["baz.txt"]
assert attachment["stub"] == true
assert Map.has_key?(attachment, "data") == false
assert Map.has_key?(attachment, "encoding") == false
assert Map.has_key?(attachment, "encoded_length") == false
result =
query(db_name, map_function, nil, %{
startkey: 30,
endkey: 39,
include_docs: true,
attachments: true
})
assert length(result["rows"]) == 10
assert Enum.at(result["rows"], 0)["value"] == 3
attachment = Enum.at(result["rows"], 0)["doc"]["_attachments"]["baz.txt"]
assert attachment["data"] == attachment_data
assert Map.has_key?(attachment, "stub") == false
assert Map.has_key?(attachment, "encoding") == false
assert Map.has_key?(attachment, "encoded_length") == false
result =
query(db_name, map_function, nil, %{
startkey: 30,
endkey: 39,
include_docs: true,
att_encoding_info: true
})
assert length(result["rows"]) == 10
assert Enum.at(result["rows"], 0)["value"] == 3
attachment = Enum.at(result["rows"], 0)["doc"]["_attachments"]["baz.txt"]
assert attachment["stub"] == true
assert attachment["encoding"] == "gzip"
assert attachment["encoded_length"] == 47
assert Map.has_key?(attachment, "data") == false
end
end