app_generator_test.rb 21.7 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'
4
require 'mocha/setup' # FIXME: stop using mocha
J
José Valim 已提交
5

6 7
DEFAULT_APP_FILES = %w(
  .gitignore
8
  README.md
9 10 11
  Gemfile
  Rakefile
  config.ru
J
José Valim 已提交
12 13
  app/assets/javascripts
  app/assets/stylesheets
14
  app/assets/images
15
  app/controllers
F
Francesco Rodriguez 已提交
16
  app/controllers/concerns
17
  app/helpers
18
  app/mailers
19
  app/models
F
Francesco Rodriguez 已提交
20
  app/models/concerns
21
  app/jobs
22
  app/views/layouts
23 24 25
  bin/bundle
  bin/rails
  bin/rake
26
  bin/setup
27 28 29 30 31 32
  config/environments
  config/initializers
  config/locales
  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/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 119 120
  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]

    Rails.application.config.root = app_moved_root
    Rails.application.class.stubs(:name).returns("Myapp")
121
    Rails.application.stubs(:is_a?).returns(Rails::Application)
122 123 124

    FileUtils.mv(app_root, app_moved_root)

A
Arun Agrawal 已提交
125 126 127
    # make sure we are in correct dir
    FileUtils.cd(app_moved_root)

128 129
    generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true },
                                                               destination_root: app_moved_root, shell: @shell
130
    generator.send(:app_const)
131
    quietly { generator.send(:update_config_files) }
132
    assert_file "myapp_moved/config/environment.rb", /Rails\.application\.initialize!/
133
    assert_file "myapp_moved/config/initializers/session_store.rb", /_myapp_session/
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
    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

144
    generator = Rails::Generators::AppGenerator.new ["rails"], { with_dispatchers: true }, destination_root: app_root, shell: @shell
145
    generator.send(:app_const)
146
    quietly { generator.send(:update_config_files) }
147 148
    assert_file "myapp/config/initializers/session_store.rb", /_myapp_session/
  end
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
  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

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

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
  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")

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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

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

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
  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")

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
  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")

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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

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

    Rails.application.config.root = app_root
    Rails.application.class.stubs(:name).returns("Myapp")
    Rails.application.stubs(:is_a?).returns(Rails::Application)

    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

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

255 256 257 258 259
  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 已提交
260
        assert_no_match %r{/^[ \t]+$/}, line
261 262 263 264
      end
    end
  end

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

  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
278
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
279
      assert_gem "activerecord-jdbcmysql-adapter"
280 281
    else
      assert_gem "mysql2"
282
    end
J
José Valim 已提交
283 284
  end

285 286 287 288 289
  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

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

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

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

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

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

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

333 334 335 336 337 338 339 340 341 342 343 344 345 346
  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

347
  def test_generator_if_skip_active_record_is_given
348
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
349
    assert_no_file "config/database.yml"
350
    assert_no_file "config/initializers/active_record_belongs_to_required_by_default.rb"
351
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
352
    assert_file "test/test_helper.rb" do |helper_content|
353
      assert_no_match(/fixtures :all/, helper_content)
354
    end
J
José Valim 已提交
355 356
  end

357 358 359 360 361 362 363 364 365 366 367 368 369 370
  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

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
  def test_inclusion_of_javascript_runtime
393
    run_generator
394
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
395
      assert_gem "therubyrhino"
396
    else
397
      assert_file "Gemfile", /# gem 'therubyracer', platforms: :ruby/
398 399 400
    end
  end

401 402 403 404 405 406
  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 已提交
407
    assert_gem "jquery-rails"
408 409 410 411 412 413 414 415
  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 已提交
416
    assert_gem "prototype-rails"
J
José Valim 已提交
417
  end
418

419 420
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
421 422 423 424

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

425
    assert_file "app/views/layouts/application.html.erb" do |contents|
426 427
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
428
    end
429

430
    assert_file "Gemfile" do |content|
431
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
432
      assert_no_match(/jquery-rails/, content)
