Skip to content

Commit

Permalink
abstract rails/convert_rails_test_request_methods_4_2_to_5_0 snippet
Browse files Browse the repository at this point in the history
  • Loading branch information
flyerhzm committed Feb 1, 2021
1 parent 6844375 commit 9998514
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 68 deletions.
71 changes: 71 additions & 0 deletions lib/rails/convert_rails_test_request_methods_4_2_to_5_0.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
Synvert::Rewriter.new 'rails', 'convert_rails_test_request_methods_4_2_to_5_0' do
description <<-EOF
It converts rails test request methods from 4.2 to 5.0
functional test:
get :show, { id: user.id }, { notice: 'Welcome' }, { admin: user.admin? }
=>
get :show, params: { id: user.id }, flash: { notice: 'Welcome' }, session: { admin: user.admin? }.
integration test:
get '/posts/1', user_id: user.id, { 'HTTP_AUTHORIZATION' => 'fake' }
=>
get '/posts/1', params: { user_id: user.id }, headers: { 'HTTP_AUTHORIZATION' => 'fake' }
EOF

# get :show, { id: user.id }, { notice: 'Welcome' }, { admin: user.admin? }
# =>
# get :show, params: { id: user.id }, flash: { notice: 'Welcome' }, session: { admin: user.admin? }.
within_files '{test,spec}/{functional,controllers}/**/*.rb' do
%w(get post put patch delete).each do |message|
with_node type: 'send', message: message do
next unless node.arguments.size > 1
next unless node.arguments[1].type == :hash
next if node.arguments[1].has_key?(:params)

def make_up_hash_pair(key, argument_node)
if argument_node.to_source != 'nil'
if argument_node.type == :hash
"#{key}: #{add_curly_brackets_if_necessary(argument_node.to_source)}"
else
"#{key}: #{argument_node.to_source}"
end
end
end
options = []
options << make_up_hash_pair('params', node.arguments[1])
options << make_up_hash_pair('flash', node.arguments[2]) if node.arguments.size > 2
options << make_up_hash_pair('session', node.arguments[3]) if node.arguments.size > 3
replace_with "#{message} {{arguments.first}}, #{options.compact.join(', ')}"
end
end
end

# get '/posts/1', user_id: user.id, { 'HTTP_AUTHORIZATION' => 'fake' }
# =>
# get '/posts/1', params: { user_id: user.id }, headers: { 'HTTP_AUTHORIZATION' => 'fake' }
within_files '{test,spec}/{integration}/**/*.rb' do
%w(get post put patch delete).each do |message|
with_node type: 'send', message: message do
next unless node.arguments.size > 1
next if node.arguments[1].type == :hash && node.arguments[1].has_key?(:params)

def make_up_hash_pair(key, argument_node)
if argument_node.to_source != 'nil'
if argument_node.type == :hash
"#{key}: #{add_curly_brackets_if_necessary(argument_node.to_source)}"
else
"#{key}: #{argument_node.to_source}"
end
end
end
options = []
options << make_up_hash_pair('params', node.arguments[1])
options << make_up_hash_pair('headers', node.arguments[2]) if node.arguments.size > 2
replace_with "#{message} {{arguments.first}}, #{options.compact.join(', ')}"
end
end
end
end
6 changes: 5 additions & 1 deletion lib/rails/convert_render_nothing_true_to_head_ok.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@

Synvert::Rewriter.new 'rails', 'convert_render_nothing_true_to_head_ok' do
description <<-EOF
it replaces render nothing: true with head :ok in controller files.
It replaces render nothing: true with head :ok in controller files.
render nothing: true
=>
head :ok
EOF

within_file 'app/controllers/**/*.rb' do
Expand Down
27 changes: 1 addition & 26 deletions lib/rails/upgrade_4_2_to_5_0.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

add_snippet 'rails', 'add_active_record_migration_rails_version'
add_snippet 'rails', 'convert_render_nothing_true_to_head_ok'
add_snippet 'rails', 'convert_rails_test_request_methods_4_2_to_5_0'

within_file 'config/application.rb' do
# remove config.raise_in_transactional_callbacks = true
Expand Down Expand Up @@ -195,30 +196,4 @@
Rails.application.config.ssl_options = { hsts: { subdomains: true } }
"''.strip
add_file 'config/initializers/new_framework_defaults.rb', new_code

# get :show, { id: user.id }, { notice: 'Welcome' }, { admin: user.admin? }
# =>
# get :show, params: { id: user.id }, flash: { notice: 'Welcome' }, session: { admin: user.admin? }.
within_files '{test,spec}/{functional,controllers}/**/*.rb' do
%w(get post put patch delete).each do |message|
with_node type: 'send', message: message do
def make_up_hash_pair(key, argument_node)
if argument_node.to_source != 'nil'
if argument_node.type == :hash
"#{key}: #{add_curly_brackets_if_necessary(argument_node.to_source)}"
else
"#{key}: #{argument_node.to_source}"
end
end
end
if node.arguments.size > 1 && node.arguments[1].type == :hash && !node.arguments[1].has_key?(:params)
options = []
options << make_up_hash_pair('params', node.arguments[1])
options << make_up_hash_pair('flash', node.arguments[2]) if node.arguments.size > 2
options << make_up_hash_pair('session', node.arguments[3]) if node.arguments.size > 3
replace_with "#{message} {{arguments.first}}, #{options.compact.join(', ')}"
end
end
end
end
end
93 changes: 93 additions & 0 deletions spec/rails/convert_rails_test_request_methods_4_2_to_5_0_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
require 'spec_helper'

