app_generator_test.rb 25.2 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
7
  README.md
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/jobs
21
  app/views/layouts
22 23 24
  bin/bundle
  bin/rails
  bin/rake
25
  bin/setup
26 27 28
  config/environments
  config/initializers
  config/locales
29
  config/cable.yml
S
schneems 已提交
30
  config/puma.rb
31
  config/spring.rb
32 33 34
  db
  lib
  lib/tasks
35
  lib/assets
36
  log
A
Arun Agrawal 已提交
37
  test/test_helper.rb
38
  test/fixtures
39
  test/fixtures/files
M
Mike Moore 已提交
40 41 42 43
  test/controllers
  test/models
  test/helpers
  test/mailers
44 45
  test/integration
  vendor
J
José Valim 已提交
46
  vendor/assets
A
Arun Agrawal 已提交
47 48
  vendor/assets/stylesheets
  vendor/assets/javascripts
49
  tmp
50
  tmp/cache
J
José Valim 已提交
51
  tmp/cache/assets
52 53
)

54 55
class AppGeneratorTest < Rails::Generators::TestCase
  include GeneratorsTestHelper
56
  arguments [destination_root]
57 58

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

61 62
  def default_files
    ::DEFAULT_APP_FILES
63 64
  end

65
  def test_assets
66
    run_generator
67

J
Jeroen Visser 已提交
68 69
    assert_file("app/views/layouts/application.html.erb", /stylesheet_link_tag\s+'application', media: 'all', 'data-turbolinks-track': 'reload'/)
    assert_file("app/views/layouts/application.html.erb", /javascript_include_tag\s+'application', 'data-turbolinks-track': 'reload'/)
70
    assert_file("app/assets/stylesheets/application.css")
A
Arun Agrawal 已提交
71
    assert_file("app/assets/javascripts/application.js")
72 73
  end

74 75 76 77 78
  def test_application_job_file_present
    run_generator
    assert_file("app/jobs/application_job.rb")
  end

79
  def test_invalid_application_name_raises_an_error
80
    content = capture(:stderr){ run_generator [File.join(destination_root, "43-things")] }
81 82 83 84
    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
85
    run_generator [File.join(destination_root, "things-43")]
86
    assert_file "things-43/config/environment.rb", /Rails\.application\.initialize!/
87
    assert_file "things-43/config/application.rb", /^module Things43$/
88 89
  end

90
  def test_application_new_exits_with_non_zero_code_on_invalid_application_name
A
Akira Matsuda 已提交
91
    quietly { system 'rails new test --no-rc' }
92
    assert_equal false, $?.success?
93 94 95 96 97 98 99 100 101 102 103
  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?
104 105
  end

106 107 108 109 110 111
  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
112
    assert_match(/rails new APP_PATH \[options\]/, output)
113 114 115
    assert_equal true, $?.success?
  end

116 117 118 119 120 121
  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]

122 123 124
    stub_rails_application(app_moved_root) do
      Rails.application.stub(:is_a?, -> *args { Rails::Application }) do
        FileUtils.mv(app_root, app_moved_root)
125

126 127
        # make sure we are in correct dir
        FileUtils.cd(app_moved_root)
128

129
        generator = Rails::Generators::AppGenerator.new ["rails"], [],
130 131 132 133 134 135 136
                                                                   destination_root: app_moved_root, shell: @shell
        generator.send(:app_const)
        quietly { generator.send(:update_config_files) }
        assert_file "myapp_moved/config/environment.rb", /Rails\.application\.initialize!/
        assert_file "myapp_moved/config/initializers/session_store.rb", /_myapp_session/
      end
    end
137
  end
138

139 140 141
  def test_rails_update_generates_correct_session_key
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]
142

143
    stub_rails_application(app_root) do
144
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
145 146 147 148
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "myapp/config/initializers/session_store.rb", /_myapp_session/
    end
149
  end
150

151 152 153 154 155 156
  def test_new_application_use_json_serialzier
    run_generator

    assert_file("config/initializers/cookies_serializer.rb", /Rails\.application\.config\.action_dispatch\.cookies_serializer = :json/)
  end

157 158 159 160 161 162
  def test_new_application_not_include_api_initializers
    run_generator

    assert_no_file 'config/initializers/cors.rb'
  end

163 164 165 166
  def test_rails_update_keep_the_cookie_serializer_if_it_is_already_configured
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

