app_generator_test.rb 14.0 KB
Newer Older
J
José Valim 已提交
1
require 'generators/generators_test_helper'
2
require 'rails/generators/rails/app/app_generator'
3
require 'generators/shared_generator_tests'
J
José Valim 已提交
4

5 6
DEFAULT_APP_FILES = %w(
  .gitignore
A
Arun Agrawal 已提交
7
  README.rdoc
8 9 10
  Gemfile
  Rakefile
  config.ru
J
José Valim 已提交
11 12
  app/assets/javascripts
  app/assets/stylesheets
13
  app/assets/images
14
  app/controllers
F
Francesco Rodriguez 已提交
15
  app/controllers/concerns
16
  app/helpers
17
  app/mailers
18
  app/models
F
Francesco Rodriguez 已提交
19
  app/models/concerns
20
  app/views/layouts
21 22 23
  bin/bundle
  bin/rails
  bin/rake
24 25 26 27 28 29
  config/environments
  config/initializers
  config/locales
  db
  lib
  lib/tasks
30
  lib/assets
31 32
  log
  test/fixtures
M
Mike Moore 已提交
33 34 35 36
  test/controllers
  test/models
  test/helpers
  test/mailers
37 38
  test/integration
  vendor
J
José Valim 已提交
39
  vendor/assets
40
  tmp/cache
J
José Valim 已提交
41
  tmp/cache/assets
42 43
)

44 45
class AppGeneratorTest < Rails::Generators::TestCase
  include GeneratorsTestHelper
46
  arguments [destination_root]
47 48

  # brings setup, teardown, and some tests
49
  include SharedGeneratorTests
J
José Valim 已提交
50

51 52
  def default_files
    ::DEFAULT_APP_FILES
53 54
  end

55
  def test_assets
56
    run_generator
57 58 59 60

    assert_file("app/views/layouts/application.html.erb", /stylesheet_link_tag\s+"application", media: "all", "data-turbolinks-track" => true/)
    assert_file("app/views/layouts/application.html.erb", /javascript_include_tag\s+"application", "data-turbolinks-track" => true/)
    assert_file("app/assets/stylesheets/application.css")
61 62
  end

63
  def test_invalid_application_name_raises_an_error
64
    content = capture(:stderr){ run_generator [File.join(destination_root, "43-things")] }
65 66 67 68
    assert_equal "Invalid application name 43-things. Please give a name which does not start with numbers.\n", content
  end

  def test_invalid_application_name_is_fixed
69
    run_generator [File.join(destination_root, "things-43")]
70
    assert_file "things-43/config/environment.rb", /Rails\.application\.initialize!/
71
    assert_file "things-43/config/application.rb", /^module Things43$/
72 73
  end

74
  def test_application_new_exits_with_non_zero_code_on_invalid_application_name
A
Akira Matsuda 已提交
75
    quietly { system 'rails new test --no-rc' }
76
    assert_equal false, $?.success?
77 78 79 80 81 82 83 84 85 86 87
  end

  def test_application_new_exits_with_message_and_non_zero_code_when_generating_inside_existing_rails_directory
    app_root = File.join(destination_root, 'myfirstapp')
    run_generator [app_root]
    output = nil
    Dir.chdir(app_root) do
      output = `rails new mysecondapp`
    end
    assert_equal "Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.\nType 'rails' for help.\n", output
    assert_equal false, $?.success?
88 89
  end

90 91 92 93 94 95
  def test_application_new_show_help_message_inside_existing_rails_directory
    app_root = File.join(destination_root, 'myfirstapp')
    run_generator [app_root]
    output = Dir.chdir(app_root) do
      `rails new --help`
    end
96
    assert_match(/rails new APP_PATH \[options\]/, output)
97 98 99
    assert_equal true, $?.success?
  end

100 101 102 103 104 105 106 107
  def test_application_name_is_detected_if_it_exists_and_app_folder_renamed
    app_root       = File.join(destination_root, "myapp")
    app_moved_root = File.join(destination_root, "myapp_moved")

    run_generator [app_root]

    Rails.application.config.root = app_moved_root
    Rails.application.class.stubs(:name).returns("Myapp")
