Merge pull request #47635 from Shopify/generate-composite-pk-in-fixtures

Fix fixtures id generation for composite primary keys
This commit is contained in:
Eileen M. Uchitelle 2023-03-13 10:26:06 -04:00 committed by GitHub
commit 3c0569ec17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 20 deletions

@ -12,12 +12,22 @@ def primary_key_name
end
def primary_key_type
@primary_key_type ||= @model_class && @model_class.type_for_attribute(@model_class.primary_key).type
@primary_key_type ||= @model_class && column_type(@model_class.primary_key)
end
def has_primary_key_column?
@has_primary_key_column ||= primary_key_name &&
@model_class.columns.any? { |col| col.name == primary_key_name }
def column_type(column_name)
@column_type ||= {}
return @column_type[column_name] if @column_type.key?(column_name)
@column_type[column_name] = @model_class && @model_class.type_for_attribute(column_name).type
end
def has_column?(column_name)
column_names.include?(column_name)
end
def column_names
@column_names ||= @model_class ? @model_class.columns.map(&:name).to_set : Set.new
end
def timestamp_column_names

@ -118,10 +118,10 @@ def interpolate_label
def generate_primary_key
# generate a primary key if necessary
if model_metadata.has_primary_key_column? && !@row.include?(model_metadata.primary_key_name)
@row[model_metadata.primary_key_name] = ActiveRecord::FixtureSet.identify(
@label, model_metadata.primary_key_type
)
Array(model_metadata.primary_key_name).each do |pk|
next if !model_metadata.has_column?(pk) || @row.include?(pk)
@row[pk] = ActiveRecord::FixtureSet.identify(@label, model_metadata.column_type(pk))
end
end

@ -33,6 +33,7 @@
require "models/topic"
require "models/traffic_light"
require "models/treasure"
require "models/cpk"
class FixturesTest < ActiveRecord::TestCase
include ConnectionHelper
@ -1627,4 +1628,15 @@ def readonly_config
default_config.merge("replica" => true)
end
end
class CompositePkFixturesTest < ActiveRecord::TestCase
fixtures :cpk_orders, :cpk_books
def test_generates_composite_primary_key_ids
assert_not_empty(cpk_orders(:cpk_groceries_order_1).id.compact)
assert_not_nil(cpk_books(:cpk_great_author_first_book).author_id)
assert_not_nil(cpk_books(:cpk_great_author_first_book).number)
end
end
end

@ -2,19 +2,13 @@ _fixture:
model_class: Cpk::Book
cpk_great_author_first_book:
author_id: 1
number: 1
title: "The first book"
revision: 1
cpk_great_author_second_book:
author_id: 1
number: 2
title: "The second book"
revision: 1
cpk_famous_author_first_book:
author_id: 2
number: 1
title: "Ruby on Rails"
revision: 1

@ -2,16 +2,10 @@ _fixture:
model_class: Cpk::Order
cpk_groceries_order_1:
id: 1
shop_id: 1
status: "paid"
cpk_groceries_order_2:
id: 2
shop_id: 1
status: "paid"
cpk_coffee_order_1:
id: 3
shop_id: 2
status: "cancelled"