167
    stub_rails_application(app_root) do
168
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
169 170 171 172
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file("#{app_root}/config/initializers/cookies_serializer.rb", /Rails\.application\.config\.action_dispatch\.cookies_serializer = :json/)
    end
173 174
  end

175
  def test_rails_update_set_the_cookie_serializer_to_marshal_if_it_is_not_already_configured
176 177 178 179 180
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    FileUtils.rm("#{app_root}/config/initializers/cookies_serializer.rb")

181
    stub_rails_application(app_root) do
182
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
183 184
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
185 186
      assert_file("#{app_root}/config/initializers/cookies_serializer.rb",
                  /Valid options are :json, :marshal, and :hybrid\.\nRails\.application\.config\.action_dispatch\.cookies_serializer = :marshal/)
187
    end
188 189
  end

190 191 192 193 194 195 196 197 198 199 200 201 202 203
  def test_rails_update_dont_set_file_watcher
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/environments/development.rb" do |content|
        assert_match(/# config.file_watcher/, content)
      end
    end
  end

204
  def test_rails_update_does_not_create_new_framework_defaults_by_default
205 206 207
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

208
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults.rb")
209 210 211 212 213

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
214
      assert_no_file "#{app_root}/config/initializers/new_framework_defaults.rb"
215 216 217
    end
  end

218
  def test_rails_update_does_not_new_framework_defaults_if_already_present
219 220 221
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

222
    FileUtils.touch("#{app_root}/config/initializers/new_framework_defaults.rb")
223 224

    stub_rails_application(app_root) do
225
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
226 227
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
228
      assert_file "#{app_root}/config/initializers/new_framework_defaults.rb"
229 230 231
    end
  end

232 233 234 235 236
  def test_rails_update_does_not_create_rack_cors
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    stub_rails_application(app_root) do
237
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
238 239 240 241 242 243 244 245 246 247 248 249 250
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_no_file "#{app_root}/config/initializers/cors.rb"
    end
  end

  def test_rails_update_does_not_remove_rack_cors_if_already_present
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    FileUtils.touch("#{app_root}/config/initializers/cors.rb")

    stub_rails_application(app_root) do
251
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
252 253 254 255 256 257
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/cors.rb"
    end
  end

258 259
  def test_application_names_are_not_singularized
    run_generator [File.join(destination_root, "hats")]
260
    assert_file "hats/config/environment.rb", /Rails\.application\.initialize!/
261 262
  end

263 264 265 266 267
  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 已提交
268
        assert_no_match %r{/^[ \t]+$/}, line
269 270 271 272
      end
    end
  end

J
José Valim 已提交
273 274 275
  def test_config_database_is_added_by_default
    run_generator
    assert_file "config/database.yml", /sqlite3/
276
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
277
      assert_gem "activerecord-jdbcsqlite3-adapter"
278 279
    else
      assert_gem "sqlite3"
280
    end
281 282 283 284 285
  end

  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
286
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
287
      assert_gem "activerecord-jdbcmysql-adapter"
288
    else
289
      assert_gem "mysql2", "'>= 0.3.18', '< 0.5'"
290
    end
J
José Valim 已提交
291 292
  end

293 294 295 296 297
  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

298 299 300
  def test_config_postgresql_database
    run_generator([destination_root, "-d", "postgresql"])
    assert_file "config/database.yml", /postgresql/
301
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
302
      assert_gem "activerecord-jdbcpostgresql-adapter"
303
    else
304
      assert_gem "pg", "'~> 0.18'"
305 306 307
    end
  end

308 309
  def test_config_jdbcmysql_database
    run_generator([destination_root, "-d", "jdbcmysql"])
310
    assert_file "config/database.yml", /mysql/
O
Oscar Del Ben 已提交
311
    assert_gem "activerecord-jdbcmysql-adapter"
312 313
  end

314 315
  def test_config_jdbcsqlite3_database
    run_generator([destination_root, "-d", "jdbcsqlite3"])
316
    assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
317
    assert_gem "activerecord-jdbcsqlite3-adapter"
318 319
  end

320 321
  def test_config_jdbcpostgresql_database
    run_generator([destination_root, "-d", "jdbcpostgresql"])
322
    assert_file "config/database.yml", /postgresql/
O
Oscar Del Ben 已提交
323
    assert_gem "activerecord-jdbcpostgresql-adapter"
324 325
  end

A
Arun Agrawal 已提交
326 327 328
  def test_config_jdbc_database
    run_generator([destination_root, "-d", "jdbc"])
    assert_file "config/database.yml", /jdbc/
329
    assert_file "config/database.yml", /mssql/
O
Oscar Del Ben 已提交
330
    assert_gem "activerecord-jdbc-adapter"
A
Arun Agrawal 已提交
331 332
  end

333 334
  if defined?(JRUBY_VERSION)
    def test_config_jdbc_database_when_no_option_given
335
      run_generator
336
      assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
337
      assert_gem "activerecord-jdbcsqlite3-adapter"
338 339 340
    end
  end

341 342 343 344 345 346 347 348 349 350 351 352 353 354
  def test_generator_without_skips
    run_generator
    assert_file "config/application.rb", /\s+require\s+["']rails\/all["']/
    assert_file "config/environments/development.rb" do |content|
      assert_match(/config\.action_mailer\.raise_delivery_errors = false/, content)
    end
    assert_file "config/environments/test.rb" do |content|
      assert_match(/config\.action_mailer\.delivery_method = :test/, content)
    end
    assert_file "config/environments/production.rb" do |content|
      assert_match(/# config\.action_mailer\.raise_delivery_errors = false/, content)
    end
  end

S
schneems 已提交
355 356 357 358 359
  def test_generator_defaults_to_puma_version
    run_generator [destination_root]
    assert_gem "puma", "'~> 3.0'"
  end

S
schneems 已提交
360 361 362 363 364 365 366 367
  def test_generator_if_skip_puma_is_given
    run_generator [destination_root, "--skip-puma"]
    assert_no_file "config/puma.rb"
    assert_file "Gemfile" do |content|
      assert_no_match(/puma/, content)
    end
  end

368
  def test_generator_if_skip_active_record_is_given
369
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
370
    assert_no_file "config/database.yml"
371
    assert_no_file "app/models/application_record.rb"
372
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
373
    assert_file "test/test_helper.rb" do |helper_content|
374
      assert_no_match(/fixtures :all/, helper_content)
375
    end
376 377 378 379

    assert_file "config/initializers/new_framework_defaults.rb" do |initializer_content|
      assert_no_match(/belongs_to_required_by_default/, initializer_content)
    end
J
José Valim 已提交
380 381
  end

382 383 384 385 386 387 388 389 390 391 392 393 394 395
  def test_generator_if_skip_action_mailer_is_given
    run_generator [destination_root, "--skip-action-mailer"]
    assert_file "config/application.rb", /#\s+require\s+["']action_mailer\/railtie["']/
    assert_file "config/environments/development.rb" do |content|
      assert_no_match(/config\.action_mailer/, content)
    end
    assert_file "config/environments/test.rb" do |content|
      assert_no_match(/config\.action_mailer/, content)
    end
    assert_file "config/environments/production.rb" do |content|
      assert_no_match(/config\.action_mailer/, content)
    end
  end

396 397 398 399 400 401 402
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

403
  def test_generator_if_skip_sprockets_is_given
404
    run_generator [destination_root, "--skip-sprockets"]
405
    assert_no_file "config/initializers/assets.rb"
406
    assert_file "config/application.rb" do |content|
407
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
408
    end
409
    assert_file "Gemfile" do |content|
410
      assert_no_match(/jquery-rails/, content)
411 412
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
413
      assert_no_match(/coffee-rails/, content)
414
    end
415 416 417 418 419
    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 已提交
420 421
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
422
    end
423
  end
J
José Valim 已提交
424

425 426 427
  def test_generator_if_skip_action_cable_is_given
    run_generator [destination_root, "--skip-action-cable"]
    assert_file "config/application.rb", /#\s+require\s+["']action_cable\/engine["']/
428
    assert_no_file "config/cable.yml"
429
    assert_no_file "app/assets/javascripts/cable.js"
430
    assert_no_file "app/channels"
431 432 433 434 435 436 437
    assert_file "Gemfile" do |content|
      assert_no_match(/redis/, content)
    end
  end

  def test_action_cable_redis_gems
    run_generator
438
    assert_file "Gemfile", /^# gem 'redis'/
439 440
  end

441
  def test_inclusion_of_javascript_runtime
442
    run_generator
443
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
444
      assert_gem "therubyrhino"
445
    else
446
      assert_file "Gemfile", /# gem 'therubyracer', platforms: :ruby/
447 448 449
    end
  end

450 451 452 453 454 455
  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
A
Arun Agrawal 已提交
456
    assert_gem "jquery-rails"
457 458 459 460 461 462 463 464
  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 已提交
465
    assert_gem "prototype-rails"
J
José Valim 已提交
466
  end
467

468 469
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
470 471 472 473

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

474
    assert_file "app/views/layouts/application.html.erb" do |contents|
475 476
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
477
    end
478

479
    assert_file "Gemfile" do |content|
480
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
481
      assert_no_match(/jquery-rails/, content)
482
    end
483
  end
484

A
Arun Agrawal 已提交
485 486
  def test_inclusion_of_jbuilder
    run_generator
487
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
488 489
  end

490
  def test_inclusion_of_a_debugger
491
    run_generator
492
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
493
      assert_file "Gemfile" do |content|
494
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
495
      end
496
    else
497
      assert_gem 'byebug'
A
Arun Agrawal 已提交
498
    end
499 500
  end

501
  def test_inclusion_of_listen_related_configuration_by_default
502 503
    run_generator
    if RbConfig::CONFIG['host_os'] =~ /darwin|linux/
504
      assert_listen_related_configuration
505
    else
506
      assert_no_listen_related_configuration
507 508 509
    end
  end

510 511 512 513 514
  def test_non_inclusion_of_listen_related_configuration_if_skip_listen
    run_generator [destination_root, '--skip-listen']
    assert_no_listen_related_configuration
  end

515 516 517 518 519 520 521 522 523 524 525
  def test_evented_file_update_checker_config
    run_generator
    assert_file 'config/environments/development.rb' do |content|
      if RbConfig::CONFIG['host_os'] =~ /darwin|linux/
        assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      else
        assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      end
    end
  end

526
  def test_template_from_dir_pwd
527
    FileUtils.cd(Rails.root)
528
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
529 530
  end

J
José Valim 已提交
531
  def test_usage_read_from_file
532 533 534
    assert_called(File, :read, returns: "USAGE FROM FILE") do
      assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
    end
J
José Valim 已提交
535 536 537
  end

  def test_default_usage
538 539 540
    assert_called(Rails::Generators::AppGenerator, :usage_path, returns: nil) do
      assert_match(/Create rails files for app generator/, Rails::Generators::AppGenerator.desc)
    end
J
José Valim 已提交
541 542 543
  end

  def test_default_namespace
544
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
545 546
  end

547 548 549 550 551
  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

552 553
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
554 555 556
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

557 558
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
559 560
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
561
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
562 563
  end

564
  def test_new_hash_style
565
    run_generator
566
    assert_file "config/initializers/session_store.rb" do |file|
567
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
568 569 570
    end
  end

571 572 573 574 575
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

576
  def test_application_name_with_spaces
577
    path = File.join(destination_root, "foo bar")
578 579 580 581 582 583 584 585

    # 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

586 587 588 589 590
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

591 592 593 594
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
595
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
596
      assert_no_match(/\Agem 'web-console'\z/, content)
597 598 599 600 601 602 603
    end
  end

  def test_web_console_with_edge_option
    run_generator [destination_root, "--edge"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
604
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
605
      assert_no_match(/\Agem 'web-console'\z/, content)
606 607 608
    end
  end

609 610
  def test_spring
    run_generator
611
    assert_gem 'spring'
612 613 614
  end

  def test_spring_binstubs
615
    jruby_skip "spring doesn't run on JRuby"
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
    command_check = -> command do
      @binstub_called ||= 0

      case command
      when 'install'
        # Called when running bundle, we just want to stub it so nothing to do here.
      when 'exec spring binstub --all'
        @binstub_called += 1
        assert_equal 1, @binstub_called, "exec spring binstub --all expected to be called once, but was called #{@install_called} times."
      end
    end

    generator.stub :bundle_command, command_check do
      quietly { generator.invoke_all }
    end
631 632 633
  end

  def test_spring_no_fork
634
    jruby_skip "spring doesn't run on JRuby"
R
Rafael Mendonça França 已提交
635
    assert_called_with(Process, :respond_to?, [[:fork], [:fork]], returns: false) do
636
      run_generator
637

638 639 640
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
641 642 643 644 645 646
    end
  end

  def test_skip_spring
    run_generator [destination_root, "--skip-spring"]

647
    assert_no_file 'config/spring.rb'
648 649 650 651 652
    assert_file "Gemfile" do |content|
      assert_no_match(/spring/, content)
    end
  end

653 654 655 656 657 658 659 660
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
      assert_no_match(/spring/, content)
    end
  end

661 662
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
663 664 665 666 667 668 669 670 671 672 673 674

    assert_file "Gemfile" do |content|
      assert_no_match(/turbolinks/, content)
    end
    assert_file "app/views/layouts/application.html.erb" do |content|
      assert_no_match(/data-turbolinks-track/, content)
    end
    assert_file "app/assets/javascripts/application.js" do |content|
      assert_no_match(/turbolinks/, content)
    end
  end

675 676 677 678 679 680 681 682 683 684 685 686
  def test_gitignore_when_sqlite3
    run_generator

    assert_file '.gitignore' do |content|
      assert_match(/sqlite3/, content)
    end
  end

  def test_gitignore_when_no_active_record
    run_generator [destination_root, '--skip-active-record']

    assert_file '.gitignore' do |content|
687
      assert_no_match(/sqlite/i, content)
688 689 690 691 692 693 694
    end
  end

  def test_gitignore_when_non_sqlite3_db
    run_generator([destination_root, "-d", "mysql"])

    assert_file '.gitignore' do |content|
695
      assert_no_match(/sqlite/i, content)
696 697 698
    end
  end

699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
  def test_create_keeps
    run_generator
    folders_with_keep = %w(
      app/assets/images
      app/controllers/concerns
      app/models/concerns
      lib/tasks
      lib/assets
      log
      test/fixtures
      test/fixtures/files
      test/controllers
      test/mailers
      test/models
      test/helpers
      test/integration
      tmp
      vendor/assets/stylesheets
    )
    folders_with_keep.each do |folder|
      assert_file("#{folder}/.keep")
    end
  end

723 724
  def test_psych_gem
    run_generator
725
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
726 727 728 729 730 731 732 733 734 735

    assert_file "Gemfile" do |content|
      if defined?(Rubinius)
        assert_match(gem_regex, content)
      else
        assert_no_match(gem_regex, content)
      end
    end
  end

736 737 738 739 740
  def test_after_bundle_callback
    path = 'http://example.org/rails_template'
    template = %{ after_bundle { run 'echo ran after_bundle' } }
    template.instance_eval "def read; self; end" # Make the string respond to read

741 742 743 744
    check_open = -> *args do
      assert_equal [ path, 'Accept' => 'application/x-thor-template' ], args
      template
    end
745

746 747
    sequence = ['install', 'exec spring binstub --all', 'echo ran after_bundle']
      @sequence_step ||= 0
748
    ensure_bundler_first = -> command do
749 750 751 752 753 754 755 756 757 758 759
      assert_equal sequence[@sequence_step], command, "commands should be called in sequence #{sequence}"
      @sequence_step += 1
    end

    generator([destination_root], template: path).stub(:open, check_open, template) do
      generator.stub(:bundle_command, ensure_bundler_first) do
        generator.stub(:run, ensure_bundler_first) do
          quietly { generator.invoke_all }
        end
      end
    end
760 761

    assert_equal 3, @sequence_step
762 763
  end

764
  protected
J
José Valim 已提交
765

766 767 768 769 770 771 772
  def stub_rails_application(root)
    Rails.application.config.root = root
    Rails.application.class.stub(:name, "Myapp") do
      yield
    end
  end

773
  def action(*args, &block)
774
    capture(:stdout) { generator.send(*args, &block) }
775
  end
O
Oscar Del Ben 已提交
776

777 778 779 780 781 782
  def assert_gem(gem, constraint = nil)
    if constraint
      assert_file "Gemfile", /^\s*gem\s+["']#{gem}["'], #{constraint}$*/
    else
      assert_file "Gemfile", /^\s*gem\s+["']#{gem}["']$*/
    end
O
Oscar Del Ben 已提交
783
  end
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802

  def assert_listen_related_configuration
    assert_gem 'listen'
    assert_gem 'spring-watcher-listen'

    assert_file 'config/environments/development.rb' do |content|
      assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
    end
  end

  def assert_no_listen_related_configuration
    assert_file 'Gemfile' do |content|
      assert_no_match(/listen/, content)
    end

    assert_file 'config/environments/development.rb' do |content|
      assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
    end
  end
803
end