2019-11-26 15:22:04 +00:00
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
RSpec.describe 'Ticket zoom', type: :system do
|
|
|
|
|
|
|
|
describe 'owner auto-assignment' do
|
|
|
|
let!(:ticket) { create(:ticket, group: Group.find_by(name: 'Users'), state: Ticket::State.find_by(name: 'new')) }
|
|
|
|
let!(:session_user) { User.find_by(login: 'master@example.com') }
|
|
|
|
|
|
|
|
context 'for agent disabled' do
|
|
|
|
before do
|
|
|
|
Setting.set('ticket_auto_assignment', false)
|
|
|
|
Setting.set('ticket_auto_assignment_selector', { condition: { 'ticket.state_id' => { operator: 'is', value: Ticket::State.by_category(:work_on).pluck(:id) } } })
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', [])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'do not assign ticket to current session user' do
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: '-',
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'for agent enabled' do
|
|
|
|
before do
|
|
|
|
Setting.set('ticket_auto_assignment', true)
|
|
|
|
Setting.set('ticket_auto_assignment_selector', { condition: { 'ticket.state_id' => { operator: 'is', value: Ticket::State.by_category(:work_on).pluck(:id) } } })
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with empty "ticket_auto_assignment_user_ids_ignore"' do
|
|
|
|
it 'assigns ticket to current session user' do
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('.content.active select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: session_user.fullname,
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with "ticket_auto_assignment_user_ids_ignore" (as integer)' do
|
|
|
|
it 'assigns ticket not to current session user' do
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', session_user.id)
|
|
|
|
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: '-',
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with "ticket_auto_assignment_user_ids_ignore" (as string)' do
|
|
|
|
it 'assigns ticket not to current session user' do
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', session_user.id.to_s)
|
|
|
|
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: '-',
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with "ticket_auto_assignment_user_ids_ignore" (as [integer])' do
|
|
|
|
it 'assigns ticket not to current session user' do
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', [session_user.id])
|
|
|
|
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: '-',
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with "ticket_auto_assignment_user_ids_ignore" (as [string])' do
|
|
|
|
it 'assigns ticket not to current session user' do
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', [session_user.id.to_s])
|
|
|
|
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: '-',
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with "ticket_auto_assignment_user_ids_ignore" and other user ids' do
|
|
|
|
it 'assigns ticket to current session user' do
|
|
|
|
Setting.set('ticket_auto_assignment_user_ids_ignore', [99_999, 999_999])
|
|
|
|
|
|
|
|
refresh
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
expect(page).to have_css('select[name=owner_id]')
|
|
|
|
expect(page).to have_select('owner_id',
|
|
|
|
selected: session_user.fullname,
|
|
|
|
options: ['-', 'Agent 1 Test', 'Test Master Agent'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-01-10 12:01:33 +00:00
|
|
|
context 'when ticket has an attachment' do
|
|
|
|
|
|
|
|
let(:group) { Group.find_by(name: 'Users') }
|
|
|
|
let(:ticket) { create(:ticket, group: group) }
|
|
|
|
let(:article) { create(:ticket_article, ticket: ticket) }
|
|
|
|
let(:attachment_name) { 'some_file.txt' }
|
|
|
|
|
|
|
|
before do
|
|
|
|
Store.add(
|
|
|
|
object: 'Ticket::Article',
|
|
|
|
o_id: article.id,
|
|
|
|
data: 'some content',
|
|
|
|
filename: attachment_name,
|
|
|
|
preferences: {
|
|
|
|
'Content-Type' => 'text/plain',
|
|
|
|
},
|
|
|
|
created_by_id: 1,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'article was already forwarded once' do
|
|
|
|
before do
|
|
|
|
visit "#ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
find('a[data-type=emailForward]').click
|
|
|
|
|
|
|
|
click('.js-reset')
|
|
|
|
have_no_css('.js-reset')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'adds attachments when forwarding multiple times' do
|
|
|
|
|
|
|
|
within(:active_content) do
|
|
|
|
find('a[data-type=emailForward]').click
|
|
|
|
end
|
|
|
|
|
|
|
|
within('.js-writeArea') do
|
|
|
|
expect(page).to have_text attachment_name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-04-27 13:40:28 +00:00
|
|
|
|
|
|
|
context 'replying' do
|
|
|
|
|
|
|
|
context 'Group without signature' do
|
|
|
|
|
|
|
|
let(:ticket) { create(:ticket) }
|
|
|
|
let(:current_user) { create(:agent_user, password: 'test', groups: [ticket.group]) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
# initial article to reply to
|
|
|
|
create(:ticket_article, ticket: ticket)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'ensures that text input opens on multiple replies', authenticated: -> { current_user } do
|
|
|
|
visit "ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
2.times do |article_offset|
|
|
|
|
articles_existing = 1
|
|
|
|
articles_expected = articles_existing + (article_offset + 1)
|
|
|
|
|
|
|
|
all('a[data-type=emailReply]').last.click
|
|
|
|
|
|
|
|
# wait till input box expands completely
|
|
|
|
find('.attachmentPlaceholder-label').in_fixed_postion
|
|
|
|
expect(page).not_to have_css('.attachmentPlaceholder-hint', wait: 0)
|
|
|
|
|
|
|
|
find('.articleNewEdit-body').send_keys('Some reply')
|
|
|
|
click '.js-submit'
|
|
|
|
|
|
|
|
expect(page).to have_css('.ticket-article-item', count: articles_expected)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-04-13 18:24:03 +00:00
|
|
|
|
|
|
|
describe 'delete article', authenticated: -> { user } do
|
|
|
|
let(:admin_user) { User.find_by! email: 'master@example.com' }
|
|
|
|
let(:agent_user) { create :agent, password: 'test', groups: [Group.first] }
|
|
|
|
let(:customer_user) { create :customer, password: 'test' }
|
|
|
|
let(:ticket) { create :ticket, group: agent_user.groups.first, customer: customer_user }
|
|
|
|
let(:article) { send(item) }
|
|
|
|
|
|
|
|
def article_communication
|
|
|
|
create_ticket_article(sender_name: 'Agent', internal: false, type_name: 'email', updated_by: customer_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def article_note
|
|
|
|
create_ticket_article(sender_name: 'Agent', internal: true, type_name: 'note', updated_by: agent_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def article_note_customer
|
|
|
|
create_ticket_article(sender_name: 'Customer', internal: false, type_name: 'note', updated_by: customer_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def article_note_communication
|
|
|
|
create(:ticket_article_type, name: 'note_communication', communication: true)
|
|
|
|
|
|
|
|
create_ticket_article(sender_name: 'Agent', internal: true, type_name: 'note_communication', updated_by: agent_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_ticket_article(sender_name:, internal:, type_name:, updated_by:)
|
|
|
|
create(:ticket_article,
|
|
|
|
sender_name: sender_name, internal: internal, type_name: type_name, ticket: ticket,
|
|
|
|
body: "to be deleted #{offset} #{item}",
|
|
|
|
updated_by_id: updated_by.id, created_by_id: updated_by.id,
|
|
|
|
created_at: offset.ago, updated_at: offset.ago)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'going through full stack' do
|
|
|
|
context 'as admin' do
|
|
|
|
let(:user) { admin_user }
|
|
|
|
let(:item) { 'article_communication' }
|
|
|
|
let(:offset) { 0.minutes }
|
|
|
|
|
|
|
|
it 'succeeds' do
|
|
|
|
refresh # make sure user roles are loaded
|
|
|
|
|
|
|
|
ensure_websocket do
|
|
|
|
visit "ticket/zoom/#{ticket.id}"
|
|
|
|
end
|
|
|
|
|
|
|
|
within :active_ticket_article, article, wait: 15 do
|
|
|
|
click '.js-ArticleAction[data-type=delete]'
|
|
|
|
end
|
|
|
|
|
|
|
|
in_modal do
|
|
|
|
click '.js-submit'
|
|
|
|
end
|
|
|
|
|
|
|
|
wait.until_disappears { find :active_ticket_article, article, wait: false }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'verifying permissions matrix' do
|
|
|
|
shared_examples 'according to permission matrix' do |item:, expects_visible:, offset:, description:|
|
|
|
|
context "looking at #{description} #{item}" do
|
|
|
|
let(:item) { item }
|
|
|
|
let!(:article) { send(item) }
|
|
|
|
|
|
|
|
let(:offset) { offset }
|
|
|
|
let(:matcher) { expects_visible ? :have_css : :have_no_css }
|
|
|
|
|
|
|
|
it expects_visible ? 'delete button is visible' : 'delete button is not visible' do
|
|
|
|
refresh # make sure user roles are loaded
|
|
|
|
|
|
|
|
visit "ticket/zoom/#{ticket.id}"
|
|
|
|
|
|
|
|
within :active_ticket_article, article, wait: 15 do
|
|
|
|
expect(page).to send(matcher, '.js-ArticleAction[data-type=delete]', wait: 0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'deleting ticket article' do |item:, now:, later:, much_later:|
|
|
|
|
include_examples 'according to permission matrix', item: item, expects_visible: now, offset: 0.minutes, description: 'just created'
|
|
|
|
include_examples 'according to permission matrix', item: item, expects_visible: later, offset: 6.minutes, description: 'few minutes old'
|
|
|
|
include_examples 'according to permission matrix', item: item, expects_visible: much_later, offset: 11.minutes, description: 'very old'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'as admin' do
|
|
|
|
let(:user) { admin_user }
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_communication',
|
|
|
|
now: true, later: true, much_later: true
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note',
|
|
|
|
now: true, later: true, much_later: true
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note_customer',
|
|
|
|
now: true, later: true, much_later: true
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note_communication',
|
|
|
|
now: true, later: true, much_later: true
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'as agent' do
|
|
|
|
let(:user) { agent_user }
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_communication',
|
|
|
|
now: false, later: false, much_later: false
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note',
|
|
|
|
now: true, later: true, much_later: false
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note_customer',
|
|
|
|
now: false, later: false, much_later: false
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note_communication',
|
|
|
|
now: true, later: true, much_later: false
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'as customer' do
|
|
|
|
let(:user) { customer_user }
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_communication',
|
|
|
|
now: false, later: false, much_later: false
|
|
|
|
|
|
|
|
include_examples 'deleting ticket article',
|
|
|
|
item: 'article_note_customer',
|
|
|
|
now: false, later: false, much_later: false
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2019-11-26 15:22:04 +00:00
|
|
|
end
|