app_generator_test.rb 27.1 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 32 33
  db
  lib
  lib/tasks
34
  lib/assets
35
  log
A
Arun Agrawal 已提交
36
  test/test_helper.rb
37
  test/fixtures
38
  test/fixtures/files
M
Mike Moore 已提交
39 40 41 42
  test/controllers
  test/models
  test/helpers
  test/mailers
43 44
  test/integration
  vendor
J
José Valim 已提交
45
  vendor/assets
A
Arun Agrawal 已提交
46 47
  vendor/assets/stylesheets
  vendor/assets/javascripts
48
  tmp
49
  tmp/cache
J
José Valim 已提交
50
  tmp/cache/assets
51 52
)

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

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

60 61
  def default_files
    ::DEFAULT_APP_FILES
62 63
  end

64
  def test_assets
65
    run_generator
66

67 68
    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'/)
69
    assert_file("app/assets/stylesheets/application.css")
A
Arun Agrawal 已提交
70
    assert_file("app/assets/javascripts/application.js")
71 72
  end

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

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

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

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

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

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

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

128 129 130 131 132 133 134 135
        generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true },
                                                                   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
136
  end
137

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

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

150 151 152 153 154 155
  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

156 157 158 159 160 161
  def test_new_application_not_include_api_initializers
    run_generator

    assert_no_file 'config/initializers/cors.rb'
  end

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

166 167 168 169 170 171
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      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
172 173
  end

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

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

180 181 182 183 184 185
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_no_file "#{app_root}/config/initializers/callback_terminator.rb"
    end
186 187 188 189 190 191 192 193
  end

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

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

194 195 196 197 198 199
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/callback_terminator.rb"
    end
200 201
  end

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

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

208 209 210 211 212 213
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      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 = :marshal/)
    end
214 215
  end

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

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

222 223 224 225 226 227
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_no_file "#{app_root}/config/initializers/active_record_belongs_to_required_by_default.rb"
    end
228 229 230 231 232 233 234 235
  end

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

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

236 237 238 239 240 241
    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/active_record_belongs_to_required_by_default.rb"
    end
242 243
  end

244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
  def test_rails_update_does_not_create_ssl_options_by_default
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

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

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

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

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

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/ssl_options.rb"
    end
  end

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
  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
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      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
      generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/cors.rb"
    end
  end

298 299
  def test_application_names_are_not_singularized
    run_generator [File.join(destination_root, "hats")]
300
    assert_file "hats/config/environment.rb", /Rails\.application\.initialize!/
301 302
  end

303 304 305 306 307
  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 已提交
308
        assert_no_match %r{/^[ \t]+$/}, line
309 310 311 312
      end
    end
  end

J
José Valim 已提交
313 314 315
  def test_config_database_is_added_by_default
    run_generator
    assert_file "config/database.yml", /sqlite3/
316
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
317
      assert_gem "activerecord-jdbcsqlite3-adapter"
318 319
    else
      assert_gem "sqlite3"
320
    end
321 322 323 324 325
  end

  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
326
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
327
      assert_gem "activerecord-jdbcmysql-adapter"
328
    else
329
      assert_gem "mysql2", "'>= 0.3.18', '< 0.5'"
330
    end
J
José Valim 已提交
331 332
  end

333 334 335 336 337
  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

338 339 340
  def test_config_postgresql_database
    run_generator([destination_root, "-d", "postgresql"])
    assert_file "config/database.yml", /postgresql/
341
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
342
      assert_gem "activerecord-jdbcpostgresql-adapter"
343
    else
344
      assert_gem "pg", "'~> 0.18'"
345 346 347
    end
  end

348 349
  def test_config_jdbcmysql_database
    run_generator([destination_root, "-d", "jdbcmysql"])
350
    assert_file "config/database.yml", /mysql/
O
Oscar Del Ben 已提交
351
    assert_gem "activerecord-jdbcmysql-adapter"
352 353
  end

354 355
  def test_config_jdbcsqlite3_database
    run_generator([destination_root, "-d", "jdbcsqlite3"])
356
    assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
357
    assert_gem "activerecord-jdbcsqlite3-adapter"
358 359
  end

360 361
  def test_config_jdbcpostgresql_database
    run_generator([destination_root, "-d", "jdbcpostgresql"])
362
    assert_file "config/database.yml", /postgresql/
O
Oscar Del Ben 已提交
363
    assert_gem "activerecord-jdbcpostgresql-adapter"
364 365
  end

A
Arun Agrawal 已提交
366 367 368
  def test_config_jdbc_database
    run_generator([destination_root, "-d", "jdbc"])
    assert_file "config/database.yml", /jdbc/
369
    assert_file "config/database.yml", /mssql/
O
Oscar Del Ben 已提交
370
    assert_gem "activerecord-jdbc-adapter"
A
Arun Agrawal 已提交
371 372
  end

373 374
  if defined?(JRUBY_VERSION)
    def test_config_jdbc_database_when_no_option_given
375
      run_generator
376
      assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
377
      assert_gem "activerecord-jdbcsqlite3-adapter"
378 379 380
    end
  end

381 382 383 384 385 386 387 388 389 390 391 392 393 394
  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 已提交
395 396 397 398 399
  def test_generator_defaults_to_puma_version
    run_generator [destination_root]
    assert_gem "puma", "'~> 3.0'"
  end

S
schneems 已提交
400 401 402 403 404 405 406 407
  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

408
  def test_generator_if_skip_active_record_is_given
409
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
410
    assert_no_file "config/database.yml"
411
    assert_no_file "config/initializers/active_record_belongs_to_required_by_default.rb"
412
    assert_no_file "app/models/application_record.rb"
413
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
414
    assert_file "test/test_helper.rb" do |helper_content|
415
      assert_no_match(/fixtures :all/, helper_content)
416
    end
J
José Valim 已提交
417 418
  end

419 420 421 422 423 424 425 426 427 428 429 430 431 432
  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

433 434 435 436 437 438 439
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

440
  def test_generator_if_skip_sprockets_is_given
441
    run_generator [destination_root, "--skip-sprockets"]
442
    assert_no_file "config/initializers/assets.rb"
443
    assert_file "config/application.rb" do |content|
444
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
445
    end
446
    assert_file "Gemfile" do |content|
447
      assert_no_match(/jquery-rails/, content)
448 449
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
450
      assert_no_match(/coffee-rails/, content)
451
    end
452 453 454 455 456
    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 已提交
457 458
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
459
    end
460
  end
J
José Valim 已提交
461

462 463 464
  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["']/
465
    assert_no_file "config/cable.yml"
466 467
    assert_no_file "app/assets/javascripts/cable.coffee"
    assert_no_file "app/channels"
468 469 470 471 472 473 474
    assert_file "Gemfile" do |content|
      assert_no_match(/redis/, content)
    end
  end

  def test_action_cable_redis_gems
    run_generator
475
    assert_file "Gemfile", /^# gem 'redis'/
476 477
  end

478
  def test_inclusion_of_javascript_runtime
479
    run_generator
480
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
481
      assert_gem "therubyrhino"
482
    else
483
      assert_file "Gemfile", /# gem 'therubyracer', platforms: :ruby/
484 485 486
    end
  end

487 488 489 490 491 492
  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 已提交
493
    assert_gem "jquery-rails"
494 495 496 497 498 499 500 501
  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 已提交
502
    assert_gem "prototype-rails"
J
José Valim 已提交
503
  end
504

505 506
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
507 508 509 510

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

511
    assert_file "app/views/layouts/application.html.erb" do |contents|
512 513
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
514
    end
515

516
    assert_file "Gemfile" do |content|
517
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
518
      assert_no_match(/jquery-rails/, content)
519
    end
520
  end
521

A
Arun Agrawal 已提交
522 523
  def test_inclusion_of_jbuilder
    run_generator
524
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
525 526
  end

527
  def test_inclusion_of_a_debugger
528
    run_generator
529
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
530
      assert_file "Gemfile" do |content|
531
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
532
      end
533
    else
534
      assert_gem 'byebug'
A
Arun Agrawal 已提交
535
    end
536 537
  end

538
  def test_inclusion_of_listen_related_configuration_by_default
539 540
    run_generator
    if RbConfig::CONFIG['host_os'] =~ /darwin|linux/
541
      assert_listen_related_configuration
542
    else
543
      assert_no_listen_related_configuration
544 545 546
    end
  end

547 548 549 550 551
  def test_non_inclusion_of_listen_related_configuration_if_skip_listen
    run_generator [destination_root, '--skip-listen']
    assert_no_listen_related_configuration
  end

552 553 554 555 556 557 558 559 560 561 562
  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

563
  def test_template_from_dir_pwd
564
    FileUtils.cd(Rails.root)
565
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
566 567
  end

J
José Valim 已提交
568
  def test_usage_read_from_file
569 570 571
    assert_called(File, :read, returns: "USAGE FROM FILE") do
      assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
    end
J
José Valim 已提交
572 573 574
  end

  def test_default_usage
575 576 577
    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 已提交
578 579 580
  end

  def test_default_namespace
581
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
582 583
  end

584 585 586 587 588
  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

589 590
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
591 592 593
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

594 595
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
596 597
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
598
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
599 600
  end

601
  def test_new_hash_style
602
    run_generator
603
    assert_file "config/initializers/session_store.rb" do |file|
604
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
605 606 607
    end
  end

608 609 610 611 612
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

613
  def test_application_name_with_spaces
614
    path = File.join(destination_root, "foo bar")
615 616 617 618 619 620 621 622

    # 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

623 624 625 626 627
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

628 629 630 631
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
632
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
633
      assert_no_match(/gem 'web-console', '~> 3.0'/, content)
634 635 636 637 638 639 640
    end
  end

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

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
641
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
642
      assert_no_match(/gem 'web-console', '~> 3.0'/, content)
643 644 645
    end
  end

646 647
  def test_spring
    run_generator
648
    assert_gem 'spring'
649 650 651
  end

  def test_spring_binstubs
652
    jruby_skip "spring doesn't run on JRuby"
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
    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
668 669 670
  end

  def test_spring_no_fork
671
    jruby_skip "spring doesn't run on JRuby"
672 673
    assert_called_with(Process, :respond_to?, [:fork], returns: false) do
      run_generator
674

675 676 677
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
678 679 680 681 682 683 684 685 686 687 688
    end
  end

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

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

689 690 691 692 693 694 695 696
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

697 698
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
699 700 701 702 703 704 705 706 707 708 709 710

    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

711 712 713 714 715 716 717 718 719 720 721 722
  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|
723
      assert_no_match(/sqlite/i, content)
724 725 726 727 728 729 730
    end
  end

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

    assert_file '.gitignore' do |content|
731
      assert_no_match(/sqlite/i, content)
732 733 734
    end
  end

735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
  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

759 760
  def test_psych_gem
    run_generator
761
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
762 763 764 765 766 767 768 769 770 771

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

772 773 774 775 776
  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

777 778 779 780
    check_open = -> *args do
      assert_equal [ path, 'Accept' => 'application/x-thor-template' ], args
      template
    end
781

782 783
    sequence = ['install', 'exec spring binstub --all', 'echo ran after_bundle']
      @sequence_step ||= 0
784
    ensure_bundler_first = -> command do
785 786 787 788 789 790 791 792 793 794 795
      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
796 797

    assert_equal 3, @sequence_step
798 799
  end

800
  protected
J
José Valim 已提交
801

802 803 804 805 806 807 808
  def stub_rails_application(root)
    Rails.application.config.root = root
    Rails.application.class.stub(:name, "Myapp") do
      yield
    end
  end

809
  def action(*args, &block)
810
    capture(:stdout) { generator.send(*args, &block) }
811
  end
O
Oscar Del Ben 已提交
812

813 814 815 816 817 818
  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 已提交
819
  end
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838

  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
839
end