additionals/test/crud_controller_base.rb
2024-05-17 09:12:23 +02:00

291 lines
7.3 KiB
Ruby

# frozen_string_literal: true
module CrudControllerBase
extend ActiveSupport::Concern
included do
# Show
def test_show
unless prepare_crud_test :show
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
get :show
end
return
end
get :show, params: @crud[:show_params].presence || { id: id_value }
if @crud[:show_assert_response].present?
assert_response @crud[:show_assert_response]
else
assert_response :success
end
assert_select(*@crud[:show_assert_select]) if @crud[:show_assert_select].present?
end
def test_show_without_permission
return unless prepare_crud_test :show, no_permission: true
get :show, params: @crud[:show_params].presence || { id: id_value }
assert_response :forbidden
end
# Index
def test_index
unless prepare_crud_test :index
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
get :index
end
return
end
get :index, params: @crud[:index_params]
if @crud[:index_assert_response].present?
assert_response @crud[:index_assert_response]
else
assert_response :success
end
assert_select(*@crud[:index_assert_select]) if @crud[:index_assert_select].present?
end
def test_index_without_permission
return unless prepare_crud_test :index, no_permission: true
get :index, params: @crud[:index_params]
if @crud[:index_forbidden_status].present?
assert_response @crud[:index_forbidden_status]
else
assert_response :forbidden
end
end
# New
def test_new
unless prepare_crud_test :new
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
get :new
end
return
end
get :new, params: @crud[:new_params].presence || {}
assert_response :success
end
def test_new_without_permission
return unless prepare_crud_test :new, no_permission: true
get :new, params: @crud[:new_params].presence || {}
assert_response :forbidden
end
# Create
def test_create
unless prepare_crud_test :create
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
post :create
end
return
end
assert_difference "#{@crud[:entity].class.name}.count" do
assert_no_difference 'Journal.count' do
post :create, params: form_params(:create)
end
end
if @crud[:create_redirect_to]
assert_redirected_to @crud[:create_redirect_to]
else
assert_response :found
end
entity = @crud[:entity].class.last
if @crud[:created_assert].present?
@crud[:created_assert].each do |name|
assert entity.send(name), "Expected false to be truthy for #{name}"
end
end
if @crud[:create_assert_not].present?
@crud[:create_assert_not].each do |name|
assert_not entity.send(name), "Expected true to be nil or false for #{name}"
end
end
return if @crud[:create_assert_equals].blank?
@crud[:create_assert_equals].each do |name, value|
assert_equal value, entity.send(name), "Field #{name} test failed"
end
end
def test_create_without_permission
return unless prepare_crud_test :create, no_permission: true
assert_no_difference "#{@crud[:entity].class.name}.count" do
post :create, params: form_params(:create)
end
assert_response :forbidden
end
# Edit
def test_edit
unless prepare_crud_test :edit
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
post :edit
end
return
end
get :edit, params: { id: id_value }
assert_response :success
if @crud[:edit_assert_select].present?
assert_select(*@crud[:edit_assert_select])
else
assert_select "form#edit_#{@crud[:form]}"
end
end
def test_edit_without_permission
return unless prepare_crud_test :edit, no_permission: true
get :edit, params: { id: id_value }
assert_response :forbidden
end
# Update
def test_update
unless prepare_crud_test :update
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
put :update
end
return
end
put :update, params: form_params(:update)
if @crud[:update_redirect_to]
assert_redirected_to @crud[:update_redirect_to]
else
assert_response :found
end
@crud[:entity]&.reload
if @crud[:update_assert].present?
@crud[:update_assert].each do |name|
assert @crud[:entity].send(name), "Expected false to be truthy for #{name}"
end
end
if @crud[:update_assert_not].present?
@crud[:update_assert_not].each do |name|
assert_not @crud[:entity].send(name), "Expected true to be nil or false for #{name}"
end
end
return if @crud[:update_assert_equals].blank?
@crud[:update_assert_equals].each do |name, value|
assert_equal value, @crud[:entity].send(name)
end
end
def test_update_without_permission
return unless prepare_crud_test :update, no_permission: true
put :update, params: form_params(:update)
assert_response :forbidden
return if @crud[:update_equals].blank?
@crud[:entity].reload
@crud[:update_equals].each do |name, value|
assert_not_equal value, @crud[:entity].send(name)
end
end
# Delete
def test_delete
unless prepare_crud_test :delete
# no controller action should be available, test it
assert_raises ActionController::UrlGenerationError do
delete :destroy
end
return
end
assert_difference("#{@crud[:entity].class.name}.count", -1) do
delete :destroy, params: { id: id_value }
end
return if @crud[:delete_redirect_to].blank?
assert_redirected_to @crud[:delete_redirect_to]
end
def test_delete_without_permission
return unless prepare_crud_test :delete, no_permission: true
assert_no_difference "#{@crud[:entity].class.name}.count" do
delete :destroy, params: { id: id_value }
end
assert_response :forbidden
end
private
def id_value
primary_field = @crud[:primary_field] ||= :id
@crud[:entity].send primary_field
end
def form_params(action)
crud_params = @crud[:"#{action}_params"]
if @crud[:form]
{ id: id_value, @crud[:form] => crud_params }
else
crud_params
end
end
def prepare_crud_test(action, no_permission: false)
return false if @crud[:without_actions].present? && @crud[:without_actions].include?(action)
@request.session[:user_id] = if no_permission
@user_without_permission.id
else
@user.id
end
true
end
end
end