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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
require 'abstract_unit'
require 'generators/generator_test_helper'
class RailsTemplateRunnerTest < GeneratorTestCase
def setup
Rails::Generator::Base.use_application_sources!
run_generator('app', [RAILS_ROOT])
# generate empty template
@template_path = File.join(RAILS_ROOT, 'template.rb')
File.open(File.join(@template_path), 'w') {|f| f << '' }
@git_plugin_uri = 'git://github.com/technoweenie/restful-authentication.git'
@svn_plugin_uri = 'svn://svnhub.com/technoweenie/restful-authentication/trunk'
end
def teardown
super
rm_rf "#{RAILS_ROOT}/README"
rm_rf "#{RAILS_ROOT}/Rakefile"
rm_rf "#{RAILS_ROOT}/doc"
rm_rf "#{RAILS_ROOT}/lib"
rm_rf "#{RAILS_ROOT}/log"
rm_rf "#{RAILS_ROOT}/script"
rm_rf "#{RAILS_ROOT}/vendor"
rm_rf "#{RAILS_ROOT}/tmp"
rm_rf "#{RAILS_ROOT}/Capfile"
rm_rf @template_path
end
def test_initialize_should_load_template
Rails::TemplateRunner.any_instance.expects(:load_template).with(@template_path)
silence_generator do
Rails::TemplateRunner.new(@template_path, RAILS_ROOT)
end
end
def test_initialize_should_raise_error_on_missing_template_file
assert_raise(RuntimeError) do
silence_generator do
Rails::TemplateRunner.new('non/existent/path/to/template.rb', RAILS_ROOT)
end
end
end
def test_file_should_write_data_to_file_path
run_template_method(:file, 'lib/test_file.rb', 'heres test data')
assert_generated_file_with_data 'lib/test_file.rb', 'heres test data'
end
def test_file_should_write_block_contents_to_file_path
run_template_method(:file, 'lib/test_file.rb') { 'heres block data' }
assert_generated_file_with_data 'lib/test_file.rb', 'heres block data'
end
def test_plugin_with_git_option_should_run_plugin_install
expects_run_ruby_script_with_command("script/plugin install #{@git_plugin_uri}")
run_template_method(:plugin, 'restful-authentication', :git => @git_plugin_uri)
end
def test_plugin_with_svn_option_should_run_plugin_install
expects_run_ruby_script_with_command("script/plugin install #{@svn_plugin_uri}")
run_template_method(:plugin, 'restful-authentication', :svn => @svn_plugin_uri)
end
def test_plugin_with_git_option_and_submodule_should_use_git_scm
Rails::Git.expects(:run).with("submodule add #{@git_plugin_uri} vendor/plugins/rest_auth")
run_template_method(:plugin, 'rest_auth', :git => @git_plugin_uri, :submodule => true)
end
def test_plugin_with_no_options_should_skip_method
Rails::TemplateRunner.any_instance.expects(:run).never
run_template_method(:plugin, 'rest_auth', {})
end
def test_gem_should_put_gem_dependency_in_enviroment
run_template_method(:gem, 'will-paginate')
assert_rails_initializer_includes("config.gem 'will-paginate'")
end
def test_gem_with_options_should_include_options_in_gem_dependency_in_environment
run_template_method(:gem, 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com')
assert_rails_initializer_includes("config.gem 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com'")
end
def test_gem_with_env_string_should_put_gem_dependency_in_specified_environment
run_template_method(:gem, 'rspec', :env => 'test')
assert_generated_file_with_data('config/environments/test.rb', "config.gem 'rspec'", 'test')
end
def test_gem_with_env_array_should_put_gem_dependency_in_specified_environments
run_template_method(:gem, 'quietbacktrace', :env => %w[ development test ])
assert_generated_file_with_data('config/environments/development.rb', "config.gem 'quietbacktrace'")
assert_generated_file_with_data('config/environments/test.rb', "config.gem 'quietbacktrace'")
end
def test_gem_with_lib_option_set_to_false_should_put_gem_dependency_in_enviroment_correctly
run_template_method(:gem, 'mislav-will-paginate', :lib => false, :source => 'http://gems.github.com')
assert_rails_initializer_includes("config.gem 'mislav-will-paginate', :lib => false, :source => 'http://gems.github.com'")
end
def test_environment_should_include_data_in_environment_initializer_block
load_paths = 'config.load_paths += %w["#{RAILS_ROOT}/app/extras"]'
run_template_method(:environment, load_paths)
assert_rails_initializer_includes(load_paths)
end
def test_environment_with_block_should_include_block_contents_in_environment_initializer_block
run_template_method(:environment) do
'# This wont be added'
'# This will be added'
end
assert_rails_initializer_includes('# This will be added')
end
def test_git_with_symbol_should_run_command_using_git_scm
Rails::Git.expects(:run).once.with('init')
run_template_method(:git, :init)
end
def test_git_with_hash_should_run_each_command_using_git_scm
Rails::Git.expects(:run).times(2)
run_template_method(:git, {:init => '', :add => '.'})
end
def test_vendor_should_write_data_to_file_in_vendor
run_template_method(:vendor, 'vendor_file.rb', '# vendor data')
assert_generated_file_with_data('vendor/vendor_file.rb', '# vendor data')
end
def test_lib_should_write_data_to_file_in_lib
run_template_method(:lib, 'my_library.rb', 'class MyLibrary')
assert_generated_file_with_data('lib/my_library.rb', 'class MyLibrary')
end
def test_rakefile_should_write_date_to_file_in_lib_tasks
run_template_method(:rakefile, 'myapp.rake', 'task :run => [:environment]')
assert_generated_file_with_data('lib/tasks/myapp.rake', 'task :run => [:environment]')
end
def test_initializer_should_write_date_to_file_in_config_initializers
run_template_method(:initializer, 'constants.rb', 'MY_CONSTANT = 42')
assert_generated_file_with_data('config/initializers/constants.rb', 'MY_CONSTANT = 42')
end
def test_generate_should_run_script_generate_with_argument_and_options
expects_run_ruby_script_with_command('script/generate model MyModel')
run_template_method(:generate, 'model', 'MyModel')
end
def test_rake_should_run_rake_command_with_development_env
expects_run_with_command('rake log:clear RAILS_ENV=development')
run_template_method(:rake, 'log:clear')
end
def test_rake_with_env_option_should_run_rake_command_in_env
expects_run_with_command('rake log:clear RAILS_ENV=production')
run_template_method(:rake, 'log:clear', :env => 'production')
end
def test_rake_with_sudo_option_should_run_rake_command_with_sudo
expects_run_with_command('sudo rake log:clear RAILS_ENV=development')
run_template_method(:rake, 'log:clear', :sudo => true)
end
def test_capify_should_run_the_capify_command
expects_run_with_command('capify .')
run_template_method(:capify!)
end
def test_freeze_should_freeze_rails_edge
expects_run_with_command('rake rails:freeze:edge')
run_template_method(:freeze!)
end
def test_route_should_add_data_to_the_routes_block_in_config_routes
route_command = "map.route '/login', :controller => 'sessions', :action => 'new'"
run_template_method(:route, route_command)
assert_generated_file_with_data 'config/routes.rb', route_command
end
def test_run_ruby_script_should_add_ruby_to_command_in_win32_environment
ruby_command = RUBY_PLATFORM =~ /win32/ ? 'ruby ' : ''
expects_run_with_command("#{ruby_command}script/generate model MyModel")
run_template_method(:generate, 'model', 'MyModel')
end
protected
def run_template_method(method_name, *args, &block)
silence_generator do
@template_runner = Rails::TemplateRunner.new(@template_path, RAILS_ROOT)
@template_runner.send(method_name, *args, &block)
end
end
def expects_run_with_command(command)
Rails::TemplateRunner.any_instance.stubs(:run).once.with(command, false)
end
def expects_run_ruby_script_with_command(command)
Rails::TemplateRunner.any_instance.stubs(:run_ruby_script).once.with(command,false)
end
def assert_rails_initializer_includes(data, message = nil)
message ||= "Rails::Initializer should include #{data}"
assert_generated_file 'config/environment.rb' do |body|
assert_match(/#{Regexp.escape("Rails::Initializer.run do |config|")}.+#{Regexp.escape(data)}.+end/m, body, message)
end
end
def assert_generated_file_with_data(file, data, message = nil)
message ||= "#{file} should include '#{data}'"
assert_generated_file(file) do |file|
assert_match(/#{Regexp.escape(data)}/,file, message)
end
end
end
|