RSpec.describe 'Convert rails request methods from 4.2 to 5.0' do
let(:rewriter_name) { 'rails/convert_rails_test_request_methods_4_2_to_5_0' }

context 'functional test' do
let(:fake_file_path) { 'test/functional/posts_controller_test.rb' }
let(:test_content) { "
class PostsControllerTest < ActionController::TestCase
def test_show
get :show, { id: user.id }, { notice: 'Welcome' }, { admin: user.admin? }
end
def test_index
get :index, params: { query: 'test' }
end
def test_create
post :create, name: 'user'
end
def test_destroy
delete :destroy, { id: user.id }, nil, { admin: user.admin? }
end
end
" }
let(:test_rewritten_content) { "
class PostsControllerTest < ActionController::TestCase
def test_show
get :show, params: { id: user.id }, flash: { notice: 'Welcome' }, session: { admin: user.admin? }
end
def test_index
get :index, params: { query: 'test' }
end
def test_create
post :create, params: { name: 'user' }
end
def test_destroy
delete :destroy, params: { id: user.id }, session: { admin: user.admin? }
end
end
" }

include_examples 'convertable'
end

context 'integration test' do
let(:fake_file_path) { 'spec/integration/posts_controller_spec.rb' }
let(:test_content) { "
RSpec.describe '/posts' do
it 'tests show' do
get '/posts/1', user_id: user.id
end
it 'tests index' do
get '/posts', nil, { 'HTTP_AUTHORIZATION' => 'fake' }
end
it 'tests create' do
post '/posts', { title: 'test' }, { 'HTTP_AUTHORIZATION' => 'fake' }
end
it 'tests delete' do
delete '/posts/1', nil, { 'HTTP_AUTHORIZATION' => 'fake' }
end
end
" }
let(:test_rewritten_content) { "
RSpec.describe '/posts' do
it 'tests show' do
get '/posts/1', params: { user_id: user.id }
end
it 'tests index' do
get '/posts', headers: { 'HTTP_AUTHORIZATION' => 'fake' }
end
it 'tests create' do
post '/posts', params: { title: 'test' }, headers: { 'HTTP_AUTHORIZATION' => 'fake' }
end
it 'tests delete' do
delete '/posts/1', headers: { 'HTTP_AUTHORIZATION' => 'fake' }
end
end
" }

include_examples 'convertable'
end
end
45 changes: 4 additions & 41 deletions spec/rails/upgrade_4_2_to_5_0_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,59 +177,22 @@ module Namespace
# Configure SSL options to enable HSTS with subdomains. Previous versions had false.
Rails.application.config.ssl_options = { hsts: { subdomains: true } }
'.strip}
let(:posts_controller_test_content) { '
class PostsControllerTest < ActionController::TestCase
def test_show
get :show, { id: user.id }, { notice: "Welcome" }, { admin: user.admin? }
end
def test_index
get :index, params: { query: "test" }
end
def test_create
post :create, name: "user"
end
def test_destroy
delete :destroy, { id: user.id }, nil, { admin: user.admin? }
end
end
'.strip}
let(:posts_controller_test_rewritten_content) { '
class PostsControllerTest < ActionController::TestCase
def test_show
get :show, params: { id: user.id }, flash: { notice: "Welcome" }, session: { admin: user.admin? }
end
def test_index
get :index, params: { query: "test" }
end
def test_create
post :create, params: { name: "user" }
end
def test_destroy
delete :destroy, params: { id: user.id }, session: { admin: user.admin? }
end
end
'.strip}
let(:fake_file_paths) { %w[config/application.rb config/environments/production.rb config/initializers/new_framework_defaults.rb
app/controllers/posts_controller.rb app/controllers/namespace/posts_controller.rb app/models/application_record.rb app/models/post.rb
app/models/namespace/post.rb app/jobs/application_job.rb app/jobs/post_job.rb app/jobs/namespace/post_job.rb test/functional/posts_controller_test.rb] }
app/models/namespace/post.rb app/jobs/application_job.rb app/jobs/post_job.rb app/jobs/namespace/post_job.rb] }
let(:test_contents) { [application_content, production_content, nil, posts_controller_content, nested_controller_content, nil,
post_model_content, nested_model_content, nil, post_job_content, nested_job_content, posts_controller_test_content] }
post_model_content, nested_model_content, nil, post_job_content, nested_job_content] }
let(:test_rewritten_contents) { [application_rewritten_content, production_rewritten_content, new_framework_defaults_rewritten_content,
posts_controller_rewritten_content, nested_controller_rewritten_content, application_record_rewritten_content,
post_model_rewritten_content, nested_model_rewritten_content, application_job_rewritten_content, post_job_rewritten_content,
nested_job_rewritten_content, posts_controller_test_rewritten_content] }
nested_job_rewritten_content] }

before do
load_sub_snippets(%w[
rails/add_active_record_migration_rails_version
rails/convert_render_nothing_true_to_head_ok
rails/convert_rails_test_request_methods_4_2_to_5_0
])
end

Expand Down

0 comments on commit 9998514

Please sign in to comment.