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

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

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

61 62
  def default_files
    ::DEFAULT_APP_FILES
63 64
  end

65
  def test_assets
66
    run_generator
67

J
Jeroen Visser 已提交
68 69
    assert_file("app/views/layouts/application.html.erb", /stylesheet_link_tag\s+'application', media: 'all', 'data-turbolinks-track': 'reload'/)
    assert_file("app/views/layouts/application.html.erb", /javascript_include_tag\s+'application', 'data-turbolinks-track': 'reload'/)
70
    assert_file("app/assets/stylesheets/application.css")
A
Arun Agrawal 已提交
71
    assert_file("app/assets/javascripts/application.js")
72 73
  end

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

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

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

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

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]

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

126 127
        # make sure we are in correct dir
        FileUtils.cd(app_moved_root)
128

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

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

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

151 152 153 154 155 156
  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

157 158 159 160 161 162
  def test_new_application_not_include_api_initializers
    run_generator

    assert_no_file 'config/initializers/cors.rb'
  end

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

167
    stub_rails_application(app_root) do
168
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
169 170 171 172
      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
173 174
  end

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]

179
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults/callback_terminator.rb")
180

181
    stub_rails_application(app_root) do
182
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
183 184
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
185
      assert_no_file "#{app_root}/config/initializers/new_framework_defaults/callback_terminator.rb"
186
    end
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]

193
    FileUtils.touch("#{app_root}/config/initializers/new_framework_defaults/callback_terminator.rb")
194

195
    stub_rails_application(app_root) do
196
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
197 198
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
199
      assert_file "#{app_root}/config/initializers/new_framework_defaults/callback_terminator.rb"
200
    end
201 202
  end

203
  def test_rails_update_set_the_cookie_serializer_to_marshal_if_it_is_not_already_configured
204 205 206 207 208
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

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

209
    stub_rails_application(app_root) do
210
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
211 212
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
213 214
      assert_file("#{app_root}/config/initializers/cookies_serializer.rb",
                  /Valid options are :json, :marshal, and :hybrid\.\nRails\.application\.config\.action_dispatch\.cookies_serializer = :marshal/)
215
    end
216 217
  end

218 219 220 221 222 223 224 225 226 227 228 229 230 231
  def test_rails_update_dont_set_file_watcher
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/environments/development.rb" do |content|
        assert_match(/# config.file_watcher/, content)
      end
    end
  end

232 233 234 235
  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]

236
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults/active_record_belongs_to_required_by_default.rb")
237

238
    stub_rails_application(app_root) do
239
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
240 241
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
242
      assert_no_file "#{app_root}/config/initializers/new_framework_defaults/active_record_belongs_to_required_by_default.rb"
243
    end
244 245 246 247 248 249
  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]

250
    FileUtils.touch("#{app_root}/config/initializers/new_framework_defaults/active_record_belongs_to_required_by_default.rb")
251

252
    stub_rails_application(app_root) do
253
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
254 255
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
256
      assert_file "#{app_root}/config/initializers/new_framework_defaults/active_record_belongs_to_required_by_default.rb"
257
    end
258 259
  end

260 261 262 263
  def test_rails_update_does_not_create_to_time_preserves_timezone
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

264
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults/to_time_preserves_timezone.rb")
265 266 267 268 269

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
270
      assert_no_file "#{app_root}/config/initializers/new_framework_defaults/to_time_preserves_timezone.rb"
271 272 273 274 275 276 277
    end
  end

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

278
    FileUtils.touch("#{app_root}/config/initializers/new_framework_defaults/to_time_preserves_timezone.rb")
279 280 281 282 283

    stub_rails_application(app_root) do
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
284
      assert_file "#{app_root}/config/initializers/new_framework_defaults/to_time_preserves_timezone.rb"
285 286 287
    end
  end

288 289 290 291
  def test_rails_update_does_not_create_ssl_options_by_default
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

292
    FileUtils.rm("#{app_root}/config/initializers/new_framework_defaults/ssl_options.rb")