433
    end
434
  end
435

A
Arun Agrawal 已提交
436 437
  def test_inclusion_of_jbuilder
    run_generator
438
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
439 440
  end

441
  def test_inclusion_of_a_debugger
442
    run_generator
443
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
444
      assert_file "Gemfile" do |content|
445
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
446
      end
447
    else
448
      assert_gem 'byebug'
A
Arun Agrawal 已提交
449
    end
450 451
  end

452
  def test_template_from_dir_pwd
453
    FileUtils.cd(Rails.root)
454
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
455 456
  end

J
José Valim 已提交
457 458 459 460 461 462
  def test_usage_read_from_file
    File.expects(:read).returns("USAGE FROM FILE")
    assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
  end

  def test_default_usage
463
    Rails::Generators::AppGenerator.expects(:usage_path).returns(nil)
464
    assert_match(/Create rails files for app generator/, Rails::Generators::AppGenerator.desc)
J
José Valim 已提交
465 466 467
  end

  def test_default_namespace
468
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
469 470
  end

471 472 473 474 475
  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

476 477
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
478 479 480
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

481 482
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
483 484
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
485
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
486 487
  end

488
  def test_new_hash_style
489
    run_generator
490
    assert_file "config/initializers/session_store.rb" do |file|
491
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
492 493 494
    end
  end

495 496 497 498 499
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

500 501 502 503 504 505 506 507 508 509
  def test_application_name_with_spaces
    path = File.join(destination_root, "foo bar".shellescape)

    # 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

510 511 512 513 514
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
      assert_match(/gem 'web-console',\s+github: "rails\/web-console"/, content)
      assert_no_match(/gem 'web-console', '~> 2.0'/, content)
    end
  end

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

    assert_file "Gemfile" do |content|
      assert_match(/gem 'web-console',\s+github: "rails\/web-console"/, content)
      assert_no_match(/gem 'web-console', '~> 2.0'/, content)
    end
  end

533 534
  def test_spring
    run_generator
535
    assert_gem 'spring'
536 537 538
  end

  def test_spring_binstubs
539
    jruby_skip "spring doesn't run on JRuby"
540 541 542 543 544 545
    generator.stubs(:bundle_command).with('install')
    generator.expects(:bundle_command).with('exec spring binstub --all').once
    quietly { generator.invoke_all }
  end

  def test_spring_no_fork
546
    jruby_skip "spring doesn't run on JRuby"
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
    Process.stubs(:respond_to?).with(:fork).returns(false)
    run_generator

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

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

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

563 564 565 566 567 568 569 570
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

571 572
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
573 574 575 576 577 578 579 580 581 582 583 584

    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

585 586 587 588 589 590 591 592 593 594 595 596
  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|
597
      assert_no_match(/sqlite/i, content)
598 599 600 601 602 603 604
    end
  end

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

    assert_file '.gitignore' do |content|
605
      assert_no_match(/sqlite/i, content)
606 607 608
    end
  end

609 610
  def test_psych_gem
    run_generator
611
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
612 613 614 615 616 617 618 619 620 621

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

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
  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

    generator([destination_root], template: path).expects(:open).with(path, 'Accept' => 'application/x-thor-template').returns(template)

    bundler_first = sequence('bundle, binstubs, after_bundle')
    generator.expects(:bundle_command).with('install').once.in_sequence(bundler_first)
    generator.expects(:bundle_command).with('exec spring binstub --all').in_sequence(bundler_first)
    generator.expects(:run).with('echo ran after_bundle').in_sequence(bundler_first)

    quietly { generator.invoke_all }
  end

637
  protected
J
José Valim 已提交
638

639
  def action(*args, &block)
640
    capture(:stdout) { generator.send(*args, &block) }
641
  end
O
Oscar Del Ben 已提交
642 643

  def assert_gem(gem)
644
    assert_file "Gemfile", /^\s*gem\s+["']#{gem}["']$*/
O
Oscar Del Ben 已提交
645
  end
646
end