test/aws_storage_test.rb in paperclip-aws-1.3.1 vs test/aws_storage_test.rb in paperclip-aws-1.3.2
- old
+ new
@@ -4,22 +4,26 @@
def rails_env(env)
silence_warnings do
Object.const_set(:Rails, stub('Rails', :env => env))
end
end
-
+
+ def default_model_options(options={})
+ {
+ :storage => :aws,
+ :bucket => "testing",
+ :s3_credentials => {
+ :access_key_id => "ACCESS_KEY_ID",
+ :secret_access_key => "SECRET_ACCESS_KEY"
+ },
+ :path => ":attachment/:basename.:extension"
+ }.deep_merge!(options)
+ end
+
context "Parsing S3 credentials" do
- setup do
- @proxy_settings = {:host => "127.0.0.1", :port => 8888, :user => "foo", :password => "bar"}
- Rails.stubs(:const_defined?)
- rebuild_model :storage => :aws,
- :bucket => "testing",
- :http_proxy => @proxy_settings,
- :s3_credentials => {
- :access_key_id => "ACCESS_KEY_ID",
- :secret_access_key => "SECRET_ACCESS_KEY"
- }
+ setup do
+ rebuild_model default_model_options
@dummy = Dummy.new
@avatar = @dummy.avatar
end
@@ -42,11 +46,159 @@
{ :access_key_id => "54321" },
@avatar.parse_credentials(
:production => { :access_key_id => '12345' },
:development => { :access_key_id => '54321' }
)
- )
+ )
+ end
+
+ should "return the argument if the key does not exist" do
+ rails_env("not really an env")
+ assert_equal({:test => "12345"}, @avatar.parse_credentials(:test => "12345"))
+ end
+
+ end
+
+ context "Working with endpoints" do
+ should "return a correct url based on a path with default endpoint" do
+ rebuild_model default_model_options
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+
+ assert_match %r{^http://s3.amazonaws.com/testing/avatars/stringio.txt}, @dummy.avatar.url
end
+
+ should "return a correct url based on a path with custom endpoint" do
+ rebuild_model default_model_options(:s3_credentials => { :endpoint => 's3-eu-west-1.amazonaws.com' })
+
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+
+ assert_match %r{^http://s3-eu-west-1.amazonaws.com/testing/avatars/stringio.txt}, @dummy.avatar.url
+ end
+ end
+
+ context "Working with protocols" do
+ should "return a correct url with http protocol predefined" do
+ rebuild_model default_model_options(:s3_protocol => 'http')
+
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+
+ assert_match /\Ahttp:\/\/.+/, @dummy.avatar.url
+ end
+
+
+ should "return a correct url with https protocol predefined" do
+ rebuild_model default_model_options(:s3_protocol => 'https')
+
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+ end
+
+ should "return a correct protocol protocol based on s3_permissions" do
+ rebuild_model default_model_options(:s3_permissions => :public_read)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttp:\/\/.+/, @dummy.avatar.url
+
+ rebuild_model default_model_options(:s3_permissions => :private)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+
+ rebuild_model default_model_options(:s3_permissions => :public_read_write)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+
+ rebuild_model default_model_options(:s3_permissions => :authenticated_read)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+
+ rebuild_model default_model_options(:s3_permissions => :bucket_owner_read)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+
+ rebuild_model default_model_options(:s3_permissions => :bucket_owner_full_control)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url
+ end
+
+ should "return a correct url when protocol explicitely defined from url" do
+ rebuild_model default_model_options
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttps:\/\/.+/, @dummy.avatar.url(:original, :protocol => "https")
+
+ rebuild_model default_model_options(:s3_permissions => :private)
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ assert_match /\Ahttp:\/\/.+/, @dummy.avatar.url(:original, :protocol => "http")
+ end
+ end
+
+ context "Working with expiring urls" do
+ should "return a correct url which contains 'Expires' parameter" do
+ rebuild_model default_model_options
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+
+ assert_match /\Ahttp:\/\/.+Expires.+/, @dummy.avatar.url(:original, :expires => 1.day)
+ end
+ end
+
+ context "An attachment that uses S3 for storage and has styles that return different file types" do
+ setup do
+ rebuild_model default_model_options(:styles => { :large => ['500x500#', :jpg] })
+
+ @dummy = Dummy.new
+ @dummy.avatar = File.new(fixture_file('5k.png'), 'rb')
+ end
+
+ should "return a url containing the correct original file mime type" do
+ assert_match /.+\/5k.png/, @dummy.avatar.url
+ end
+
+ should "return a url containing the correct processed file mime type" do
+ assert_match /.+\/5k.jpg/, @dummy.avatar.url(:large)
+ end
+ end
+
+ context "An attachment that uses S3 for storage and has spaces in file name" do
+ setup do
+ rebuild_model default_model_options(:styles => { :large => ['500x500#', :jpg] })
+
+ @dummy = Dummy.new
+ @dummy.avatar = File.new(fixture_file('spaced file.png'), 'rb')
+ end
+
+ should "return an unescaped version for path" do
+ assert_match /.+\/spaced file\.png/, @dummy.avatar.path
+ end
+
+ should "return an escaped version for url" do
+ assert_match /.+\/spaced%20file\.png/, @dummy.avatar.url
+ end
+ end
+
+ context "An attachment with AWS storage" do
+ setup do
+ rebuild_model default_model_options
+ end
+
+ should "be extended by the AWS module" do
+ assert Dummy.new.avatar.is_a?(Paperclip::Storage::Aws)
+ end
+
+ should "not be extended by the Filesystem module" do
+ assert ! Dummy.new.avatar.is_a?(Paperclip::Storage::Filesystem)
+ end
end
end
\ No newline at end of file