aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test/generators/actions_test.rb
blob: f5473333ed94f555a48939846c32d074466d9f1a (plain) (blame)
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
require 'generators/generators_test_helper'
require 'rails/generators/rails/app/app_generator'

class ActionsTest < Rails::Generators::TestCase
  include GeneratorsTestHelper
  tests Rails::Generators::AppGenerator
  arguments [destination_root]

  def setup
    super
    @git_plugin_uri = 'git://github.com/technoweenie/restful-authentication.git'
    @svn_plugin_uri = 'svn://svnhub.com/technoweenie/restful-authentication/trunk'
  end

  def test_invoke_other_generator_with_shortcut
    action :invoke, 'model', ['my_model']
    assert_file 'app/models/my_model.rb', /MyModel/
  end

  def test_invoke_other_generator_with_full_namespace
    action :invoke, 'rails:model', ['my_model']
    assert_file 'app/models/my_model.rb', /MyModel/
  end

  def test_create_file_should_write_data_to_file_path
    action :create_file, 'lib/test_file.rb', 'heres test data'
    assert_file 'lib/test_file.rb', 'heres test data'
  end

  def test_create_file_should_write_block_contents_to_file_path
    action(:create_file, 'lib/test_file.rb'){ 'heres block data' }
    assert_file 'lib/test_file.rb', 'heres block data'
  end

  def test_plugin_with_git_option_should_run_plugin_install
    generator.expects(:run_ruby_script).once.with("script/rails plugin install #{@git_plugin_uri}", :verbose => false)
    action :plugin, 'restful-authentication', :git => @git_plugin_uri
  end

  def test_plugin_with_svn_option_should_run_plugin_install
    generator.expects(:run_ruby_script).once.with("script/rails plugin install #{@svn_plugin_uri}", :verbose => false)
    action :plugin, 'restful-authentication', :svn => @svn_plugin_uri
  end

  def test_plugin_with_git_option_and_branch_should_run_plugin_install
    generator.expects(:run_ruby_script).once.with("script/rails plugin install -b stable #{@git_plugin_uri}", :verbose => false)
    action :plugin, 'restful-authentication', :git => @git_plugin_uri, :branch => 'stable'
  end

  def test_plugin_with_svn_option_and_revision_should_run_plugin_install
    generator.expects(:run_ruby_script).once.with("script/rails plugin install -r 1234 #{@svn_plugin_uri}", :verbose => false)
    action :plugin, 'restful-authentication', :svn => @svn_plugin_uri, :revision => 1234
  end

  def test_plugin_with_git_option_and_submodule_should_use_git_scm
    generator.expects(:run).with("git submodule add #{@git_plugin_uri} vendor/plugins/rest_auth", :verbose => false)
    action :plugin, 'rest_auth', :git => @git_plugin_uri, :submodule => true
  end

  def test_plugin_with_git_option_and_submodule_should_use_git_scm
    generator.expects(:run).with("git submodule add -b stable #{@git_plugin_uri} vendor/plugins/rest_auth", :verbose => false)
    action :plugin, 'rest_auth', :git => @git_plugin_uri, :submodule => true, :branch => 'stable'
  end

  def test_plugin_with_no_options_should_skip_method
    generator.expects(:run).never
    action :plugin, 'rest_auth', {}
  end

  def test_add_source_adds_source_to_gemfile
    run_generator
    action :add_source, 'http://gems.github.com'
    assert_file 'Gemfile', /source "http:\/\/gems\.github\.com"/
  end

  def test_gem_should_put_gem_dependency_in_gemfile
    run_generator
    action :gem, 'will-paginate'
    assert_file 'Gemfile', /gem "will\-paginate"/
  end

  def test_gem_with_options_should_include_all_options_in_gemfile
    run_generator

    assert_deprecated do
      action :gem, 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com'
    end

    assert_deprecated do
      action :gem, 'thoughtbot-factory_girl', :require_as => 'factory_girl', :source => 'http://gems.github.com'
    end

    assert_file 'Gemfile', /gem "mislav\-will\-paginate", :require => "will\-paginate"/
    assert_file 'Gemfile', /source "http:\/\/gems\.github\.com"/
    assert_file 'Gemfile', /gem "thoughtbot-factory_girl", :require => "factory_girl"/
  end

  def test_gem_with_env_should_include_all_dependencies_in_gemfile
    run_generator

    assert_deprecated do
      action :gem, 'rspec', :env => %w(development test)
    end

    assert_deprecated do
      action :gem, 'rspec-rails', :only => %w(development test)
    end

    assert_file 'Gemfile', /gem "rspec", :group => \["development", "test"\]/
    assert_file 'Gemfile', /gem "rspec-rails", :group => \["development", "test"\]/
  end

  def test_gem_with_version_should_include_version_in_gemfile
    run_generator

    action :gem, 'rspec', '>=2.0.0.a5'

    assert_file 'Gemfile', /gem "rspec", ">=2.0.0.a5"/
  end

  def test_gem_should_insert_on_separate_lines
    run_generator

    action :gem, 'rspec'
    action :gem, 'rspec-rails'

    assert_file 'Gemfile', /gem "rspec"$/
    assert_file 'Gemfile', /gem "rspec-rails"$/
  end

  def test_environment_should_include_data_in_environment_initializer_block
    run_generator
    autoload_paths = 'config.autoload_paths += %w["#{Rails.root}/app/extras"]'
    action :environment, autoload_paths
    assert_file 'config/application.rb', /#{Regexp.escape(autoload_paths)}/
  end

  def test_environment_with_block_should_include_block_contents_in_environment_initializer_block
    run_generator

    action :environment do
      '# This wont be added'
      '# This will be added'
    end

    assert_file 'config/application.rb' do |content|
      assert_match /# This will be added/, content
      assert_no_match /# This wont be added/, content
    end
  end

  def test_git_with_symbol_should_run_command_using_git_scm
    generator.expects(:run).once.with('git init')
    action :git, :init
  end

  def test_git_with_hash_should_run_each_command_using_git_scm
    generator.expects(:run).times(2)
    action :git, :rm => 'README', :add => '.'
  end

  def test_vendor_should_write_data_to_file_in_vendor
    action :vendor, 'vendor_file.rb', '# vendor data'
    assert_file 'vendor/vendor_file.rb', '# vendor data'
  end

  def test_lib_should_write_data_to_file_in_lib
    action :lib, 'my_library.rb', 'class MyLibrary'
    assert_file 'lib/my_library.rb', 'class MyLibrary'
  end

  def test_rakefile_should_write_date_to_file_in_lib_tasks
    action :rakefile, 'myapp.rake', 'task :run => [:environment]'
    assert_file 'lib/tasks/myapp.rake', 'task :run => [:environment]'
  end

  def test_initializer_should_write_date_to_file_in_config_initializers
    action :initializer, 'constants.rb', 'MY_CONSTANT = 42'
    assert_file 'config/initializers/constants.rb', 'MY_CONSTANT = 42'
  end

  def test_generate_should_run_script_generate_with_argument_and_options
    generator.expects(:run_ruby_script).once.with('script/rails generate model MyModel', :verbose => false)
    action :generate, 'model', 'MyModel'
  end

  def test_rake_should_run_rake_command_with_development_env
    generator.expects(:run).once.with('rake log:clear RAILS_ENV=development', :verbose => false)
    action :rake, 'log:clear'
  end

  def test_rake_with_env_option_should_run_rake_command_in_env
    generator.expects(:run).once.with('rake log:clear RAILS_ENV=production', :verbose => false)
    action :rake, 'log:clear', :env => 'production'
  end

  def test_rake_with_sudo_option_should_run_rake_command_with_sudo
    generator.expects(:run).once.with('sudo rake log:clear RAILS_ENV=development', :verbose => false)
    action :rake, 'log:clear', :sudo => true
  end

  def test_capify_should_run_the_capify_command
    generator.expects(:run).once.with('capify .', :verbose => false)
    action :capify!
  end

  def test_freeze_is_deprecated
    assert_deprecated do
      action :freeze!
    end
  end

  def test_route_should_add_data_to_the_routes_block_in_config_routes
    run_generator
    route_command = "route '/login', :controller => 'sessions', :action => 'new'"
    action :route, route_command
    assert_file 'config/routes.rb', /#{Regexp.escape(route_command)}/
  end

  def test_readme
    run_generator
    Rails::Generators::AppGenerator.expects(:source_root).times(2).returns(destination_root)
    assert_match(/Welcome to Rails/, action(:readme, "README"))
  end

  protected

    def action(*args, &block)
      silence(:stdout){ generator.send(*args, &block) }
    end

end