Created
November 7, 2014 22:40
-
-
Save Kukunin/4e93d254eaad1ee23bfe to your computer and use it in GitHub Desktop.
carrierwave_upload_cache_bug.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unless File.exist?('Gemfile') | |
File.write('Gemfile', <<-GEMFILE) | |
source 'https://rubygems.org' | |
gem 'rails', github: 'rails/rails' | |
gem 'arel', github: 'rails/arel' | |
gem 'rack', github: 'rack/rack' | |
gem 'i18n', github: 'svenfuchs/i18n' | |
gem 'carrierwave', github: 'carrierwaveuploader/carrierwave' | |
gem 'sqlite3' | |
GEMFILE | |
system 'bundle' | |
end | |
require 'bundler' | |
Bundler.setup(:default) | |
require 'active_record' | |
require 'minitest/autorun' | |
require 'logger' | |
require 'carrierwave' | |
require 'carrierwave/mount' | |
require 'carrierwave/orm/activerecord' | |
require 'carrierwave/processing/mime_types' | |
# Ensure backward compatibility with Minitest 4 | |
Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) | |
# This connection will do for database-independent bug reports. | |
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:') | |
ActiveRecord::Base.raise_in_transactional_callbacks = true | |
ActiveRecord::Schema.define do | |
create_table :models do |t| | |
t.integer :other, null: false | |
t.string :file, null: false | |
t.integer :size, null: false | |
end | |
end | |
class FileUploader < CarrierWave::Uploader::Base | |
include CarrierWave::MimeTypes | |
def store_dir | |
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" | |
end | |
process :save_size_in_model | |
def save_size_in_model | |
model.size = file.size | |
end | |
end | |
class Model < ActiveRecord::Base | |
validates :other, :file, :size, presence: true | |
mount_uploader :file, FileUploader | |
end | |
class BugTest < Minitest::Test | |
# We upload the file at first query, but | |
# validation fails, but we have cached upload | |
def test_process_callbacks_when_cache_file_is_used | |
#Simulate first query | |
model = Model.new(file: File.open(__FILE__)) | |
model.save # validate false | |
assert model.errors.include? :other #Non-related validation error | |
assert model.size.present? #Size is there | |
#Simulate second query with cached upload | |
new_model = Model.new(other: 1, file_cache: model.file_cache) | |
new_model.save # validation should be true, but size is nil | |
assert new_model.errors.include? :size #This time size is nil, because process callbacks were runned | |
assert new_model.size.nil? #Size is nil | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment