app_generator_test.rb 27.1 KB
Newer Older
1 2 3
require "generators/generators_test_helper"
require "rails/generators/rails/app/app_generator"
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
91
    quietly { system "rails new test --no-rc" }
92
    assert_equal false, $?.success?
93 94 95
  end

  def test_application_new_exits_with_message_and_non_zero_code_when_generating_inside_existing_rails_directory
96
    app_root = File.join(destination_root, "myfirstapp")
97 98 99 100 101 102 103
    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
  def test_application_new_show_help_message_inside_existing_rails_directory
107
    app_root = File.join(destination_root, "myfirstapp")
108 109 110 111
    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
                                                                   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!/
      end
    end
136
  end
137

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

142
    stub_rails_application(app_root) do
143
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
144 145 146
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
    end
147
  end
148

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

155 156 157
  def test_new_application_not_include_api_initializers
    run_generator

158
    assert_no_file "config/initializers/cors.rb"
159 160
  end

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

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

173
  def test_rails_update_set_the_cookie_serializer_to_marshal_if_it_is_not_already_configured
174
    app_root = File.join(destination_root, "myapp")
175 176 177 178
    run_generator [app_root]

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

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

188
  def test_rails_update_dont_set_file_watcher
189
    app_root = File.join(destination_root, "myapp")
190 191 192 193 194 195 196 197 198 199 200 201
    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

202
  def test_rails_update_does_not_create_new_framework_defaults_by_default
203
    app_root = File.join(destination_root, "myapp")
204 205
    run_generator [app_root]

206
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults.rb")
207 208

    stub_rails_application(app_root) do
209 210 211
      generator = Rails::Generators::AppGenerator.new ["rails"], { update: true }, destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
212

213 214 215 216 217
      assert_file "#{app_root}/config/initializers/new_framework_defaults.rb" do |content|
        assert_match(/ActiveSupport\.halt_callback_chains_on_return_false = true/, content)
        assert_match(/Rails\.application\.config.active_record\.belongs_to_required_by_default = false/, content)
        assert_no_match(/Rails\.application\.config\.ssl_options/, content)
      end
218 219 220
    end
  end

221
  def test_rails_update_does_not_create_rack_cors
222
    app_root = File.join(destination_root, "myapp")
223 224 225
    run_generator [app_root]

    stub_rails_application(app_root) do
226
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
227 228 229 230 231 232 233
      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
234
    app_root = File.join(destination_root, "myapp")
235 236 237 238 239
    run_generator [app_root]

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

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

247 248
  def test_application_names_are_not_singularized
    run_generator [File.join(destination_root, "hats")]
249
    assert_file "hats/config/environment.rb", /Rails\.application\.initialize!/
250 251
  end

252 253 254
  def test_gemfile_has_no_whitespace_errors
    run_generator
    absolute = File.expand_path("Gemfile", destination_root)
255
    File.open(absolute, "r") do |f|
256
      f.each_line do |line|
A
Arun Agrawal 已提交
257
        assert_no_match %r{/^[ \t]+$/}, line
258 259 260 261
      end
    end
  end

J
José Valim 已提交
262 263 264
  def test_config_database_is_added_by_default
    run_generator
    assert_file "config/database.yml", /sqlite3/
265
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
266
      assert_gem "activerecord-jdbcsqlite3-adapter"
267 268
    else
      assert_gem "sqlite3"
269
    end
270 271 272 273 274
  end

  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
275
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
276
      assert_gem "activerecord-jdbcmysql-adapter"
277
    else
278
      assert_gem "mysql2", "'>= 0.3.18', '< 0.5'"
279
    end
J
José Valim 已提交
280 281
  end

282 283 284 285 286
  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

287 288 289
  def test_config_postgresql_database
    run_generator([destination_root, "-d", "postgresql"])
    assert_file "config/database.yml", /postgresql/
290
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
291
      assert_gem "activerecord-jdbcpostgresql-adapter"
292
    else
293
      assert_gem "pg", "'~> 0.18'"
294 295 296
    end
  end

297 298
  def test_config_jdbcmysql_database
    run_generator([destination_root, "-d", "jdbcmysql"])
299
    assert_file "config/database.yml", /mysql/
O
Oscar Del Ben 已提交
300
    assert_gem "activerecord-jdbcmysql-adapter"
301 302
  end

303 304
  def test_config_jdbcsqlite3_database
    run_generator([destination_root, "-d", "jdbcsqlite3"])
305
    assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
306
    assert_gem "activerecord-jdbcsqlite3-adapter"
307 308
  end

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

A
Arun Agrawal 已提交
315 316 317
  def test_config_jdbc_database
    run_generator([destination_root, "-d", "jdbc"])
    assert_file "config/database.yml", /jdbc/
318
    assert_file "config/database.yml", /mssql/
O
Oscar Del Ben 已提交
319
    assert_gem "activerecord-jdbc-adapter"
A
Arun Agrawal 已提交
320 321
  end

322 323
  if defined?(JRUBY_VERSION)
    def test_config_jdbc_database_when_no_option_given
324
      run_generator
325
      assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
326
      assert_gem "activerecord-jdbcsqlite3-adapter"
327 328 329
    end
  end

330 331 332 333 334 335 336 337 338 339 340 341 342 343
  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 已提交
344 345 346 347 348
  def test_generator_defaults_to_puma_version
    run_generator [destination_root]
    assert_gem "puma", "'~> 3.0'"
  end

S
schneems 已提交
349 350 351 352 353 354 355 356
  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

357
  def test_generator_if_skip_active_record_is_given
358
    run_generator [destination_root, "--skip-active-record"]
359
    assert_no_directory "db/"
J
José Valim 已提交
360
    assert_no_file "config/database.yml"
361
    assert_no_file "app/models/application_record.rb"
362
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
363
    assert_file "test/test_helper.rb" do |helper_content|
364
      assert_no_match(/fixtures :all/, helper_content)
365
    end
366 367 368 369 370 371
    assert_file "bin/setup" do |setup_content|
      assert_no_match(/db:setup/, setup_content)
    end
    assert_file "bin/update" do |update_content|
      assert_no_match(/db:migrate/, update_content)
    end
372 373 374 375

    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 已提交
376 377
  end

378 379 380 381 382 383 384 385 386 387 388 389
  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
390
    assert_no_directory "app/mailers"
391
    assert_no_directory "test/mailers"
392 393
  end

394 395 396
  def test_generator_has_assets_gems
    run_generator

397 398
    assert_gem "sass-rails"
    assert_gem "uglifier"
399 400
  end

401
  def test_generator_if_skip_sprockets_is_given
402
    run_generator [destination_root, "--skip-sprockets"]
403
    assert_no_file "config/initializers/assets.rb"
404
    assert_file "config/application.rb" do |content|
405
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
406
    end
407 408 409
    assert_file "Gemfile" do |content|
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
410
      assert_no_match(/coffee-rails/, content)
411
    end
412 413 414 415 416
    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 已提交
417 418
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
419
    end
420 421 422
    assert_file "config/initializers/new_framework_defaults.rb" do |content|
      assert_no_match(/unknown_asset_fallback/, content)
    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
  def test_rails_ujs_is_the_default_ujs_library
451 452
    run_generator
    assert_file "app/assets/javascripts/application.js" do |contents|