108
    Rails.application.stubs(:is_a?).returns(Rails::Application)
109 110 111

    FileUtils.mv(app_root, app_moved_root)

112 113
    generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true },
                                                               destination_root: app_moved_root, shell: @shell
114
    generator.send(:app_const)
115
    quietly { generator.send(:create_config_files) }
116
    assert_file "myapp_moved/config/environment.rb", /Rails\.application\.initialize!/
117
    assert_file "myapp_moved/config/initializers/session_store.rb", /_myapp_session/
118
  end
119

120 121 122
  def test_rails_update_generates_correct_session_key
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]
123

124 125 126 127
    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

128
    generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
129
    generator.send(:app_const)
130
    quietly { generator.send(:create_config_files) }
131 132
    assert_file "myapp/config/initializers/session_store.rb", /_myapp_session/
  end
133

134 135
  def test_application_names_are_not_singularized
    run_generator [File.join(destination_root, "hats")]
136
    assert_file "hats/config/environment.rb", /Rails\.application\.initialize!/
137 138
  end

139 140 141 142 143
  def test_gemfile_has_no_whitespace_errors
    run_generator
    absolute = File.expand_path("Gemfile", destination_root)
    File.open(absolute, 'r') do |f|
      f.each_line do |line|
A
Arun Agrawal 已提交
144
        assert_no_match %r{/^[ \t]+$/}, line
145 146 147 148
      end
    end
  end

J
José Valim 已提交
149 150 151
  def test_config_database_is_added_by_default
    run_generator
    assert_file "config/database.yml", /sqlite3/
152
    unless defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
153
      assert_gem "sqlite3"
154
    else
O
Oscar Del Ben 已提交
155
      assert_gem "activerecord-jdbcsqlite3-adapter"
156
    end
157 158
  end

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
  def test_add_gemfile_entry
    template = Tempfile.open 'my_template'
    template.puts 'gemfile_entry "tenderlove"'
    template.flush

    run_generator([destination_root, "-m", template.path])
    assert_file "Gemfile", /tenderlove/
  ensure
    template.close
    template.unlink
  end

  def test_add_skip_entry
    template = Tempfile.open 'my_template'
    template.puts 'add_gem_entry_filter { |gem| gem.name != "jbuilder" }'
    template.flush

    run_generator([destination_root, "-m", template.path])
    assert_file "Gemfile" do |contents|
      assert_no_match 'jbuilder', contents
    end
  ensure
    template.close
    template.unlink
  end

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
  def test_application_html_checks_gems
    template = Tempfile.open 'my_template'
    template.puts 'add_gem_entry_filter { |gem| gem.name != "turbolinks" }'
    template.flush

    run_generator([destination_root, "-m", template.path])
    assert_file "Gemfile" do |contents|
      assert_no_match 'turbolinks', contents
    end
    assert_file "Gemfile" do |contents|
      assert_no_match 'turbolinks', contents
    end
    assert_file "app/views/layouts/application.html.erb" do |contents|
      assert_no_match 'turbolinks', contents
    end
  ensure
    template.close
    template.unlink
  end

205 206 207
  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
208
    unless defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
209
      assert_gem "mysql2"
210
    else
O
Oscar Del Ben 已提交
211
      assert_gem "activerecord-jdbcmysql-adapter"
212
    end
J
José Valim 已提交
213 214
  end

215 216 217 218 219
  def test_config_database_app_name_with_period
    run_generator [File.join(destination_root, "common.usage.com"), "-d", "postgresql"]
    assert_file "common.usage.com/config/database.yml", /common_usage_com/
  end

220 221 222 223
  def test_config_postgresql_database
    run_generator([destination_root, "-d", "postgresql"])
    assert_file "config/database.yml", /postgresql/
    unless defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
224
      assert_gem "pg"
225
    else
O
Oscar Del Ben 已提交
226
      assert_gem "activerecord-jdbcpostgresql-adapter"
