1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add system tests to generate scaffold

This commit is contained in:
Dinah Shi 2017-06-10 21:39:51 -04:00
parent 52f90044a1
commit d502cd1a50
7 changed files with 104 additions and 13 deletions

View file

@ -16,13 +16,10 @@ module Rails
def handle_skip
@options = @options.merge(stylesheets: false) unless options[:assets]
@options = @options.merge(stylesheet_engine: false) unless options[:stylesheets] && options[:scaffold_stylesheet]
@options = @options.merge(system_tests: false) if options[:api]
end
hook_for :scaffold_controller, required: true
hook_for :system_tests, as: :system
hook_for :assets do |assets|
invoke assets, [controller_name]
end

View file

@ -11,12 +11,19 @@ module TestUnit # :nodoc:
class_option :api, type: :boolean,
desc: "Generates API functional tests"
class_option :system_tests, type: :string,
desc: "Skip system test files"
argument :attributes, type: :array, default: [], banner: "field:type field:type"
def create_test_files
template_file = options.api? ? "api_functional_test.rb" : "functional_test.rb"
template template_file,
File.join("test/controllers", controller_class_path, "#{controller_file_name}_controller_test.rb")
unless options.api? || options[:system_tests].nil?
template "system_test.rb", File.join("test/system", class_path, "#{file_name.pluralize}_test.rb")
end
end
def fixture_name
@ -30,16 +37,20 @@ module TestUnit # :nodoc:
private
def attributes_string
attributes_hash.map { |k, v| "#{k}: #{v}" }.join(", ")
end
def attributes_hash
return if attributes_names.empty?
return {} if attributes_names.empty?
attributes_names.map do |name|
if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
"#{name}: 'secret'"
["#{name}", "'secret'"]
else
"#{name}: @#{singular_table_name}.#{name}"
["#{name}", "@#{singular_table_name}.#{name}"]
end
end.sort.join(", ")
end.sort.to_h
end
end
end

View file

@ -17,7 +17,7 @@ class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTe
test "should create <%= singular_table_name %>" do
assert_difference('<%= class_name %>.count') do
post <%= index_helper %>_url, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> }, as: :json
post <%= index_helper %>_url, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }, as: :json
end
assert_response 201
@ -29,7 +29,7 @@ class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTe
end
test "should update <%= singular_table_name %>" do
patch <%= show_helper %>, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> }, as: :json
patch <%= show_helper %>, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }, as: :json
assert_response 200
end

View file

@ -22,7 +22,7 @@ class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTe
test "should create <%= singular_table_name %>" do
assert_difference('<%= class_name %>.count') do
post <%= index_helper %>_url, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> }
post <%= index_helper %>_url, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }
end
assert_redirected_to <%= singular_table_name %>_url(<%= class_name %>.last)
@ -39,7 +39,7 @@ class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTe
end
test "should update <%= singular_table_name %>" do
patch <%= show_helper %>, params: { <%= "#{singular_table_name}: { #{attributes_hash} }" %> }
patch <%= show_helper %>, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }
assert_redirected_to <%= singular_table_name %>_url(<%= "@#{singular_table_name}" %>)
end

View file

@ -0,0 +1,49 @@
require "application_system_test_case"
<% module_namespacing do -%>
class <%= class_name.pluralize %>Test < ApplicationSystemTestCase
setup do
@<%= singular_table_name %> = <%= fixture_name %>(:one)
end
test "visiting the index" do
visit <%= plural_table_name %>_url
assert_selector "h1", text: "<%= class_name.pluralize.titleize %>"
end
test "creating a <%= human_name %>" do
visit <%= plural_table_name %>_url
click_on "New <%= class_name.titleize %>"
<%- attributes_hash.each do |attr, value| -%>
fill_in "<%= attr.humanize.titleize %>", with: <%= value %>
<%- end -%>
click_on "Create <%= human_name %>"
assert_text "<%= human_name %> was successfully created"
click_on "Back"
end
test "updating a <%= human_name %>" do
visit <%= plural_table_name %>_url
click_on "Edit", match: :first
<%- attributes_hash.each do |attr, value| -%>
fill_in "<%= attr.humanize.titleize %>", with: <%= value %>
<%- end -%>
click_on "Update <%= human_name %>"
assert_text "<%= human_name %> was successfully updated"
click_on "Back"
end
test "destroying a <%= human_name %>" do
visit <%= plural_table_name %>_url
page.accept_confirm do
click_on "Destroy", match: :first
end
assert_text "<%= human_name %> was successfully destroyed"
end
end
<% end -%>