453
      assert_match %r{^//= require rails-ujs}, contents
454
    end
455
    assert_gem "rails-ujs"
456 457
  end

458 459
  def test_inclusion_of_javascript_libraries_if_required
    run_generator [destination_root, "-j", "jquery"]
460
    assert_file "app/assets/javascripts/application.js" do |contents|
461
      assert_match %r{^//= require jquery}, contents
462
    end
463
    assert_gem "jquery-rails"
J
José Valim 已提交
464
  end
465

466 467
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
468 469 470 471

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

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

477
    assert_file "Gemfile" do |content|
478
      assert_no_match(/coffee-rails/, content)
479
      assert_no_match(/uglifier/, content)
480
      assert_no_match(/rails-ujs/, content)
481 482 483 484
    end

    assert_file "config/environments/production.rb" do |content|
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
485
    end
486
  end
487

S
Sean Griffin 已提交
488 489 490 491 492 493 494 495 496
  def test_coffeescript_is_skipped_if_required
    run_generator [destination_root, "--skip-coffee"]

    assert_file "Gemfile" do |content|
      assert_no_match(/coffee-rails/, content)
      assert_match(/uglifier/, content)
    end
  end

497 498 499 500 501
  def test_generator_if_yarn_option_is_given
    run_generator([destination_root, "--yarn"])
    assert_file "package.json", /dependencies/
  end

A
Arun Agrawal 已提交
502 503
  def test_inclusion_of_jbuilder
    run_generator
504
    assert_gem "jbuilder"
A
Arun Agrawal 已提交
505 506
  end

507
  def test_inclusion_of_a_debugger
508
    run_generator
509
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
510
      assert_file "Gemfile" do |content|
511
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
512
      end
513
    else
514
      assert_gem "byebug"
A
Arun Agrawal 已提交
515
    end
516 517
  end

518
  def test_inclusion_of_listen_related_configuration_by_default
519
    run_generator
520
    if RbConfig::CONFIG["host_os"] =~ /darwin|linux/
521
      assert_listen_related_configuration
522
    else
523
      assert_no_listen_related_configuration
524 525 526
    end
  end

527
  def test_non_inclusion_of_listen_related_configuration_if_skip_listen
528
    run_generator [destination_root, "--skip-listen"]
529 530 531
    assert_no_listen_related_configuration
  end

532 533
  def test_evented_file_update_checker_config
    run_generator
534 535
    assert_file "config/environments/development.rb" do |content|
      if RbConfig::CONFIG["host_os"] =~ /darwin|linux/
536 537 538 539 540 541 542
        assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      else
        assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      end
    end
  end

543
  def test_template_from_dir_pwd
544
    FileUtils.cd(Rails.root)
545
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
546 547
  end

J
José Valim 已提交
548
  def test_usage_read_from_file
549 550 551
    assert_called(File, :read, returns: "USAGE FROM FILE") do
      assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
    end
J
José Valim 已提交
552 553 554
  end

  def test_default_usage
555 556 557
    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 已提交
558 559 560
  end

  def test_default_namespace
561
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
562 563
  end

564
  def test_file_is_added_for_backwards_compatibility
565 566
    action :file, "lib/test_file.rb", "heres test data"
    assert_file "lib/test_file.rb", "heres test data"
567 568
  end

569 570
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
571 572 573
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

574 575
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
576 577
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
578
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
579 580
  end

581 582 583 584 585
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

586
  def test_application_name_with_spaces
587
    path = File.join(destination_root, "foo bar")
588 589

    # This also applies to MySQL apps but not with SQLite
590
    run_generator [path, "-d", "postgresql"]
591 592 593 594

    assert_file "foo bar/config/database.yml", /database: foo_bar_development/
  end

595 596
  def test_web_console
    run_generator
597
    assert_gem "web-console"
598 599
  end

600 601 602 603
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

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

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

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
613
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
614
      assert_no_match(/\Agem 'web-console', '>= 3.3.0'\z/, content)
615 616 617
    end
  end

618 619 620 621
  def test_generation_runs_bundle_install
    assert_generates_with_bundler
  end

622 623 624 625
  def test_generation_runs_yarn_install_with_yarn_option
    assert_generates_with_yarn yarn: true
  end

626 627
  def test_dev_option
    assert_generates_with_bundler dev: true
628 629
    rails_path = File.expand_path("../../..", Rails.root)
    assert_file "Gemfile", /^gem\s+["']rails["'],\s+path:\s+["']#{Regexp.escape(rails_path)}["']$/
630 631 632 633
  end

  def test_edge_option
    assert_generates_with_bundler edge: true
634
    assert_file "Gemfile", %r{^gem\s+["']rails["'],\s+github:\s+["']#{Regexp.escape("rails/rails")}["']$}
635 636
  end

637 638
  def test_spring
    run_generator
639
    assert_gem "spring"
640 641 642
  end

  def test_spring_binstubs
643
    jruby_skip "spring doesn't run on JRuby"
644 645 646 647
    command_check = -> command do
      @binstub_called ||= 0

      case command
648
      when "install"
649
        # Called when running bundle, we just want to stub it so nothing to do here.
650
      when "exec spring binstub --all"
651 652 653 654 655 656 657 658
        @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
659 660 661
  end

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

666 667 668
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
669 670 671 672 673 674
    end
  end

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

675
    assert_no_file "config/spring.rb"
676 677 678 679 680
    assert_file "Gemfile" do |content|
      assert_no_match(/spring/, content)
    end
  end

681 682 683 684 685 686 687 688
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

689 690
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
691 692 693 694 695 696 697 698 699 700 701 702

    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

703 704 705
  def test_gitignore_when_sqlite3
    run_generator

706
    assert_file ".gitignore" do |content|
707 708 709 710 711
      assert_match(/sqlite3/, content)
    end
  end

  def test_gitignore_when_no_active_record
712
    run_generator [destination_root, "--skip-active-record"]
713

714
    assert_file ".gitignore" do |content|
715
      assert_no_match(/sqlite/i, content)
716 717 718 719 720 721
    end
  end

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

722
    assert_file ".gitignore" do |content|
723
      assert_no_match(/sqlite/i, content)
724 725 726
    end
  end

727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
  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

751 752
  def test_psych_gem
    run_generator
753
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
754 755 756 757 758 759 760 761 762 763

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

764
  def test_after_bundle_callback
765
    path = "http://example.org/rails_template"
766 767 768
    template = %{ after_bundle { run 'echo ran after_bundle' } }
    template.instance_eval "def read; self; end" # Make the string respond to read

769
    check_open = -> *args do
770
      assert_equal [ path, "Accept" => "application/x-thor-template" ], args
771 772
      template
    end
773

774
    sequence = ["install", "exec spring binstub --all", "echo ran after_bundle"]
775
    @sequence_step ||= 0
776
    ensure_bundler_first = -> command do
777 778 779 780 781 782 783 784 785 786 787
      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
788 789

    assert_equal 3, @sequence_step
790 791
  end

792
  protected
J
José Valim 已提交
793

794 795 796 797 798
    def stub_rails_application(root)
      Rails.application.config.root = root
      Rails.application.class.stub(:name, "Myapp") do
        yield
      end
799 800
    end

801 802 803
    def action(*args, &block)
      capture(:stdout) { generator.send(*args, &block) }
    end
O
Oscar Del Ben 已提交
804

805 806 807 808 809 810
    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
811
    end
812

813
    def assert_listen_related_configuration
814 815
      assert_gem "listen"
      assert_gem "spring-watcher-listen"
816

817
      assert_file "config/environments/development.rb" do |content|
818 819
        assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      end
820 821
    end

822
    def assert_no_listen_related_configuration
823
      assert_file "Gemfile" do |content|
824 825 826
        assert_no_match(/listen/, content)
      end

827
      assert_file "config/environments/development.rb" do |content|
828 829
        assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      end
830 831
    end

832 833 834 835 836 837 838
    def assert_generates_with_bundler(options = {})
      generator([destination_root], options)

      command_check = -> command do
        @install_called ||= 0

        case command
839
        when "install"
840 841
          @install_called += 1
          assert_equal 1, @install_called, "install expected to be called once, but was called #{@install_called} times"
842
        when "exec spring binstub --all"
843 844 845 846 847 848 849
          # Called when running tests with spring, let through unscathed.
        end
      end

      generator.stub :bundle_command, command_check do
        quietly { generator.invoke_all }
      end
850
    end
851 852 853 854 855 856 857 858 859 860 861 862 863 864

    def assert_generates_with_yarn(options = {})
      generator([destination_root], options)

      command_check = -> command do
        @install_called ||= 0
        @install_called += 1
        assert_equal 1, @install_called, "install expected to be called once, but was called #{@install_called} times"
      end

      generator.stub :yarn_command, command_check do
        quietly { generator.invoke_all }
      end
    end
865
end