227 228 229
    end
  end

230 231
  def test_config_jdbcmysql_database
    run_generator([destination_root, "-d", "jdbcmysql"])
232
    assert_file "config/database.yml", /mysql/
O
Oscar Del Ben 已提交
233
    assert_gem "activerecord-jdbcmysql-adapter"
234 235
  end

236 237
  def test_config_jdbcsqlite3_database
    run_generator([destination_root, "-d", "jdbcsqlite3"])
238
    assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
239
    assert_gem "activerecord-jdbcsqlite3-adapter"
240 241
  end

242 243
  def test_config_jdbcpostgresql_database
    run_generator([destination_root, "-d", "jdbcpostgresql"])
244
    assert_file "config/database.yml", /postgresql/
O
Oscar Del Ben 已提交
245
    assert_gem "activerecord-jdbcpostgresql-adapter"
246 247
  end

A
Arun Agrawal 已提交
248 249 250
  def test_config_jdbc_database
    run_generator([destination_root, "-d", "jdbc"])
    assert_file "config/database.yml", /jdbc/
251
    assert_file "config/database.yml", /mssql/
O
Oscar Del Ben 已提交
252
    assert_gem "activerecord-jdbc-adapter"
A
Arun Agrawal 已提交
253 254
  end

255 256 257 258
  def test_config_jdbc_database_when_no_option_given
    if defined?(JRUBY_VERSION)
      run_generator([destination_root])
      assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
259
      assert_gem "activerecord-jdbcsqlite3-adapter"
260 261 262
    end
  end

263
  def test_generator_if_skip_active_record_is_given
264
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
265
    assert_no_file "config/database.yml"
266
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
267
    assert_file "test/test_helper.rb" do |helper_content|
268
      assert_no_match(/fixtures :all/, helper_content)
269
    end
J
José Valim 已提交
270 271
  end

272 273 274 275 276
  def test_generator_if_skip_action_view_is_given
    run_generator [destination_root, "--skip-action-view"]
    assert_file "config/application.rb", /#\s+require\s+["']action_view\/railtie["']/
  end

277
  def test_generator_if_skip_sprockets_is_given
278 279
    run_generator [destination_root, "--skip-sprockets"]
    assert_file "config/application.rb" do |content|
280
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
281
      assert_match(/config\.assets\.enabled = false/, content)
282
    end
283 284 285
    assert_file "Gemfile" do |content|
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
286
      assert_match(/coffee-rails/, content)
287
    end
288 289 290 291 292
    assert_file "config/environments/development.rb" do |content|
      assert_no_match(/config\.assets\.debug = true/, content)
    end
    assert_file "config/environments/production.rb" do |content|
      assert_no_match(/config\.assets\.digest = true/, content)
J
Joshua Peek 已提交
293 294
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
295
      assert_no_match(/config\.assets\.version = '1\.0'/, content)
296
    end
297
  end
J
José Valim 已提交
298

299
  def test_inclusion_of_javascript_runtime
300
    run_generator([destination_root])
301
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
302
      assert_gem "therubyrhino"
303
    else
A
Arun Agrawal 已提交
304
      assert_file "Gemfile", /# gem\s+["']therubyracer["']+, \s+platforms: :ruby$/
305 306 307
    end
  end

308
  def test_creation_of_a_test_directory
J
José Valim 已提交
309
    run_generator
310 311 312
    assert_file 'test'
  end

313 314 315 316 317
  def test_creation_of_app_assets_images_directory
    run_generator
    assert_file "app/assets/images"
  end

318 319 320 321 322
  def test_creation_of_vendor_assets_javascripts_directory
    run_generator
    assert_file "vendor/assets/javascripts"
  end

323 324 325 326 327
  def test_creation_of_vendor_assets_stylesheets_directory
    run_generator
    assert_file "vendor/assets/stylesheets"
  end

