byroot/activerecord-typedstore

Fail tests for dirty tracking type casting with datetime (possible with BigDecimal too)

adis-io opened this issue · 0 comments

Steps to reproduce

  1. save snippet below, name it like json_typed_store_bug.rb
  2. ruby json_typed_store_bug.rb
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
  source 'https://rubygems.org'

  gem 'rails', '4.2.7.1'
  gem 'pg', '0.19.0'
  gem 'factory_bot_rails'
  gem 'activerecord-typedstore', '1.1.3'
end

require 'active_record'
require 'action_controller/railtie'

ActiveRecord::Base.establish_connection(
  adapter: 'postgresql', database: 'ovkovckm',
  host: 'baasu.db.elephantsql.com', username: 'ovkovckm',
  password: '866lKeR6FSUgG_fEfo1e13XpYu0zZ-Iz'
)
ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveRecord::Schema.define do
  create_table :users, force: true do |t|
    t.json :extra_attrs, default: {}, null: false
    t.timestamps
  end
end

module JSONCoder
  extend self

  def load(data)
    data || {}
  end

  def dump(data)
    data || {}
  end

end


class User < ActiveRecord::Base
  typed_store :extra_attrs, coder: JSONCoder do |s|
    s.datetime :birth_date
  end
end

FactoryBot.define do
  factory :user do
  end
end

require 'minitest/autorun'

class TypedStoreTest < Minitest::Test
  def test_dirty_changes
    user = FactoryBot.create(:user, birth_date: '1970-01-01T00:00:00.000Z')

    old_birth_date = user.birth_date

    assert_equal(false, user.changed?)

    user.assign_attributes(birth_date: '1970-01-01T00:00:00.000Z')

    new_birth_date = user.birth_date

    assert_equal(false, user.changed?)

    assert_equal(old_birth_date, new_birth_date)
  end
end

Expected behaviour

two asserts are passing

Actual behaviour

one assert is failing