View file

@ -437,7 +437,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_generator_if_skip_system_test_is_given
run_generator [destination_root, "--skip_system_test"]
run_generator [destination_root, "--skip-system-test"]
assert_file "Gemfile" do |content|
assert_no_match(/capybara/, content)
assert_no_match(/selenium-webdriver/, content)
@ -445,7 +445,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_does_not_generate_system_test_files_if_skip_system_test_is_given
run_generator [destination_root, "--skip_system_test"]
run_generator [destination_root, "--skip-system-test"]
Dir.chdir(destination_root) do
quietly { `./bin/rails g scaffold User` }

View file

@ -65,6 +65,9 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
# System tests
assert_file "test/system/product_lines_test.rb" do |test|
assert_match(/class ProductLinesTest < ApplicationSystemTestCase/, test)
assert_match(/visit product_lines_url/, test)
assert_match(/fill_in "Title", with: @product_line\.title/, test)
assert_match(/assert_text "Product line was successfully updated"/, test)
end
# Views
@ -146,6 +149,9 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_no_match(/assert_redirected_to/, test)
end
# System tests
assert_no_file "test/system/product_lines_test.rb"
# Views
assert_no_file "app/views/layouts/product_lines.html.erb"
@ -173,6 +179,16 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
end
end
def test_system_tests_without_attributes
run_generator ["product_line"]
assert_file "test/system/product_lines_test.rb" do |content|
assert_match(/class ProductLinesTest < ApplicationSystemTestCase/, content)
assert_match(/test "visiting the index"/, content)
assert_no_match(/fill_in/, content)
end
end
def test_scaffold_on_revoke
run_generator
run_generator ["product_line"], behavior: :revoke
@ -192,6 +208,9 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_no_file "app/controllers/product_lines_controller.rb"
assert_no_file "test/controllers/product_lines_controller_test.rb"
# System tests
assert_no_file "test/system/product_lines_test.rb"
# Views
assert_no_file "app/views/product_lines"
assert_no_file "app/views/layouts/product_lines.html.erb"
@ -257,6 +276,9 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_file "test/controllers/admin/roles_controller_test.rb",
/class Admin::RolesControllerTest < ActionDispatch::IntegrationTest/
assert_file "test/system/admin/roles_test.rb",
/class Admin::RolesTest < ApplicationSystemTestCase/
# Views
%w(index edit new show _form).each do |view|
assert_file "app/views/admin/roles/#{view}.html.erb"
@ -292,6 +314,9 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_no_file "app/controllers/admin/roles_controller.rb"
assert_no_file "test/controllers/admin/roles_controller_test.rb"
# System tests
assert_no_file "test/system/admin/roles_test.rb"
# Views
assert_no_file "app/views/admin/roles"
assert_no_file "app/views/layouts/admin/roles.html.erb"
@ -478,6 +503,11 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_match(/password_confirmation: 'secret'/, content)
end
assert_file "test/system/users_test.rb" do |content|
assert_match(/fill_in "Password", with: 'secret'/, content)
assert_match(/fill_in "Password Confirmation", with: 'secret'/, content)
end
assert_file "test/fixtures/users.yml" do |content|
assert_match(/password_digest: <%= BCrypt::Password.create\('secret'\) %>/, content)
end
@ -573,6 +603,8 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert File.exist?("app/controllers/bukkits/users_controller.rb")
assert File.exist?("test/controllers/bukkits/users_controller_test.rb")
assert File.exist?("test/system/bukkits/users_test.rb")
assert File.exist?("app/views/bukkits/users/index.html.erb")
assert File.exist?("app/views/bukkits/users/edit.html.erb")
assert File.exist?("app/views/bukkits/users/show.html.erb")
@ -601,6 +633,8 @@ class ScaffoldGeneratorTest < Rails::Generators::TestCase
assert_not File.exist?("app/controllers/bukkits/users_controller.rb")
assert_not File.exist?("test/controllers/bukkits/users_controller_test.rb")
assert_not File.exist?("test/system/bukkits/users_test.rb")
assert_not File.exist?("app/views/bukkits/users/index.html.erb")
assert_not File.exist?("app/views/bukkits/users/edit.html.erb")
assert_not File.exist?("app/views/bukkits/users/show.html.erb")