293 294

    stub_rails_application(app_root) do
295
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
296 297
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
298
      assert_no_file "#{app_root}/config/initializers/new_framework_defaults/ssl_options.rb"
299 300 301 302 303 304 305
    end
  end

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

306
    FileUtils.touch("#{app_root}/config/initializers/new_framework_defaults/ssl_options.rb")
307 308

    stub_rails_application(app_root) do
309
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
310 311
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
312
      assert_file "#{app_root}/config/initializers/new_framework_defaults/ssl_options.rb"
313 314 315
    end
  end

316 317 318 319 320
  def test_rails_update_does_not_create_rack_cors
    app_root = File.join(destination_root, 'myapp')
    run_generator [app_root]

    stub_rails_application(app_root) do
321
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
322 323 324 325 326 327 328 329 330 331 332 333 334
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_no_file "#{app_root}/config/initializers/cors.rb"
    end
  end

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

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

    stub_rails_application(app_root) do
335
      generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
336 337 338 339 340 341
      generator.send(:app_const)
      quietly { generator.send(:update_config_files) }
      assert_file "#{app_root}/config/initializers/cors.rb"
    end
  end

342 343
  def test_application_names_are_not_singularized
    run_generator [File.join(destination_root, "hats")]
344
    assert_file "hats/config/environment.rb", /Rails\.application\.initialize!/
345 346
  end

347 348 349 350 351
  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 已提交
352
        assert_no_match %r{/^[ \t]+$/}, line
353 354 355 356
      end
    end
  end

J
José Valim 已提交
357 358 359
  def test_config_database_is_added_by_default
    run_generator
    assert_file "config/database.yml", /sqlite3/
360
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
361
      assert_gem "activerecord-jdbcsqlite3-adapter"
362 363
    else
      assert_gem "sqlite3"
364
    end
365 366 367 368 369
  end

  def test_config_another_database
    run_generator([destination_root, "-d", "mysql"])
    assert_file "config/database.yml", /mysql/
370
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
371
      assert_gem "activerecord-jdbcmysql-adapter"
372
    else
373
      assert_gem "mysql2", "'>= 0.3.18', '< 0.5'"
374
    end
J
José Valim 已提交
375 376
  end

377 378 379 380 381
  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

382 383 384
  def test_config_postgresql_database
    run_generator([destination_root, "-d", "postgresql"])
    assert_file "config/database.yml", /postgresql/
385
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
386
      assert_gem "activerecord-jdbcpostgresql-adapter"
387
    else
388
      assert_gem "pg", "'~> 0.18'"
389 390 391
    end
  end

392 393
  def test_config_jdbcmysql_database
    run_generator([destination_root, "-d", "jdbcmysql"])
394
    assert_file "config/database.yml", /mysql/
O
Oscar Del Ben 已提交
395
    assert_gem "activerecord-jdbcmysql-adapter"
396 397
  end

398 399
  def test_config_jdbcsqlite3_database
    run_generator([destination_root, "-d", "jdbcsqlite3"])
400
    assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
401
    assert_gem "activerecord-jdbcsqlite3-adapter"
402 403
  end

404 405
  def test_config_jdbcpostgresql_database
    run_generator([destination_root, "-d", "jdbcpostgresql"])
406
    assert_file "config/database.yml", /postgresql/
O
Oscar Del Ben 已提交
407
    assert_gem "activerecord-jdbcpostgresql-adapter"
408 409
  end

A
Arun Agrawal 已提交
410 411 412
  def test_config_jdbc_database
    run_generator([destination_root, "-d", "jdbc"])
    assert_file "config/database.yml", /jdbc/
413
    assert_file "config/database.yml", /mssql/
O
Oscar Del Ben 已提交
414
    assert_gem "activerecord-jdbc-adapter"
A
Arun Agrawal 已提交
415 416
  end

417 418
  if defined?(JRUBY_VERSION)
    def test_config_jdbc_database_when_no_option_given
