app_generator_test.rb 23.2 KB
Newer Older
J
José Valim 已提交
1
require 'generators/generators_test_helper'
2
require 'rails/generators/rails/app/app_generator'
3
require 'generators/shared_generator_tests'
J
José Valim 已提交
4

5 6
DEFAULT_APP_FILES = %w(
  .gitignore
7
  README.md
8 9 10
  Gemfile
  Rakefile
  config.ru
J
José Valim 已提交
11 12
  app/assets/javascripts
  app/assets/stylesheets
13
  app/assets/images
14
  app/controllers
F
Francesco Rodriguez 已提交
15
  app/controllers/concerns
16
  app/helpers
17
  app/mailers
18
  app/models
F
Francesco Rodriguez 已提交
19
  app/models/concerns
20
  app/jobs
21
  app/views/layouts
22 23 24
  bin/bundle
  bin/rails
  bin/rake
25
  bin/setup
26 27 28 29 30 31
  config/environments
  config/initializers
  config/locales
  db
  lib
  lib/tasks
32
  lib/assets
33
  log
A
Arun Agrawal 已提交
34
  test/test_helper.rb
35
  test/fixtures
36
  test/fixtures/files
M
Mike Moore 已提交
37 38 39 40
  test/controllers
  test/models
  test/helpers
  test/mailers
41 42
  test/integration
  vendor
J
José Valim 已提交
43
  vendor/assets
A
Arun Agrawal 已提交
44 45
  vendor/assets/stylesheets
  vendor/assets/javascripts
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

65 66
    assert_file("app/views/layouts/application.html.erb", /stylesheet_link_tag\s+'application', media: 'all', 'data-turbolinks-track' => true/)
    assert_file("app/views/layouts/application.html.erb", /javascript_include_tag\s+'application', 'data-turbolinks-track' => true/)
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
A
Akira Matsuda 已提交
88
    quietly { system 'rails new test --no-rc' }
89
    assert_equal false, $?.success?
90 91 92 93 94 95 96 97 98 99 100
  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?
101 102
  end

103 104 105 106 107 108
  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
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 127 128 129 130 131 132 133
        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
134
  end
135

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

140 141 142 143 144 145
    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
146
  end
147

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

154 155 156 157 158 159
  def test_new_application_not_include_api_initializers
    run_generator

    assert_no_file 'config/initializers/cors.rb'
  end

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

164 165 166 167 168 169
    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
170 171
  end

172 173 174 175 176 177
  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")

178 179 180 181 182 183
    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
184 185 186 187 188 189 190 191
  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")

192 193 194 195 196 197
    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
198 199
  end

200 201 202 203 204 205
  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")

206 207 208 209 210 211
    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
212 213
  end

214 215 216 217 218 219
  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")

220 221 222 223 224 225
    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
226 227 228 229 230 231 232 233
  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")

234 235 236 237 238 239
    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
240 241
  end

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

247 248 249 250 251
  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 已提交
252
        assert_no_match %r{/^[ \t]+$/}, line
253 254 255 256
      end
    end
  end

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

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

277 278 279 280 281
  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

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

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

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

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

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

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

325 326 327 328 329 330 331 332 333 334 335 336 337 338
  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

339
  def test_generator_if_skip_active_record_is_given
340
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
341
    assert_no_file "config/database.yml"
342
    assert_no_file "config/initializers/active_record_belongs_to_required_by_default.rb"
343
    assert_no_file "app/models/application_record.rb"
344
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
345
    assert_file "test/test_helper.rb" do |helper_content|
346
      assert_no_match(/fixtures :all/, helper_content)
347
    end
J
José Valim 已提交
348 349
  end

350 351 352 353 354 355 356 357 358 359 360 361 362 363
  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

364 365 366 367 368 369 370
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

371
  def test_generator_if_skip_sprockets_is_given
372
    run_generator [destination_root, "--skip-sprockets"]
373
    assert_no_file "config/initializers/assets.rb"
374
    assert_file "config/application.rb" do |content|
375
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
376
    end
377 378 379
    assert_file "Gemfile" do |content|
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
380
      assert_match(/coffee-rails/, content)
381
    end
382 383 384 385 386
    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 已提交
387 388
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
389
    end
390
  end
J
José Valim 已提交
391

392 393 394
  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["']/
395
    assert_no_file "config/cable.yml"
396 397
    assert_no_file "app/assets/javascripts/cable.coffee"
    assert_no_file "app/channels"
398 399 400 401 402 403 404 405 406 407
    assert_file "Gemfile" do |content|
      assert_no_match(/em-hiredis/, content)
      assert_no_match(/redis/, content)
    end
  end

  def test_action_cable_redis_gems
    run_generator
    assert_gem 'em-hiredis'
    assert_gem 'redis'
408 409
  end

410
  def test_inclusion_of_javascript_runtime
411
    run_generator
412
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
413
      assert_gem "therubyrhino"
414
    else
415
      assert_file "Gemfile", /# gem 'therubyracer', platforms: :ruby/
416 417 418
    end
  end

419 420 421 422 423 424
  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 已提交
425
    assert_gem "jquery-rails"
426 427 428 429 430 431 432 433
  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 已提交
434
    assert_gem "prototype-rails"
J
José Valim 已提交
435
  end
436

437 438
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
439 440 441 442

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

443
    assert_file "app/views/layouts/application.html.erb" do |contents|
444 445
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
446
    end
447

448
    assert_file "Gemfile" do |content|
449
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
450
      assert_no_match(/jquery-rails/, content)
451
    end
452
  end
453

A
Arun Agrawal 已提交
454 455
  def test_inclusion_of_jbuilder
    run_generator
456
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
457 458
  end

459
  def test_inclusion_of_a_debugger
460
    run_generator
461
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
462
      assert_file "Gemfile" do |content|
463
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
464
      end
465
    else
466
      assert_gem 'byebug'
A
Arun Agrawal 已提交
467
    end
468 469
  end

470
  def test_template_from_dir_pwd
471
    FileUtils.cd(Rails.root)
472
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
473 474
  end

J
José Valim 已提交
475
  def test_usage_read_from_file
476 477 478
    assert_called(File, :read, returns: "USAGE FROM FILE") do
      assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
    end
J
José Valim 已提交
479 480 481
  end

  def test_default_usage
482 483 484
    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 已提交
485 486 487
  end

  def test_default_namespace
488
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
489 490
  end

491 492 493 494 495
  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

496 497
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
498 499 500
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

501 502
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
503 504
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
505
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
506 507
  end

508
  def test_new_hash_style
509
    run_generator
510
    assert_file "config/initializers/session_store.rb" do |file|
511
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
512 513 514
    end
  end

515 516 517 518 519
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

520
  def test_application_name_with_spaces
521
    path = File.join(destination_root, "foo bar")
522 523 524 525 526 527 528 529

    # 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

530 531 532 533 534
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

535 536 537 538
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
539
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
540
      assert_no_match(/gem 'web-console', '~> 3.0'/, content)
541 542 543 544 545 546 547
    end
  end

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

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
548
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
549
      assert_no_match(/gem 'web-console', '~> 3.0'/, content)
550 551 552
    end
  end

553 554
  def test_spring
    run_generator
555
    assert_gem 'spring'
556 557 558
  end

  def test_spring_binstubs
559
    jruby_skip "spring doesn't run on JRuby"
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
    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
575 576 577
  end

  def test_spring_no_fork
578
    jruby_skip "spring doesn't run on JRuby"
579 580
    assert_called_with(Process, :respond_to?, [:fork], returns: false) do
      run_generator
581

582 583 584
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
585 586 587 588 589 590 591 592 593 594 595
    end
  end

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

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

596 597 598 599 600 601 602 603
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

604 605
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
606 607 608 609 610 611 612 613 614 615 616 617

    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

618 619 620 621 622 623 624 625 626 627 628 629
  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|
630
      assert_no_match(/sqlite/i, content)
631 632 633 634 635 636 637
    end
  end

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

    assert_file '.gitignore' do |content|
638
      assert_no_match(/sqlite/i, content)
639 640 641
    end
  end

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
  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

666 667
  def test_psych_gem
    run_generator
668
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
669 670 671 672 673 674 675 676 677 678

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

679 680 681 682 683
  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

684 685 686 687
    check_open = -> *args do
      assert_equal [ path, 'Accept' => 'application/x-thor-template' ], args
      template
    end
688

689 690 691
    sequence = ['install', 'exec spring binstub --all', 'echo ran after_bundle']
    ensure_bundler_first = -> command do
      @sequence_step ||= 0
692

693 694 695 696 697 698 699 700 701 702 703
      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
704 705
  end

706
  protected
J
José Valim 已提交
707

708 709 710 711 712 713 714
  def stub_rails_application(root)
    Rails.application.config.root = root
    Rails.application.class.stub(:name, "Myapp") do
      yield
    end
  end

715
  def action(*args, &block)
716
    capture(:stdout) { generator.send(*args, &block) }
717
  end
O
Oscar Del Ben 已提交
718

719 720 721 722 723 724
  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 已提交
725
  end
726
end