app_generator_test.rb 26.6 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
46
  tmp
47
  tmp/cache
J
José Valim 已提交
48
  tmp/cache/assets
49 50
)

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

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

58 59
  def default_files
    ::DEFAULT_APP_FILES
60 61
  end

62
  def test_assets
63
    run_generator
64

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

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

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

87
  def test_application_new_exits_with_non_zero_code_on_invalid_application_name
88
    quietly { system "rails new test --no-rc" }
89
    assert_equal false, $?.success?
90 91 92
  end

  def test_application_new_exits_with_message_and_non_zero_code_when_generating_inside_existing_rails_directory
93
    app_root = File.join(destination_root, "myfirstapp")
94 95 96 97 98 99 100
    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?
101 102
  end

103
  def test_application_new_show_help_message_inside_existing_rails_directory
104
    app_root = File.join(destination_root, "myfirstapp")
105 106 107 108
    run_generator [app_root]
    output = Dir.chdir(app_root) do
      `rails new --help`
    end
109
    assert_match(/rails new APP_PATH \[options\]/, output)
110 111 112
    assert_equal true, $?.success?
  end

113 114 115 116 117 118
  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]

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

123 124
        # make sure we are in correct dir
        FileUtils.cd(app_moved_root)
125

126
        generator = Rails::Generators::AppGenerator.new ["rails"], [],
127 128 129 130 131 132
                                                                   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
133
  end
134

135
  def test_rails_update_generates_correct_session_key
136
    app_root = File.join(destination_root, "myapp")
137
    run_generator [app_root]
138

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

146 147 148 149 150 151
  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

152 153 154
  def test_new_application_not_include_api_initializers
    run_generator

155
    assert_no_file "config/initializers/cors.rb"
156 157
  end

158
  def test_rails_update_keep_the_cookie_serializer_if_it_is_already_configured
159
    app_root = File.join(destination_root, "myapp")
160 161
    run_generator [app_root]

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

170
  def test_rails_update_set_the_cookie_serializer_to_marshal_if_it_is_not_already_configured
171
    app_root = File.join(destination_root, "myapp")
172 173 174 175
    run_generator [app_root]

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

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

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

199
  def test_rails_update_does_not_create_new_framework_defaults_by_default
200
    app_root = File.join(destination_root, "myapp")
201 202
    run_generator [app_root]

203
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults.rb")
204 205

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

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

218
  def test_rails_update_does_not_create_rack_cors
219
    app_root = File.join(destination_root, "myapp")
220 221 222
    run_generator [app_root]

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

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

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

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

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

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

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

279 280 281 282 283
  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

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

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

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

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

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

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

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

S
schneems 已提交
346 347 348 349 350 351 352 353
  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

354
  def test_generator_if_skip_active_record_is_given
355
    run_generator [destination_root, "--skip-active-record"]
356
    assert_no_directory "db/"
J
José Valim 已提交
357
    assert_no_file "config/database.yml"
358
    assert_no_file "app/models/application_record.rb"
359
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
360
    assert_file "test/test_helper.rb" do |helper_content|
361
      assert_no_match(/fixtures :all/, helper_content)
362
    end
363 364 365 366 367 368
    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
369 370 371 372

    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 已提交
373 374
  end

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

391 392 393
  def test_generator_has_assets_gems
    run_generator

394 395
    assert_gem "sass-rails"
    assert_gem "uglifier"
396 397
  end

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

422 423 424
  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["']/
425
    assert_no_file "config/cable.yml"
426
    assert_no_file "app/assets/javascripts/cable.js"
427
    assert_no_file "app/channels"
428 429 430 431 432 433 434
    assert_file "Gemfile" do |content|
      assert_no_match(/redis/, content)
    end
  end

  def test_action_cable_redis_gems
    run_generator
435
    assert_file "Gemfile", /^# gem 'redis'/
436 437
  end

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

447
  def test_rails_ujs_is_the_default_ujs_library
448 449
    run_generator
    assert_file "app/assets/javascripts/application.js" do |contents|
450
      assert_match %r{^//= require rails-ujs}, contents
451 452 453
    end
  end

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

462 463
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
464 465 466

    assert_no_file "app/assets/javascripts"

467
    assert_file "app/views/layouts/application.html.erb" do |contents|
468 469
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
470
    end
471

472
    assert_file "Gemfile" do |content|
473
      assert_no_match(/coffee-rails/, content)
474 475 476 477 478
      assert_no_match(/uglifier/, content)
    end

    assert_file "config/environments/production.rb" do |content|
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
479
    end
480
  end
481

S
Sean Griffin 已提交
482 483 484 485 486 487 488 489 490
  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

491 492
  def test_generator_for_yarn
    run_generator([destination_root])
493
    assert_file "vendor/package.json", /dependencies/
494
    assert_file "config/initializers/assets.rb", /node_modules/
495 496
  end

497 498 499 500 501 502 503 504 505
  def test_generator_for_yarn_skipped
    run_generator([destination_root])
    assert_no_file "vendor/package.json"

    assert_file "config/environments/production.rb" do |content|
      assert_no_match(/node_modules/, content)
    end
  end

A
Arun Agrawal 已提交
506 507
  def test_inclusion_of_jbuilder
    run_generator
508
    assert_gem "jbuilder"
A
Arun Agrawal 已提交
509 510
  end

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

522
  def test_inclusion_of_listen_related_configuration_by_default
523
    run_generator
524
    if RbConfig::CONFIG["host_os"] =~ /darwin|linux/
525
      assert_listen_related_configuration
526
    else
527
      assert_no_listen_related_configuration
528 529 530
    end
  end

531
  def test_non_inclusion_of_listen_related_configuration_if_skip_listen
532
    run_generator [destination_root, "--skip-listen"]
533 534 535
    assert_no_listen_related_configuration
  end

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

547
  def test_template_from_dir_pwd
548
    FileUtils.cd(Rails.root)
549
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
550 551
  end

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

  def test_default_usage
559 560 561
    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 已提交
562 563 564
  end

  def test_default_namespace
565
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
566 567
  end

568
  def test_file_is_added_for_backwards_compatibility
569 570
    action :file, "lib/test_file.rb", "heres test data"
    assert_file "lib/test_file.rb", "heres test data"
571 572
  end

573 574
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
575 576 577
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

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

585 586 587 588 589
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

590
  def test_application_name_with_spaces
591
    path = File.join(destination_root, "foo bar")
592 593

    # This also applies to MySQL apps but not with SQLite
594
    run_generator [path, "-d", "postgresql"]
595 596 597 598

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

599 600
  def test_web_console
    run_generator
601
    assert_gem "web-console"
602 603
  end

604 605 606 607
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

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

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

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

622 623 624 625 626 627
  def test_generation_runs_bundle_install
    assert_generates_with_bundler
  end

  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
end