app_generator_test.rb 22.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'
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
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 120 121
  def test_application_name_is_detected_if_it_exists_and_app_folder_renamed
    app_root       = File.join(destination_root, "myapp")
    app_moved_root = File.join(destination_root, "myapp_moved")

    run_generator [app_root]

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

    FileUtils.mv(app_root, app_moved_root)

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

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

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

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

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 202
  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

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

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 250
  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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

J
José Valim 已提交
458 459 460 461 462 463
  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
464
    Rails::Generators::AppGenerator.expects(:usage_path).returns(nil)
465
    assert_match(/Create rails files for app generator/, Rails::Generators::AppGenerator.desc)
J
José Valim 已提交
466 467 468
  end

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

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

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

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

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

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

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

    # 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

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

516 517 518 519
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
520
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
521 522 523 524 525 526 527 528
      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|
M
Mehmet Emin İNAÇ 已提交
529
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
530 531 532 533
      assert_no_match(/gem 'web-console', '~> 2.0'/, content)
    end
  end

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

  def test_spring_binstubs
540
    jruby_skip "spring doesn't run on JRuby"
541 542 543 544 545 546
    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
547
    jruby_skip "spring doesn't run on JRuby"
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
    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

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

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

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

    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

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

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

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

610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
  def test_create_keeps
    run_generator
    folders_with_keep = %w(
      app/assets/images
      app/mailers
      app/models
      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

636 637
  def test_psych_gem
    run_generator
638
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
639 640 641 642 643 644 645 646 647 648

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

649 650 651 652 653 654 655 656 657 658 659 660 661 662 663
  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

664
  protected
J
José Valim 已提交
665

666
  def action(*args, &block)
667
    capture(:stdout) { generator.send(*args, &block) }
668
  end
O
Oscar Del Ben 已提交
669 670

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