Created
September 21, 2018 12:36
-
-
Save febeling/06e1da8ad34d5a9c45d41420efbe58bc to your computer and use it in GitHub Desktop.
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
# frozen_string_literal: true | |
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" | |
git_source(:github) { |repo| "https://github.com/#{repo}.git" } | |
# Activate the gem you are reporting the issue against. | |
# gem "activerecord", "5.2.1" | |
gem "activerecord", :path => './rails/activerecord' | |
gem "activesupport", :path => './rails/activesupport' | |
gem "activemodel", :path => './rails/activemodel' | |
gem "sqlite3" | |
end | |
require "active_record" | |
require "minitest/autorun" | |
require "logger" | |
# 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.logger = Logger.new(STDOUT) | |
ActiveRecord::Schema.define do | |
create_table :orders, force: true do |t| | |
end | |
create_table :items, force: true do |t| | |
end | |
create_table :item_orders, force: true do |t| | |
t.integer :item_id | |
t.integer :order_id | |
end | |
end | |
class Order < ActiveRecord::Base | |
has_many :item_orders | |
has_many :items, through: :item_orders | |
end | |
class Item < ActiveRecord::Base | |
has_many :item_orders | |
has_many :orders, through: :item_orders | |
end | |
class ItemOrder < ActiveRecord::Base | |
belongs_to :item | |
belongs_to :order | |
end | |
class HasManyThroughJoinModelAndDuplicateBugTest < Minitest::Test | |
attr_reader :item, :order | |
def teardown | |
Item.destroy_all | |
end | |
def setup | |
@item = Item.create! | |
@order = Order.create! | |
end | |
# Objects | |
def test_append_collection # ok | |
order.items << item | |
order.items << item | |
assert_equal 2, order.items.count | |
end | |
def test_replace_collection # ok | |
order.items.replace([item, item]) | |
assert_equal 2, order.items.count | |
end | |
def test_assign_collection # ok | |
order.items = [item, item] | |
assert_equal 2, order.items.count | |
end | |
def test_replace_collection_preexisting # failing | |
order.items.replace([item]) | |
order.items.replace([item, item]) | |
assert_equal 2, order.items.count | |
end | |
def test_assign_collection_preexisting # failing | |
order.items = [item] | |
order.items = [item, item] | |
assert_equal 2, order.items.count | |
end | |
# IDs | |
def test_ids_writer_assignment_with_duplicates # ok | |
order.item_ids = [item.id, item.id] | |
assert_equal 2, order.items.count | |
end | |
def test_ids_writer_with_preexisting # failing | |
order.item_ids = [item.id] | |
order.item_ids = [item.id, item.id] | |
assert_equal 2, order.items.count | |
end | |
# Available workaround | |
def test_ids_writer_workaround | |
order.item_ids = [item.id] | |
order.item_ids.clear | |
order.item_ids = [item.id, item.id] | |
assert_equal 2, order.items.count | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output with ruby ruby 2.4.3p205 (2017-12-14 revision 61247)