aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/active_file/site.rb1
-rw-r--r--lib/active_file/sites/s3_site.rb23
-rw-r--r--test/s3_site_test.rb65
3 files changed, 74 insertions, 15 deletions
diff --git a/lib/active_file/site.rb b/lib/active_file/site.rb
index 33494b916a..e44c0145a9 100644
--- a/lib/active_file/site.rb
+++ b/lib/active_file/site.rb
@@ -41,3 +41,4 @@ module ActiveFile::Sites
end
require "active_file/sites/disk_site"
+require "active_file/sites/s3_site"
diff --git a/lib/active_file/sites/s3_site.rb b/lib/active_file/sites/s3_site.rb
index 838163a23d..4ede843cb4 100644
--- a/lib/active_file/sites/s3_site.rb
+++ b/lib/active_file/sites/s3_site.rb
@@ -16,7 +16,7 @@ class ActiveFile::Sites::S3Site < ActiveFile::Site
if block_given?
stream(key, &block)
else
- object_for(key).read
+ object_for(key).get.body.read
end
end
@@ -25,27 +25,20 @@ class ActiveFile::Sites::S3Site < ActiveFile::Site
end
def exist?(key)
- object_for(key).exist?
+ object_for(key).exists?
end
+ def url(key, disposition: :inline, expires_in: nil)
+ object_for(key).presigned_url(:get, expires_in: expires_in)
+ end
+
def byte_size(key)
- object_for(key).head[:size]
+ object_for(key).size
end
def checksum(key)
- head = object_for(key).head
-
- # If the etag has no dashes, it's the MD5
- if !head.etag.include?("-")
- head.etag.gsub('"', '')
- # Check for md5 in metadata if it was uploaded via multipart
- elsif md5sum = head.meta["md5sum"]
- md5sum
- # Otherwise, we don't have a digest yet for this key
- else
- nil
- end
+ object_for(key).etag.remove(/"/)
end
diff --git a/test/s3_site_test.rb b/test/s3_site_test.rb
new file mode 100644
index 0000000000..bf7d4b0703
--- /dev/null
+++ b/test/s3_site_test.rb
@@ -0,0 +1,65 @@
+require "test_helper"
+require "fileutils"
+require "tmpdir"
+require "active_support/core_ext/securerandom"
+require "active_file/site"
+
+if ENV["AWS_ACCESS_KEY_ID"] && ENV["AWS_SECRET_ACCESS_KEY"] && ENV["AWS_REGION"] && ENV["AWS_S3_BUCKET"]
+ class ActiveFile::S3SiteTest < ActiveSupport::TestCase
+ FIXTURE_KEY = SecureRandom.base58(24).to_s
+ FIXTURE_FILE = StringIO.new("Hello world!")
+
+ setup do
+ @site = ActiveFile::Sites::S3Site.new(
+ access_key_id: ENV["AWS_ACCESS_KEY_ID"],
+ secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
+ region: ENV["AWS_REGION"],
+ bucket: ENV["AWS_S3_BUCKET"]
+ )
+
+ @site.upload FIXTURE_KEY, FIXTURE_FILE
+ FIXTURE_FILE.rewind
+ end
+
+ teardown do
+ @site.delete FIXTURE_KEY
+ FIXTURE_FILE.rewind
+ end
+
+ test "uploading" do
+ begin
+ key = SecureRandom.base58(24)
+ data = "Something else entirely!"
+ @site.upload(key, StringIO.new(data))
+
+ assert_equal data, @site.download(key)
+ ensure
+ @site.delete key
+ end
+ end
+
+ test "downloading" do
+ assert_equal FIXTURE_FILE.read, @site.download(FIXTURE_KEY)
+ end
+
+ test "existing" do
+ assert @site.exist?(FIXTURE_KEY)
+ assert_not @site.exist?(FIXTURE_KEY + "nonsense")
+ end
+
+ test "deleting" do
+ @site.delete FIXTURE_KEY
+ assert_not @site.exist?(FIXTURE_KEY)
+ end
+
+ test "sizing" do
+ assert_equal FIXTURE_FILE.size, @site.byte_size(FIXTURE_KEY)
+ end
+
+ test "checksumming" do
+ assert_equal Digest::MD5.hexdigest(FIXTURE_FILE.read), @site.checksum(FIXTURE_KEY)
+ end
+ end
+else
+ puts "Skipping S3 Site tests because ENV variables are missing"
+end