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

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

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

59 60
  def default_files
    ::DEFAULT_APP_FILES
61 62
  end

63
  def test_assets
64
    run_generator
65

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

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

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

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

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

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

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

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

127 128 129 130 131 132 133 134
        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
135
  end
136

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

141 142 143 144 145 146
    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
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 158 159 160
  def test_new_application_not_include_api_initializers
    run_generator

    assert_no_file 'config/initializers/cors.rb'
  end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

365 366 367 368 369 370 371
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

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

393 394 395
  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["']/
396
    assert_no_file "config/cable.yml"
397 398
    assert_no_file "app/assets/javascripts/cable.coffee"
    assert_no_file "app/channels"
399 400 401
    assert_file "app/views/layouts/application.html.erb" do |content|
      assert_no_match(/action_cable_meta_tag/, content)
    end
402 403 404 405 406 407 408 409 410 411
    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'
412 413
  end

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

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

441 442
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
443 444 445 446

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

447
    assert_file "app/views/layouts/application.html.erb" do |contents|
448 449
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
450
    end
451

452
    assert_file "Gemfile" do |content|
453
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
454
      assert_no_match(/jquery-rails/, content)
455
    end
456
  end
457

A
Arun Agrawal 已提交
458 459
  def test_inclusion_of_jbuilder
    run_generator
460
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
461 462
  end

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

474
  def test_template_from_dir_pwd
475
    FileUtils.cd(Rails.root)
476
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
477 478
  end

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

  def test_default_usage
486 487 488
    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 已提交
489 490 491
  end

  def test_default_namespace
492
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
493 494
  end

495 496 497 498 499
  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

500 501
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
502 503 504
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

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

512
  def test_new_hash_style
513
    run_generator
514
    assert_file "config/initializers/session_store.rb" do |file|
515
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
516 517 518
    end
  end

519 520 521 522 523
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

524
  def test_application_name_with_spaces
525
    path = File.join(destination_root, "foo bar")
526 527 528 529 530 531 532 533

    # 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

534 535 536 537 538
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

539 540 541 542
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

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

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

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

557 558
  def test_spring
    run_generator
559
    assert_gem 'spring'
560 561 562
  end

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

  def test_spring_no_fork
582
    jruby_skip "spring doesn't run on JRuby"
583 584
    assert_called_with(Process, :respond_to?, [:fork], returns: false) do
      run_generator
585

586 587 588
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
589 590 591 592 593 594 595 596 597 598 599
    end
  end

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

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

600 601 602 603 604 605 606 607
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

608 609
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
610 611 612 613 614 615 616 617 618 619 620 621

    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

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

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

    assert_file '.gitignore' do |content|
642
      assert_no_match(/sqlite/i, content)
643 644 645
    end
  end

646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
  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

670 671
  def test_psych_gem
    run_generator
672
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
673 674 675 676 677 678 679 680 681 682

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

683 684 685 686 687
  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

688 689 690 691
    check_open = -> *args do
      assert_equal [ path, 'Accept' => 'application/x-thor-template' ], args
      template
    end
692

693 694 695
    sequence = ['install', 'exec spring binstub --all', 'echo ran after_bundle']
    ensure_bundler_first = -> command do
      @sequence_step ||= 0
696

697 698 699 700 701 702 703 704 705 706 707
      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
708 709
  end

710
  protected
J
José Valim 已提交
711

712 713 714 715 716 717 718
  def stub_rails_application(root)
    Rails.application.config.root = root
    Rails.application.class.stub(:name, "Myapp") do
      yield
    end
  end

719
  def action(*args, &block)
720
    capture(:stdout) { generator.send(*args, &block) }
721
  end
O
Oscar Del Ben 已提交
722

723 724 725 726 727 728
  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 已提交
729
  end
730
end