Skip to content

Commit

Permalink
Support fixtures for namespaced models [#2965 state:resolved]
Browse files Browse the repository at this point in the history
Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information
pixeltrix authored and josevalim committed Apr 25, 2010
1 parent 77c099c commit 8ec085b
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 7 deletions.
9 changes: 5 additions & 4 deletions activerecord/lib/active_record/fixtures.rb
Expand Up @@ -493,6 +493,7 @@ def self.instantiate_all_loaded_fixtures(object, load_instances = true)

def self.create_fixtures(fixtures_directory, table_names, class_names = {})
table_names = [table_names].flatten.map { |n| n.to_s }
table_names.each { |n| class_names[n.tr('/', '_').to_sym] = n.classify if n.include?('/') }
connection = block_given? ? yield : ActiveRecord::Base.connection

table_names_to_fetch = table_names.reject { |table_name| fixture_is_cached?(connection, table_name) }
Expand All @@ -503,7 +504,7 @@ def self.create_fixtures(fixtures_directory, table_names, class_names = {})
fixtures_map = {}

fixtures = table_names_to_fetch.map do |table_name|
fixtures_map[table_name] = Fixtures.new(connection, File.split(table_name.to_s).last, class_names[table_name.to_sym], File.join(fixtures_directory, table_name.to_s))
fixtures_map[table_name] = Fixtures.new(connection, table_name.tr('/', '_'), class_names[table_name.tr('/', '_').to_sym], File.join(fixtures_directory, table_name))
end

all_loaded_fixtures.update(fixtures_map)
Expand Down Expand Up @@ -837,8 +838,8 @@ def set_fixture_class(class_names = {})

def fixtures(*table_names)
if table_names.first == :all
table_names = Dir["#{fixture_path}/*.yml"] + Dir["#{fixture_path}/*.csv"]
table_names.map! { |f| File.basename(f).split('.')[0..-2].join('.') }
table_names = Dir["#{fixture_path}/**/*.{yml,csv}"]
table_names.map! { |f| f[(fixture_path.size + 1)..-5] }
else
table_names = table_names.flatten.map { |n| n.to_s }
end
Expand Down Expand Up @@ -871,7 +872,7 @@ def require_fixture_classes(table_names = nil)
def setup_fixture_accessors(table_names = nil)
table_names = Array.wrap(table_names || fixture_table_names)
table_names.each do |table_name|
table_name = table_name.to_s.tr('.', '_')
table_name = table_name.to_s.tr('./', '_')

define_method(table_name) do |*fixtures|
force_reload = fixtures.pop if fixtures.last == true || fixtures.last == :reload
Expand Down
4 changes: 2 additions & 2 deletions activerecord/lib/active_record/railties/databases.rake
Expand Up @@ -258,8 +258,8 @@ namespace :db do
base_dir = ENV['FIXTURES_PATH'] ? File.join(Rails.root, ENV['FIXTURES_PATH']) : File.join(Rails.root, 'test', 'fixtures')
fixtures_dir = ENV['FIXTURES_DIR'] ? File.join(base_dir, ENV['FIXTURES_DIR']) : base_dir

(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir.glob(File.join(fixtures_dir, '*.{yml,csv}'))).each do |fixture_file|
Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/).map {|f| File.join(fixtures_dir, f) } : Dir["#{fixtures_dir}/**/*.{yml,csv}"]).each do |fixture_file|
Fixtures.create_fixtures(fixtures_dir, fixture_file[(fixtures_dir.size + 1)..-5])
end
end

Expand Down
10 changes: 9 additions & 1 deletion activerecord/test/cases/fixtures_test.rb
Expand Up @@ -16,6 +16,9 @@
require 'models/matey'
require 'models/ship'
require 'models/book'
require 'models/admin'
require 'models/admin/account'
require 'models/admin/user'

class FixturesTest < ActiveRecord::TestCase
self.use_instantiated_fixtures = true
Expand Down Expand Up @@ -507,7 +510,7 @@ def test_cache
end

class FoxyFixturesTest < ActiveRecord::TestCase
fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers
fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers, :"admin/accounts", :"admin/users"

def test_identifies_strings
assert_equal(Fixtures.identify("foo"), Fixtures.identify("foo"))
Expand Down Expand Up @@ -629,6 +632,11 @@ def test_supports_sti
assert_kind_of DeadParrot, parrots(:polly)
assert_equal pirates(:blackbeard), parrots(:polly).killer
end

def test_namespaced_models
assert admin_accounts(:signals37).users.include?(admin_users(:david))
assert_equal 2, admin_accounts(:signals37).users.size
end
end

class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
Expand Down
2 changes: 2 additions & 0 deletions activerecord/test/fixtures/admin/accounts.yml
@@ -0,0 +1,2 @@
signals37:
name: 37signals
7 changes: 7 additions & 0 deletions activerecord/test/fixtures/admin/users.yml
@@ -0,0 +1,7 @@
david:
name: David
account: signals37

jamis:
name: Jamis
account: signals37
5 changes: 5 additions & 0 deletions activerecord/test/models/admin.rb
@@ -0,0 +1,5 @@
module Admin
def self.table_name_prefix
'admin_'
end
end
3 changes: 3 additions & 0 deletions activerecord/test/models/admin/account.rb
@@ -0,0 +1,3 @@
class Admin::Account < ActiveRecord::Base
has_many :users
end
3 changes: 3 additions & 0 deletions activerecord/test/models/admin/user.rb
@@ -0,0 +1,3 @@
class Admin::User < ActiveRecord::Base
belongs_to :account
end
9 changes: 9 additions & 0 deletions activerecord/test/schema/schema.rb
Expand Up @@ -26,6 +26,15 @@ def create_table(*args, &block)
t.integer :credit_limit
end

create_table :admin_accounts, :force => true do |t|
t.string :name
end

create_table :admin_users, :force => true do |t|
t.string :name
t.references :account
end

create_table :audit_logs, :force => true do |t|
t.column :message, :string, :null=>false
t.column :developer_id, :integer, :null=>false
Expand Down

0 comments on commit 8ec085b

Please sign in to comment.