Skip to content

Instantly share code, notes, and snippets.

@WaKeMaTTa
Last active May 16, 2016 11:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WaKeMaTTa/1f960f58f3a001c9ae78bedf539d87cc to your computer and use it in GitHub Desktop.
Save WaKeMaTTa/1f960f58f3a001c9ae78bedf539d87cc to your computer and use it in GitHub Desktop.
Bug report : Enum and PaperTrail
# Issues https://github.com/airblade/paper_trail/issues/798
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
raise e
end
gemfile(true) do
ruby "2.2.5"
source "https://rubygems.org"
gem "activerecord", "4.2.6"
gem "minitest", "5.8.4"
gem "paper_trail", "5.0.1", require: false
gem "sqlite3"
end
require "active_record"
require "minitest/autorun"
require "logger"
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.string :email, null: false
t.integer :gender, default: 0
t.timestamps null: false
end
create_table :versions do |t|
t.string :item_type, null: false
t.integer :item_id, null: false
t.string :event, null: false
t.string :whodunnit
t.text :object, limit: 1_073_741_823
t.text :object_changes, limit: 1_073_741_823
t.integer :transaction_id
t.datetime :created_at
end
add_index :versions, [:item_type, :item_id]
add_index :versions, [:transaction_id]
create_table :version_associations do |t|
t.integer :version_id
t.string :foreign_key_name, null: false
t.integer :foreign_key_id
end
add_index :version_associations, [:version_id]
add_index :version_associations, [:foreign_key_name, :foreign_key_id],
name: "index_version_associations_on_foreign_key"
end
# Require `paper_trail.rb` after the `version_associations` table
# exists so that PT will track associations.
require "paper_trail"
PaperTrail.config.track_associations = true
# Include your models here. Please only include the minimum code necessary to
# reproduce your issue.
class User < ActiveRecord::Base
has_paper_trail
enum gender: { male: 0, female: 1 }
end
class BugTest < ActiveSupport::TestCase
def test_enum
user = User.create(email: "user@example.com", gender: :male)
user.save
assert_equal 1, user.versions.count
assert_equal "male", user.gender
user.touch_with_version
assert_equal 2, user.versions.count
# Fails: expected to be "male" but it returns nil
assert_equal "male", user.previous_version.gender
end
end
# Issues https://github.com/airblade/paper_trail/issues/798
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler"
raise e
end
gemfile(true) do
ruby "2.3.1"
source "https://rubygems.org"
gem "activerecord", "4.2.6"
gem "minitest", "5.8.4"
gem "paper_trail", "5.0.1", require: false
gem "sqlite3"
end
require "active_record"
require "minitest/autorun"
require "logger"
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
t.integer :status, default: 0
t.timestamps null: false
end
create_table :versions do |t|
t.string :item_type, null: false
t.integer :item_id, null: false
t.string :event, null: false
t.string :whodunnit
t.text :object, limit: 1_073_741_823
t.text :object_changes, limit: 1_073_741_823
t.integer :transaction_id
t.datetime :created_at
end
add_index :versions, [:item_type, :item_id]
add_index :versions, [:transaction_id]
create_table :version_associations do |t|
t.integer :version_id
t.string :foreign_key_name, null: false
t.integer :foreign_key_id
end
add_index :version_associations, [:version_id]
add_index :version_associations, [:foreign_key_name, :foreign_key_id],
name: "index_version_associations_on_foreign_key"
end
# Require `paper_trail.rb` after the `version_associations` table
# exists so that PT will track associations.
require "paper_trail"
PaperTrail.config.track_associations = true
# Include your models here. Please only include the minimum code necessary to
# reproduce your issue.
class Post < ActiveRecord::Base
has_paper_trail
enum status: { draft: 0, published: 1, unpublished: 2 }
end
class BugTest < ActiveSupport::TestCase
def test_post_with_status_enum
post = Post.create!(status: "draft") # enum 0
assert_equal 1, post.versions.count
post.published!
assert_equal 2, post.versions.count
assert_equal 0, post.versions[1].object_deserialized["status"] # draft
# Not need it because im using sqlite3
#Timecop.travel 1.second.since # because MySQL doesn't do fractional seconds
post.touch_with_version
assert_equal 3, post.versions.count
assert_equal 1, post.versions[2].object_deserialized["status"] # published
post.archived!
assert_equal 4, post.versions.count
assert_equal 1, post.versions[3].object_deserialized["status"] # published
assert_equal true, post.previous_version.published?
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment