Migrated RSpec UserController test to request test because controller tests are soft deprecated.

This commit is contained in:
Thorsten Eckel 2018-07-09 08:51:58 +02:00
parent 348429940d
commit 7750f4cdca
4 changed files with 129 additions and 110 deletions

View file

@ -25,8 +25,8 @@ Zammad::Application.routes.draw do
match api_path + '/users/:id', to: 'users#show', via: :get match api_path + '/users/:id', to: 'users#show', via: :get
match api_path + '/users/history/:id', to: 'users#history', via: :get match api_path + '/users/history/:id', to: 'users#history', via: :get
match api_path + '/users', to: 'users#create', via: :post match api_path + '/users', to: 'users#create', via: :post
match api_path + '/users/:id', to: 'users#update', via: :put match api_path + '/users/:id', to: 'users#update', via: :put, as: 'api_v1_update_user'
match api_path + '/users/:id', to: 'users#destroy', via: :delete match api_path + '/users/:id', to: 'users#destroy', via: :delete, as: 'api_v1_delete_user'
match api_path + '/users/image/:hash', to: 'users#image', via: :get match api_path + '/users/image/:hash', to: 'users#image', via: :get
match api_path + '/users/email_verify', to: 'users#email_verify', via: :post match api_path + '/users/email_verify', to: 'users#email_verify', via: :post

View file

@ -1,6 +1,6 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe UsersController, type: :controller do RSpec.describe 'User endpoint', type: :request do
let(:role_with_admin_user_permissions) do let(:role_with_admin_user_permissions) do
create(:role).tap do |role| create(:role).tap do |role|
@ -16,7 +16,7 @@ RSpec.describe UsersController, type: :controller do
end end
let(:admin_without_admin_user_permissions) { create(:user, roles: [role_without_admin_user_permissions]) } let(:admin_without_admin_user_permissions) { create(:user, roles: [role_without_admin_user_permissions]) }
describe 'POST #create' do describe 'User creation' do
let(:attributes) { attributes_params_for(:user) } let(:attributes) { attributes_params_for(:user) }
@ -25,7 +25,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
post :create, params: attributes post api_v1_users_path, params: attributes
end.to not_change { end.to not_change {
User.count User.count
} }
@ -51,7 +51,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_with_admin_user_permissions) authenticated_as(admin_with_admin_user_permissions)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to change { end.to change {
User.count User.count
}.by(1) }.by(1)
@ -64,7 +64,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_without_admin_user_permissions) authenticated_as(admin_without_admin_user_permissions)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to not_change { end.to not_change {
User.count User.count
} }
@ -77,7 +77,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to change { end.to change {
User.count User.count
}.by(1) }.by(1)
@ -128,7 +128,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_with_admin_user_permissions) authenticated_as(admin_with_admin_user_permissions)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to change { end.to change {
User.count User.count
}.by(1) }.by(1)
@ -141,7 +141,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_without_admin_user_permissions) authenticated_as(admin_without_admin_user_permissions)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to not_change { end.to not_change {
User.count User.count
} }
@ -154,7 +154,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
post :create, params: payload post api_v1_users_path, params: payload
end.to change { end.to change {
User.count User.count
}.by(1) }.by(1)
@ -187,13 +187,13 @@ RSpec.describe UsersController, type: :controller do
end end
end end
describe 'PUT #update' do describe 'User update' do
def authorized_update_request(requester:, requested:) def authorized_update_request(requester:, requested:)
authenticated_as(requester) authenticated_as(requester)
expect do expect do
put :update, params: cleaned_params_for(requested).merge(firstname: 'Changed') put api_v1_update_user_path(requested), params: cleaned_params_for(requested).merge(firstname: 'Changed')
end.to change { end.to change {
requested.reload.firstname requested.reload.firstname
} }
@ -205,7 +205,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
put :update, params: cleaned_params_for(requested).merge(firstname: 'Changed') put api_v1_update_user_path(requested), params: cleaned_params_for(requested).merge(firstname: 'Changed')
end.to not_change { end.to not_change {
requested.reload.attributes requested.reload.attributes
} }
@ -375,7 +375,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_with_admin_user_permissions) authenticated_as(admin_with_admin_user_permissions)
expect do expect do
put :update, params: payload put api_v1_update_user_path(requested), params: payload
end.to change { end.to change {
value_of_attribute value_of_attribute
} }
@ -386,7 +386,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(admin_without_admin_user_permissions) authenticated_as(admin_without_admin_user_permissions)
expect do expect do
put :update, params: payload put api_v1_update_user_path(requested), params: payload
end.to not_change { end.to not_change {
value_of_attribute value_of_attribute
} }
@ -402,7 +402,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
put :update, params: payload put api_v1_update_user_path(requested), params: payload
end.to change { end.to change {
value_of_attribute value_of_attribute
} }
@ -418,7 +418,7 @@ RSpec.describe UsersController, type: :controller do
authenticated_as(requester) authenticated_as(requester)
expect do expect do
put :update, params: payload put api_v1_update_user_path(requested), params: payload
end.to not_change { end.to not_change {
value_of_attribute value_of_attribute
} }
@ -510,12 +510,12 @@ RSpec.describe UsersController, type: :controller do
end end
end end
describe 'DELETE #destroy' do describe 'User deletion' do
def authorized_destroy_request(requester:, requested:) def authorized_destroy_request(requester:, requested:)
authenticated_as(requester) authenticated_as(requester)
delete :destroy, params: { id: requested.id } delete api_v1_delete_user_path(requested)
expect(response).to have_http_status(:success) expect(response).to have_http_status(:success)
expect(requested).not_to exist_in_database expect(requested).not_to exist_in_database
@ -524,7 +524,7 @@ RSpec.describe UsersController, type: :controller do
def unauthorized_destroy_request(requester:, requested:) def unauthorized_destroy_request(requester:, requested:)
authenticated_as(requester) authenticated_as(requester)
delete :destroy, params: { id: requested.id } delete api_v1_delete_user_path(requested)
expect(response).to have_http_status(:unauthorized) expect(response).to have_http_status(:unauthorized)
expect(requested).to exist_in_database expect(requested).to exist_in_database

View file

@ -1,89 +0,0 @@
module ZammadSpecSupportController
# Authenticates all requests of the current example as the given user.
#
# @example
# authenticated_as(some_admin_user)
#
# @return nil
def authenticated_as(user)
session[:user_id] = user.id
end
# Provides a Hash of attributes for the given FactoryBot
# factory parameters which can be used as the params payload.
# Note that the attributes are "cleaned" so no created_by_id etc.
# is present.
#
# @see FactoryBot#attributes_for
#
# @example
# attributes_params_for(:admin_user, email: 'custom@example.com')
# # => {firstname: 'Nicole', email: 'custom@example.com', ...}
#
# @return [Hash{Symbol => <String, Array, Hash>}] request cleaned attributes
def attributes_params_for(*args)
filter_unused_params(attributes_for(*args))
end
# Provides a Hash of attributes for the given Model instance which can
# be used as the params payload.
# Note that the attributes are "cleaned" so no created_by_id etc.
# is present.
#
# @param [Hash] instance An ActiveRecord instance
#
# @example
# cleaned_params_for(some_admin_user)
# # => {firstname: 'Nicole', email: 'admin@example.com', ...}
#
# @return [Hash{Symbol => <String, Array, Hash>}] request cleaned attributes
def cleaned_params_for(instance)
filter_unused_params(instance.attributes)
end
# This is a self explaining internal method.
#
# @see ApplicationModel#filter_unused_params
def filter_unused_params(unfiltered)
# let's get private
ApplicationModel.send(:filter_unused_params, unfiltered)
end
def self.included(base)
# Execute in RSpec class context
base.class_exec do
# This method disables the CSRF token validation for all controller
# examples. It's possible to re-enable the check by adding the
# meta tag `verify_csrf_token` to the needing example:
#
# @example
# it 'does stuff with verified CSRF token', verify_csrf_token: true do
#
before(:each) do |example|
if !example.metadata[:verify_csrf_token]
allow(controller).to receive(:verify_csrf_token).and_return(true)
end
end
# This method disables the user device check for all controller
# examples. It's possible to re-enable the check by adding the
# meta tag `perform_user_device_check` to the needing example:
#
# @example
# it 'does stuff with user device check', perform_user_device_check: true do
#
before(:each) do |example|
if !example.metadata[:perform_user_device_check]
session[:user_device_updated_at] = Time.zone.now
end
end
end
end
end
RSpec.configure do |config|
config.include ZammadSpecSupportController, type: :controller
end

108
spec/support/request.rb Normal file
View file

@ -0,0 +1,108 @@
module ZammadSpecSupportRequest
# This ruby meta programming action creates the methods to perform:
# GET, POST, PATCH, PUT, DELETE and HEAD
# HTTP "requests".
# They overwrite the ones of `ActionDispatch::Integration::RequestHelpers`
# to add the headers set by #add_headers before
%i[get post patch put delete head].each do |method_id|
define_method(method_id) do |path, **args|
headers = Hash(headers).merge(Hash(@headers))
super(path, headers: headers, **args)
end
end
# Adds one or more HTTP headers to all requests of the current example.
#
# @param [Hash{String => String}] headers Hash of HTTP headers
#
# @example
# add_headers('Eg Some X-Header' => 'Some value')
# @example
# add_headers(
# 'Header 1' => 'Some value',
# 'Header 2' => 'Some value',
# ...
# )
#
# @return [Hash] The current headers Hash
def add_headers(headers)
@headers = Hash(@headers).merge(headers)
end
# Parses the response.body as JSON.
#
# @example
# json_response
# @example
# json_response.is_a?(Array)
#
# @return [Array, Hash, ...] Parsed JSON structure as Ruby object
def json_response
JSON.parse(response.body)
end
# Authenticates all requests of the current example as the given user.
#
# @example
# authenticated_as(some_admin_user)
#
# @return nil
def authenticated_as(user)
# mock authentication otherwise login won't
# if user has no password (which is expensive to create)
if user.password.nil?
allow(User).to receive(:authenticate).with(user.login, '').and_return(user)
end
credentials = ActionController::HttpAuthentication::Basic.encode_credentials(user.login, user.password)
add_headers('Authorization' => credentials)
end
# Provides a Hash of attributes for the given FactoryBot
# factory parameters which can be used as the params payload.
# Note that the attributes are "cleaned" so no created_by_id etc.
# is present.
#
# @see FactoryBot#attributes_for
#
# @example
# attributes_params_for(:admin_user, email: 'custom@example.com')
# # => {firstname: 'Nicole', email: 'custom@example.com', ...}
#
# @return [Hash{Symbol => <String, Array, Hash>}] request cleaned attributes
def attributes_params_for(*args)
filter_unused_params(attributes_for(*args))
end
# Provides a Hash of attributes for the given Model instance which can
# be used as the params payload.
# Note that the attributes are "cleaned" so no created_by_id etc.
# is present.
#
# @param [Hash] instance An ActiveRecord instance
#
# @example
# cleaned_params_for(some_admin_user)
# # => {firstname: 'Nicole', email: 'admin@example.com', ...}
#
# @return [Hash{Symbol => <String, Array, Hash>}] request cleaned attributes
def cleaned_params_for(instance)
filter_unused_params(instance.attributes)
end
# This is a self explaining internal method.
#
# @see ApplicationModel#filter_unused_params
def filter_unused_params(unfiltered)
# let's get private
ApplicationModel.send(:filter_unused_params, unfiltered)
end
end
RSpec.configure do |config|
config.include ZammadSpecSupportRequest, type: :request
end