1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
require 'test/unit'
# Optionally load RubyGems.
begin
require 'rubygems'
rescue LoadError
end
# Mock out what we need from AR::Base.
module ActiveRecord
class Base
class << self
attr_accessor :pluralize_table_names
end
self.pluralize_table_names = true
end
end
# And what we need from ActionView
module ActionView
module Helpers
module ActiveRecordHelper; end
class InstanceTag; end
end
end
# Must set before requiring generator libs.
if defined?(RAILS_ROOT)
RAILS_ROOT.replace "#{File.dirname(__FILE__)}/fixtures"
else
RAILS_ROOT = "#{File.dirname(__FILE__)}/fixtures"
end
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
require 'initializer'
# Mocks out the configuration
module Rails
def self.configuration
Rails::Configuration.new
end
end
require 'rails_generator'
class RailsGeneratorTest < Test::Unit::TestCase
BUILTINS = %w(controller integration_test mailer migration model observer plugin resource scaffold session_migration)
CAPITALIZED_BUILTINS = BUILTINS.map { |b| b.capitalize }
def setup
ActiveRecord::Base.pluralize_table_names = true
end
def test_sources
expected = [:lib, :vendor,
"plugins (vendor/plugins)".to_sym, # <plugin>/generators and <plugin>/rails_generators
:user,
:RubyGems, :RubyGems, # gems named <x>_generator, gems containing /rails_generator/ folder
:builtin]
expected.delete(:RubyGems) unless Object.const_defined?(:Gem)
assert_equal expected, Rails::Generator::Base.sources.map { |s| s.label }
end
def test_lookup_builtins
(BUILTINS + CAPITALIZED_BUILTINS).each do |name|
assert_nothing_raised do
spec = Rails::Generator::Base.lookup(name)
assert_not_nil spec
assert_kind_of Rails::Generator::Spec, spec
klass = spec.klass
assert klass < Rails::Generator::Base
assert_equal spec, klass.spec
end
end
end
def test_autolookup
assert_nothing_raised { ControllerGenerator }
assert_nothing_raised { ModelGenerator }
end
def test_lookup_missing_generator
assert_raise Rails::Generator::GeneratorError do
Rails::Generator::Base.lookup('missing').klass
end
end
def test_lookup_missing_class
spec = nil
assert_nothing_raised { spec = Rails::Generator::Base.lookup('missing_class') }
assert_not_nil spec
assert_kind_of Rails::Generator::Spec, spec
assert_raise(NameError) { spec.klass }
end
def test_generator_usage
(BUILTINS - ["session_migration"]).each do |name|
assert_raise(Rails::Generator::UsageError, "Generator '#{name}' should raise an error without arguments") {
Rails::Generator::Base.instance(name)
}
end
end
def test_generator_spec
spec = Rails::Generator::Base.lookup('working')
assert_equal 'working', spec.name
assert_match(/#{spec.path}$/, "#{RAILS_ROOT}/lib/generators/working")
assert_equal :lib, spec.source
assert_nothing_raised { assert_match(/WorkingGenerator$/, spec.klass.name) }
end
def test_named_generator_attributes
g = Rails::Generator::Base.instance('working', %w(admin/foo bar baz))
assert_equal 'admin/foo', g.name
assert_equal %w(admin), g.class_path
assert_equal 'Admin', g.class_nesting
assert_equal 'Admin::Foo', g.class_name
assert_equal 'foo', g.singular_name
assert_equal 'foos', g.plural_name
assert_equal g.singular_name, g.file_name
assert_equal "admin_#{g.plural_name}", g.table_name
assert_equal %w(bar baz), g.args
end
def test_named_generator_attributes_without_pluralized
ActiveRecord::Base.pluralize_table_names = false
g = Rails::Generator::Base.instance('working', %w(admin/foo bar baz))
assert_equal "admin_#{g.singular_name}", g.table_name
end
def test_session_migration_generator_with_pluralization
g = Rails::Generator::Base.instance('session_migration')
assert_equal 'session'.pluralize, g.send(:default_session_table_name)
ActiveRecord::Base.pluralize_table_names = false
assert_equal 'session', g.send(:default_session_table_name)
end
def test_scaffold_controller_name
# Default behaviour is use the model name
g = Rails::Generator::Base.instance('scaffold', %w(Product))
assert_equal "Products", g.controller_name
end
end
|