328 329 330 331 332 333
  def test_jquery_is_the_default_javascript_library
    run_generator
    assert_file "app/assets/javascripts/application.js" do |contents|
      assert_match %r{^//= require jquery}, contents
      assert_match %r{^//= require jquery_ujs}, contents
    end
334
    assert_file "Gemfile", /^gem 'jquery-rails'/
335 336 337 338 339 340 341 342
  end

  def test_other_javascript_libraries
    run_generator [destination_root, '-j', 'prototype']
    assert_file "app/assets/javascripts/application.js" do |contents|
      assert_match %r{^//= require prototype}, contents
      assert_match %r{^//= require prototype_ujs}, contents
    end
O
Oscar Del Ben 已提交
343
    assert_gem "prototype-rails"
J
José Valim 已提交
344
  end
345

346 347
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
348 349 350 351

    assert_no_file "app/assets/javascripts"
    assert_no_file "vendor/assets/javascripts"

352 353
    assert_file "app/views/layouts/application.html.erb" do |contents|
      assert_match(/stylesheet_link_tag\s+"application", media: "all" %>/, contents)
354
      assert_no_match(/javascript_include_tag\s+"application" \%>/, contents)
355
    end
356

357
    assert_file "Gemfile" do |content|
358
      assert_no_match(/coffee-rails/, content)
359
    end
360
  end
361

A
Arun Agrawal 已提交
362 363 364 365 366
  def test_inclusion_of_jbuilder
    run_generator
    assert_file "Gemfile", /gem 'jbuilder'/
  end

S
Santiago Pastorino 已提交
367
  def test_inclusion_of_debugger
368
    run_generator
O
Oscar Del Ben 已提交
369
    assert_file "Gemfile", /# gem 'debugger'/
370 371
  end

X
Xavier Noria 已提交
372 373
  def test_inclusion_of_lazy_loaded_sdoc
    run_generator
A
Arun Agrawal 已提交
374
    assert_file 'Gemfile', /gem 'sdoc', \s+group: :doc, require: false/
X
Xavier Noria 已提交
375 376
  end

377
  def test_template_from_dir_pwd
378
    FileUtils.cd(Rails.root)
379
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
380 381
  end

J
José Valim 已提交
382 383 384 385 386 387
  def test_usage_read_from_file
    File.expects(:read).returns("USAGE FROM FILE")
    assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
  end

  def test_default_usage
388
    Rails::Generators::AppGenerator.expects(:usage_path).returns(nil)
389
    assert_match(/Create rails files for app generator/, Rails::Generators::AppGenerator.desc)
J
José Valim 已提交
390 391 392
  end

  def test_default_namespace
393
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
394 395
  end

396 397 398 399 400
  def test_file_is_added_for_backwards_compatibility
    action :file, 'lib/test_file.rb', 'heres test data'
    assert_file 'lib/test_file.rb', 'heres test data'
  end

401 402
  def test_test_unit_is_removed_from_frameworks_if_skip_test_unit_is_given
    run_generator [destination_root, "--skip-test-unit"]
403 404 405 406 407 408 409
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

  def test_no_active_record_or_test_unit_if_skips_given
    run_generator [destination_root, "--skip-test-unit", "--skip-active-record"]
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
410 411
  end

412 413 414
  def test_new_hash_style
    run_generator [destination_root]
    assert_file "config/initializers/session_store.rb" do |file|
415
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
416 417 418
    end
  end

419 420 421 422 423
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

424 425 426 427 428 429 430 431 432 433
  def test_application_name_with_spaces
    path = File.join(destination_root, "foo bar".shellescape)

    # This also applies to MySQL apps but not with SQLite
    run_generator [path, "-d", 'postgresql']

    assert_file "foo bar/config/database.yml", /database: foo_bar_development/
    assert_file "foo bar/config/initializers/session_store.rb", /key: '_foo_bar/
  end

434
protected
J
José Valim 已提交
435

436
  def action(*args, &block)
437
    silence(:stdout) { generator.send(*args, &block) }
438
  end
O
Oscar Del Ben 已提交
439 440 441 442

  def assert_gem(gem)
    assert_file "Gemfile", /^gem\s+["']#{gem}["']$/
  end
443
end