Closes #2531 which fixes #2534 - Agents should always be able to re-open closed tickets, regardless of group.follow_up_possible - huge thanks to @martinvonwittich!
This commit is contained in:
parent
7919f341ff
commit
8f04e32079
3 changed files with 77 additions and 58 deletions
|
@ -659,6 +659,7 @@ class TicketsController < ApplicationController
|
||||||
def follow_up_possible_check
|
def follow_up_possible_check
|
||||||
ticket = Ticket.find(params[:id])
|
ticket = Ticket.find(params[:id])
|
||||||
|
|
||||||
|
return true if current_user.permissions?('ticket.agent') # agents can always reopen tickets, regardless of group configuration
|
||||||
return true if ticket.group.follow_up_possible != 'new_ticket' # check if the setting for follow_up_possible is disabled
|
return true if ticket.group.follow_up_possible != 'new_ticket' # check if the setting for follow_up_possible is disabled
|
||||||
return true if ticket.state.name != 'closed' # check if the ticket state is already closed
|
return true if ticket.state.name != 'closed' # check if the ticket state is already closed
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'Ticket', type: :request do
|
RSpec.describe 'Ticket', type: :request do # rubocop:disable Metrics/BlockLength
|
||||||
|
|
||||||
let!(:ticket_group) do
|
let!(:ticket_group) do
|
||||||
create(:group, email_address: create(:email_address) )
|
create(:group, email_address: create(:email_address) )
|
||||||
|
@ -1872,63 +1872,6 @@ RSpec.describe 'Ticket', type: :request do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does ticket with follow up possible set to new_ticket (06.01)' do
|
|
||||||
group = create(
|
|
||||||
:group,
|
|
||||||
follow_up_possible: 'new_ticket' # disable follow up possible
|
|
||||||
)
|
|
||||||
|
|
||||||
ticket = create(
|
|
||||||
:ticket,
|
|
||||||
title: 'ticket with wrong ticket id',
|
|
||||||
group_id: group.id,
|
|
||||||
customer_id: customer_user.id,
|
|
||||||
state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
|
|
||||||
)
|
|
||||||
|
|
||||||
state = Ticket::State.find_by(name: 'open') # try to open a ticket from a closed state
|
|
||||||
|
|
||||||
# customer
|
|
||||||
params = {
|
|
||||||
state_id: state.id, # set the state id
|
|
||||||
}
|
|
||||||
|
|
||||||
authenticated_as(customer_user)
|
|
||||||
put "/api/v1/tickets/#{ticket.id}", params: params, as: :json
|
|
||||||
expect(response).to have_http_status(422)
|
|
||||||
expect(json_response).to be_a_kind_of(Hash)
|
|
||||||
expect(json_response['error']).to eq('Cannot follow up on a closed ticket. Please create a new ticket.')
|
|
||||||
|
|
||||||
ticket = create(
|
|
||||||
:ticket,
|
|
||||||
title: 'ticket with wrong ticket id',
|
|
||||||
group_id: group.id,
|
|
||||||
customer_id: customer_user.id,
|
|
||||||
state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
|
|
||||||
)
|
|
||||||
|
|
||||||
authenticated_as(admin_user)
|
|
||||||
put "/api/v1/tickets/#{ticket.id}", params: params, as: :json
|
|
||||||
expect(response).to have_http_status(422)
|
|
||||||
expect(json_response).to be_a_kind_of(Hash)
|
|
||||||
expect(json_response['error']).to eq('Cannot follow up on a closed ticket. Please create a new ticket.')
|
|
||||||
|
|
||||||
ticket = create(
|
|
||||||
:ticket,
|
|
||||||
title: 'ticket with wrong ticket id',
|
|
||||||
group_id: group.id,
|
|
||||||
customer_id: customer_user.id,
|
|
||||||
state: Ticket::State.lookup(name: 'closed'), # set the ticket to closed
|
|
||||||
)
|
|
||||||
|
|
||||||
# agent
|
|
||||||
authenticated_as(agent_user)
|
|
||||||
put "/api/v1/tickets/#{ticket.id}", params: params, as: :json
|
|
||||||
expect(response).to have_http_status(422)
|
|
||||||
expect(json_response).to be_a_kind_of(Hash)
|
|
||||||
expect(json_response['error']).to eq('Cannot follow up on a closed ticket. Please create a new ticket.')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'does ticket merge (07.01)' do
|
it 'does ticket merge (07.01)' do
|
||||||
group_no_permission = create(:group)
|
group_no_permission = create(:group)
|
||||||
ticket1 = create(
|
ticket1 = create(
|
||||||
|
@ -2136,4 +2079,66 @@ RSpec.describe 'Ticket', type: :request do
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '/api/v1/tickets' do
|
||||||
|
subject(:ticket) { create(:ticket, state_name: 'closed') }
|
||||||
|
let(:admin) { create(:admin_user, groups: [ticket.group]) }
|
||||||
|
let(:agent) { create(:agent_user, groups: [ticket.group]) }
|
||||||
|
let(:customer) { ticket.customer }
|
||||||
|
|
||||||
|
describe 'reopening a ticket' do
|
||||||
|
shared_examples 'successfully reopen a ticket' do
|
||||||
|
it 'succeeds' do
|
||||||
|
put "/api/v1/tickets/#{ticket.id}",
|
||||||
|
params: { state_id: Ticket::State.find_by(name: 'open').id },
|
||||||
|
as: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:ok)
|
||||||
|
expect(json_response).to include('state_id' => Ticket::State.find_by(name: 'open').id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'fail to reopen a ticket' do
|
||||||
|
it 'fails' do
|
||||||
|
put "/api/v1/tickets/#{ticket.id}",
|
||||||
|
params: { state_id: Ticket::State.find_by(name: 'open').id },
|
||||||
|
as: :json
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:unprocessable_entity)
|
||||||
|
expect(json_response).to include('error' => 'Cannot follow up on a closed ticket. Please create a new ticket.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when ticket.group.follow_up_possible = "yes"' do
|
||||||
|
before { ticket.group.update(follow_up_possible: 'yes') }
|
||||||
|
|
||||||
|
context 'as admin', authenticated_as: :admin do
|
||||||
|
include_examples 'successfully reopen a ticket'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as agent', authenticated_as: :agent do
|
||||||
|
include_examples 'successfully reopen a ticket'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as customer', authenticated_as: :customer do
|
||||||
|
include_examples 'successfully reopen a ticket'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when ticket.group.follow_up_possible = "new_ticket"' do
|
||||||
|
before { ticket.group.update(follow_up_possible: 'new_ticket') }
|
||||||
|
|
||||||
|
context 'as admin', authenticated_as: :admin do
|
||||||
|
include_examples 'successfully reopen a ticket'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as agent', authenticated_as: :agent do
|
||||||
|
include_examples 'successfully reopen a ticket'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as customer', authenticated_as: :customer do
|
||||||
|
include_examples 'fail to reopen a ticket'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -132,4 +132,17 @@ RSpec.configure do |config|
|
||||||
config.before(:each, type: :request) do
|
config.before(:each, type: :request) do
|
||||||
Setting.set('system_init_done', true)
|
Setting.set('system_init_done', true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This helper allows you to authenticate as a given user in request specs
|
||||||
|
# via the example metadata, rather than directly:
|
||||||
|
#
|
||||||
|
# it 'does something', authenticated_as: :user
|
||||||
|
#
|
||||||
|
# In order for this to work, you must define the user in a `let` block first:
|
||||||
|
#
|
||||||
|
# let(:user) { create(:customer_user) }
|
||||||
|
#
|
||||||
|
config.before(:each, :authenticated_as) do |example|
|
||||||
|
authenticated_as(send(example.metadata[:authenticated_as]))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue