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

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 130 131 132 133 134 135 136
        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
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 144 145 146 147 148
    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
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 168 169 170 171 172
    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
173 174
  end

175 176 177 178 179 180
  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")

181 182 183 184 185 186
    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
187 188 189 190 191 192 193 194
  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")

195 196 197 198 199 200
    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
201 202
  end

203 204 205 206 207 208
  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")

209 210 211 212 213 214
    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
215 216
  end

217 218 219 220 221 222
  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")

223 224 225 226 227 228
    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
229 230 231 232 233 234 235 236
  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")

237 238 239 240 241 242
    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
243 244
  end

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 272
  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

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 298
  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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

434 435 436 437 438 439 440
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    # 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

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

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

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

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

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

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

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

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

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

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

685
    assert_no_file 'config/spring.rb'
686 687 688 689 690
    assert_file "Gemfile" do |content|
      assert_no_match(/spring/, content)
    end
  end

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

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

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

    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

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

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

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

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

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

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

774 775 776 777 778
  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

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

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

    assert_equal 3, @sequence_step
800 801
  end

802
  protected
J
José Valim 已提交
803

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

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

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

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