2017-07-04 12:11:06 -04:00
|
|
|
require "test_helper"
|
|
|
|
require "database/setup"
|
|
|
|
|
2017-07-27 16:15:38 -04:00
|
|
|
class ActiveStorage::DiskControllerTest < ActionDispatch::IntegrationTest
|
2017-07-04 12:11:06 -04:00
|
|
|
test "showing blob inline" do
|
2017-07-25 21:03:48 -04:00
|
|
|
blob = create_blob
|
2017-07-27 16:52:57 -04:00
|
|
|
key = ActiveStorage.verifier.generate(blob.key, expires_in: 5.minutes, purpose: :blob_key)
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
get rails_disk_service_url(key, blob.filename, content_type: blob.content_type)
|
2017-07-27 16:15:38 -04:00
|
|
|
assert_equal "inline; filename=\"#{blob.filename.base}\"", @response.headers["Content-Disposition"]
|
2017-07-04 12:11:06 -04:00
|
|
|
assert_equal "text/plain", @response.headers["Content-Type"]
|
|
|
|
end
|
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
test "showing blob as attachment" do
|
2017-07-25 21:03:48 -04:00
|
|
|
blob = create_blob
|
2017-07-27 16:52:57 -04:00
|
|
|
key = ActiveStorage.verifier.generate(blob.key, expires_in: 5.minutes, purpose: :blob_key)
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
get rails_disk_service_url(key, blob.filename, content_type: blob.content_type, disposition: :attachment)
|
2017-07-27 16:15:38 -04:00
|
|
|
assert_equal "attachment; filename=\"#{blob.filename.base}\"", @response.headers["Content-Disposition"]
|
2017-07-04 12:11:06 -04:00
|
|
|
assert_equal "text/plain", @response.headers["Content-Type"]
|
|
|
|
end
|
2017-07-25 21:03:48 -04:00
|
|
|
|
|
|
|
test "directly uploading blob with integrity" do
|
2017-07-27 16:52:57 -04:00
|
|
|
data = "Something else entirely!"
|
|
|
|
blob = create_blob_before_direct_upload byte_size: data.size, checksum: Digest::MD5.base64digest(data)
|
|
|
|
token = encode_verified_token_for blob
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
put update_rails_disk_service_url(token), params: data, headers: { "Content-Type" => "text/plain" }
|
2017-07-25 21:03:48 -04:00
|
|
|
assert_response :no_content
|
|
|
|
assert_equal data, blob.download
|
|
|
|
end
|
|
|
|
|
|
|
|
test "directly uploading blob without integrity" do
|
2017-07-27 16:52:57 -04:00
|
|
|
data = "Something else entirely!"
|
|
|
|
blob = create_blob_before_direct_upload byte_size: data.size, checksum: Digest::MD5.base64digest("bad data")
|
|
|
|
token = encode_verified_token_for blob
|
|
|
|
|
|
|
|
put update_rails_disk_service_url(token), params: data
|
|
|
|
assert_response :unprocessable_entity
|
|
|
|
assert_not blob.service.exist?(blob.key)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "directly uploading blob with mismatched content type" do
|
|
|
|
data = "Something else entirely!"
|
|
|
|
blob = create_blob_before_direct_upload byte_size: data.size, checksum: Digest::MD5.base64digest(data)
|
|
|
|
token = encode_verified_token_for blob
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
put update_rails_disk_service_url(token), params: data, headers: { "Content-Type" => "application/octet-stream" }
|
|
|
|
assert_response :unprocessable_entity
|
|
|
|
assert_not blob.service.exist?(blob.key)
|
|
|
|
end
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
test "directly uploading blob with mismatched content length" do
|
|
|
|
data = "Something else entirely!"
|
|
|
|
blob = create_blob_before_direct_upload byte_size: data.size - 1, checksum: Digest::MD5.base64digest(data)
|
|
|
|
token = encode_verified_token_for blob
|
2017-07-25 21:03:48 -04:00
|
|
|
|
2017-07-27 16:52:57 -04:00
|
|
|
put update_rails_disk_service_url(token), params: data, headers: { "Content-Type" => "text/plain" }
|
2017-07-25 21:03:48 -04:00
|
|
|
assert_response :unprocessable_entity
|
|
|
|
assert_not blob.service.exist?(blob.key)
|
|
|
|
end
|
2017-07-27 16:52:57 -04:00
|
|
|
|
|
|
|
private
|
|
|
|
def encode_verified_token_for(blob)
|
|
|
|
ActiveStorage.verifier.generate(
|
|
|
|
{
|
|
|
|
key: blob.key,
|
|
|
|
content_length: blob.byte_size,
|
|
|
|
content_type: blob.content_type,
|
|
|
|
checksum: blob.checksum
|
|
|
|
},
|
|
|
|
expires_in: 5.minutes,
|
|
|
|
purpose: :blob_token
|
|
|
|
)
|
|
|
|
end
|
2017-07-04 12:11:06 -04:00
|
|
|
end
|