419
      run_generator
420
      assert_file "config/database.yml", /sqlite3/
O
Oscar Del Ben 已提交
421
      assert_gem "activerecord-jdbcsqlite3-adapter"
422 423 424
    end
  end

425 426 427 428 429 430 431 432 433 434 435 436 437 438
  def test_generator_without_skips
    run_generator
    assert_file "config/application.rb", /\s+require\s+["']rails\/all["']/
    assert_file "config/environments/development.rb" do |content|
      assert_match(/config\.action_mailer\.raise_delivery_errors = false/, content)
    end
    assert_file "config/environments/test.rb" do |content|
      assert_match(/config\.action_mailer\.delivery_method = :test/, content)
    end
    assert_file "config/environments/production.rb" do |content|
      assert_match(/# config\.action_mailer\.raise_delivery_errors = false/, content)
    end
  end

S
schneems 已提交
439 440 441 442 443
  def test_generator_defaults_to_puma_version
    run_generator [destination_root]
    assert_gem "puma", "'~> 3.0'"
  end

S
schneems 已提交
444 445 446 447 448 449 450 451
  def test_generator_if_skip_puma_is_given
    run_generator [destination_root, "--skip-puma"]
    assert_no_file "config/puma.rb"
    assert_file "Gemfile" do |content|
      assert_no_match(/puma/, content)
    end
  end

452
  def test_generator_if_skip_active_record_is_given
453
    run_generator [destination_root, "--skip-active-record"]
J
José Valim 已提交
454
    assert_no_file "config/database.yml"
455
    assert_no_file "config/initializers/new_framework_defaults/active_record_belongs_to_required_by_default.rb"
456
    assert_no_file "app/models/application_record.rb"
457
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
458
    assert_file "test/test_helper.rb" do |helper_content|
459
      assert_no_match(/fixtures :all/, helper_content)
460
    end
J
José Valim 已提交
461 462
  end

463 464 465 466 467 468 469 470 471 472 473 474 475 476
  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

477 478 479 480 481 482 483
  def test_generator_has_assets_gems
    run_generator

    assert_gem 'sass-rails'
    assert_gem 'uglifier'
  end

484
  def test_generator_if_skip_sprockets_is_given
485
    run_generator [destination_root, "--skip-sprockets"]
486
    assert_no_file "config/initializers/assets.rb"
487
    assert_file "config/application.rb" do |content|
488
      assert_match(/#\s+require\s+["']sprockets\/railtie["']/, content)
489
    end
490
    assert_file "Gemfile" do |content|
491
      assert_no_match(/jquery-rails/, content)
492 493
      assert_no_match(/sass-rails/, content)
      assert_no_match(/uglifier/, content)
494
      assert_no_match(/coffee-rails/, content)
495
    end
496 497 498 499 500
    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 已提交
501 502
      assert_no_match(/config\.assets\.js_compressor = :uglifier/, content)
      assert_no_match(/config\.assets\.css_compressor = :sass/, content)
503
    end
504
  end
J
José Valim 已提交
505

506 507 508
  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["']/
509
    assert_no_file "config/cable.yml"
510
    assert_no_file "app/assets/javascripts/cable.js"
511
    assert_no_file "app/channels"
512 513 514 515 516 517 518
    assert_file "Gemfile" do |content|
      assert_no_match(/redis/, content)
    end
  end

  def test_action_cable_redis_gems
    run_generator
519
    assert_file "Gemfile", /^# gem 'redis'/
520 521
  end

522
  def test_inclusion_of_javascript_runtime
523
    run_generator
524
    if defined?(JRUBY_VERSION)
O
Oscar Del Ben 已提交
525
      assert_gem "therubyrhino"
526
    else
527
      assert_file "Gemfile", /# gem 'therubyracer', platforms: :ruby/
528 529 530
    end
  end

531 532 533 534 535 536
  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 已提交
537
    assert_gem "jquery-rails"
538 539 540 541 542 543 544 545
  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 已提交
546
    assert_gem "prototype-rails"
J
José Valim 已提交
547
  end
548

549 550
  def test_javascript_is_skipped_if_required
    run_generator [destination_root, "--skip-javascript"]
551 552 553 554

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

555
    assert_file "app/views/layouts/application.html.erb" do |contents|
556 557
      assert_match(/stylesheet_link_tag\s+'application', media: 'all' %>/, contents)
      assert_no_match(/javascript_include_tag\s+'application' \%>/, contents)
558
    end
559

560
    assert_file "Gemfile" do |content|
561
      assert_no_match(/coffee-rails/, content)
A
Arun Agrawal 已提交
562
      assert_no_match(/jquery-rails/, content)
563
    end
564
  end
565

A
Arun Agrawal 已提交
566 567
  def test_inclusion_of_jbuilder
    run_generator
568
    assert_gem 'jbuilder'
A
Arun Agrawal 已提交
569 570
  end

571
  def test_inclusion_of_a_debugger
572
    run_generator
573
    if defined?(JRUBY_VERSION) || RUBY_ENGINE == "rbx"
A
Arun Agrawal 已提交
574
      assert_file "Gemfile" do |content|
575
        assert_no_match(/byebug/, content)
A
Arun Agrawal 已提交
576
      end
577
    else
578
      assert_gem 'byebug'
A
Arun Agrawal 已提交
579
    end
580 581
  end

582
  def test_inclusion_of_listen_related_configuration_by_default
583 584
    run_generator
    if RbConfig::CONFIG['host_os'] =~ /darwin|linux/
585
      assert_listen_related_configuration
586
    else
587
      assert_no_listen_related_configuration
588 589 590
    end
  end

591 592 593 594 595
  def test_non_inclusion_of_listen_related_configuration_if_skip_listen
    run_generator [destination_root, '--skip-listen']
    assert_no_listen_related_configuration
  end

596 597 598 599 600 601 602 603 604 605 606
  def test_evented_file_update_checker_config
    run_generator
    assert_file 'config/environments/development.rb' do |content|
      if RbConfig::CONFIG['host_os'] =~ /darwin|linux/
        assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      else
        assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
      end
    end
  end

607
  def test_template_from_dir_pwd
608
    FileUtils.cd(Rails.root)
609
    assert_match(/It works from file!/, run_generator([destination_root, "-m", "lib/template.rb"]))
610 611
  end

J
José Valim 已提交
612
  def test_usage_read_from_file
613 614 615
    assert_called(File, :read, returns: "USAGE FROM FILE") do
      assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
    end
J
José Valim 已提交
616 617 618
  end

  def test_default_usage
619 620 621
    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 已提交
622 623 624
  end

  def test_default_namespace
625
    assert_match "rails:app", Rails::Generators::AppGenerator.namespace
J
José Valim 已提交
626 627
  end

628 629 630 631 632
  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

633 634
  def test_tests_are_removed_from_frameworks_if_skip_test_is_given
    run_generator [destination_root, "--skip-test"]
635 636 637
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
  end

638 639
  def test_no_active_record_or_tests_if_skips_given
    run_generator [destination_root, "--skip-test", "--skip-active-record"]
640 641
    assert_file "config/application.rb", /#\s+require\s+["']rails\/test_unit\/railtie["']/
    assert_file "config/application.rb", /#\s+require\s+["']active_record\/railtie["']/
642
    assert_file "config/application.rb", /\s+require\s+["']active_job\/railtie["']/
643 644
  end

645
  def test_new_hash_style
646
    run_generator
647
    assert_file "config/initializers/session_store.rb" do |file|
648
      assert_match(/config.session_store :cookie_store, key: '_.+_session'/, file)
649 650 651
    end
  end

652 653 654 655 656
  def test_pretend_option
    output = run_generator [File.join(destination_root, "myapp"), "--pretend"]
    assert_no_match(/run  bundle install/, output)
  end

657
  def test_application_name_with_spaces
658
    path = File.join(destination_root, "foo bar")
659 660 661 662 663 664 665 666

    # 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

667 668 669 670 671
  def test_web_console
    run_generator
    assert_gem 'web-console'
  end

672 673 674 675
  def test_web_console_with_dev_option
    run_generator [destination_root, "--dev"]

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
676
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
677
      assert_no_match(/\Agem 'web-console'\z/, content)
678 679 680 681 682 683 684
    end
  end

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

    assert_file "Gemfile" do |content|
M
Mehmet Emin İNAÇ 已提交
685
      assert_match(/gem 'web-console',\s+github: 'rails\/web-console'/, content)
G
Genadi Samokovarov 已提交
686
      assert_no_match(/\Agem 'web-console'\z/, content)
687 688 689
    end
  end

690 691
  def test_spring
    run_generator
692
    assert_gem 'spring'
693 694 695
  end

  def test_spring_binstubs
696
    jruby_skip "spring doesn't run on JRuby"
697 698 699 700 701 702 703 704 705 706 707 708 709 710 711
    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
712 713 714
  end

  def test_spring_no_fork
715
    jruby_skip "spring doesn't run on JRuby"
R
Rafael Mendonça França 已提交
716
    assert_called_with(Process, :respond_to?, [[:fork], [:fork]], returns: false) do
717
      run_generator
718

719 720 721
      assert_file "Gemfile" do |content|
        assert_no_match(/spring/, content)
      end
722 723 724 725 726 727
    end
  end

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

728
    assert_no_file 'config/spring.rb'
729 730 731 732 733
    assert_file "Gemfile" do |content|
      assert_no_match(/spring/, content)
    end
  end

734 735 736 737 738 739 740 741
  def test_spring_with_dev_option
    run_generator [destination_root, "--dev"]

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

742 743
  def test_generator_if_skip_turbolinks_is_given
    run_generator [destination_root, "--skip-turbolinks"]
744 745 746 747 748 749 750 751 752 753 754 755

    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

756 757 758 759 760 761 762 763 764 765 766 767
  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|
768
      assert_no_match(/sqlite/i, content)
769 770 771 772 773 774 775
    end
  end

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

    assert_file '.gitignore' do |content|
776
      assert_no_match(/sqlite/i, content)
777 778 779
    end
  end

780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
  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

804 805
  def test_psych_gem
    run_generator
806
    gem_regex = /gem 'psych',\s+'~> 2.0',\s+platforms: :rbx/
807 808 809 810 811 812 813 814 815 816

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

817 818 819 820 821
  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

822 823 824 825
    check_open = -> *args do
      assert_equal [ path, 'Accept' => 'application/x-thor-template' ], args
      template
    end
826

827 828
    sequence = ['install', 'exec spring binstub --all', 'echo ran after_bundle']
      @sequence_step ||= 0
829
    ensure_bundler_first = -> command do
830 831 832 833 834 835 836 837 838 839 840
      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
841 842

    assert_equal 3, @sequence_step
843 844
  end

845
  protected
J
José Valim 已提交
846

847 848 849 850 851 852 853
  def stub_rails_application(root)
    Rails.application.config.root = root
    Rails.application.class.stub(:name, "Myapp") do
      yield
    end
  end

854
  def action(*args, &block)
855
    capture(:stdout) { generator.send(*args, &block) }
856
  end
O
Oscar Del Ben 已提交
857

858 859 860 861 862 863
  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 已提交
864
  end
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883

  def assert_listen_related_configuration
    assert_gem 'listen'
    assert_gem 'spring-watcher-listen'

    assert_file 'config/environments/development.rb' do |content|
      assert_match(/^\s*config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
    end
  end

  def assert_no_listen_related_configuration
    assert_file 'Gemfile' do |content|
      assert_no_match(/listen/, content)
    end

    assert_file 'config/environments/development.rb' do |content|
      assert_match(/^\s*# config.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
    end
  end
884
end