Merge branch 'develop' into private-te-refactoring-constantize
This commit is contained in:
commit
87c3163e46
12 changed files with 117 additions and 43 deletions
|
@ -23,17 +23,26 @@ class App.TicketMerge extends App.ControllerModal
|
||||||
@render()
|
@render()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
onShown: (e) =>
|
||||||
|
super
|
||||||
|
later = =>
|
||||||
|
if @tableCustomerTickets
|
||||||
|
@tableCustomerTickets.show()
|
||||||
|
if @tableRecentViewedTickets
|
||||||
|
@tableRecentViewedTickets.show()
|
||||||
|
@delay(later, 300)
|
||||||
|
|
||||||
content: =>
|
content: =>
|
||||||
content = $( App.view('agent_ticket_merge')() )
|
content = $( App.view('agent_ticket_merge')() )
|
||||||
|
|
||||||
new App.TicketList(
|
@tableCustomerTickets = new App.TicketList(
|
||||||
tableId: 'ticket-merge-customer-tickets'
|
tableId: 'ticket-merge-customer-tickets'
|
||||||
el: content.find('#ticket-merge-customer-tickets')
|
el: content.find('#ticket-merge-customer-tickets')
|
||||||
ticket_ids: @ticket_ids_by_customer
|
ticket_ids: @ticket_ids_by_customer
|
||||||
radio: true
|
radio: true
|
||||||
)
|
)
|
||||||
|
|
||||||
new App.TicketList(
|
@tableRecentViewedTickets = new App.TicketList(
|
||||||
tableId: 'ticket-merge-recent-tickets'
|
tableId: 'ticket-merge-recent-tickets'
|
||||||
el: content.find('#ticket-merge-recent-tickets')
|
el: content.find('#ticket-merge-recent-tickets')
|
||||||
ticket_ids: @ticket_ids_recent_viewed
|
ticket_ids: @ticket_ids_recent_viewed
|
||||||
|
|
|
@ -145,7 +145,9 @@ get assets of object list
|
||||||
def assets_of_object_list(list, assets = {})
|
def assets_of_object_list(list, assets = {})
|
||||||
list.each do |item|
|
list.each do |item|
|
||||||
require_dependency item['object'].to_filename
|
require_dependency item['object'].to_filename
|
||||||
record = item['object'].constantize.find(item['o_id'])
|
record = item['object'].constantize.lookup(id: item['o_id'])
|
||||||
|
next if record.blank?
|
||||||
|
|
||||||
assets = record.assets(assets)
|
assets = record.assets(assets)
|
||||||
if item['created_by_id'].present?
|
if item['created_by_id'].present?
|
||||||
user = User.find(item['created_by_id'])
|
user = User.find(item['created_by_id'])
|
||||||
|
|
|
@ -145,11 +145,12 @@ example
|
||||||
end
|
end
|
||||||
|
|
||||||
# check how many content messages we have, for notice used
|
# check how many content messages we have, for notice used
|
||||||
header = message_meta['RFC822.HEADER']
|
headers = parse_headers(message_meta['RFC822.HEADER'])
|
||||||
if header && header !~ /x-zammad-ignore/i
|
next if messages_is_verify_message?(headers)
|
||||||
content_messages += 1
|
next if messages_is_ignore_message?(headers)
|
||||||
break if content_max_check < content_messages
|
|
||||||
end
|
content_messages += 1
|
||||||
|
break if content_max_check < content_messages
|
||||||
end
|
end
|
||||||
if content_messages >= content_max_check
|
if content_messages >= content_max_check
|
||||||
content_messages = message_ids.count
|
content_messages = message_ids.count
|
||||||
|
@ -207,9 +208,12 @@ example
|
||||||
|
|
||||||
message_meta = nil
|
message_meta = nil
|
||||||
timeout(1.minute) do
|
timeout(1.minute) do
|
||||||
message_meta = @imap.fetch(message_id, ['RFC822.SIZE', 'ENVELOPE', 'FLAGS', 'INTERNALDATE'])[0]
|
message_meta = @imap.fetch(message_id, ['RFC822.SIZE', 'ENVELOPE', 'FLAGS', 'INTERNALDATE', 'RFC822.HEADER'])[0]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# ignore verify messages
|
||||||
|
next if !messages_is_too_old_verify?(message_meta, count, count_all)
|
||||||
|
|
||||||
# ignore to big messages
|
# ignore to big messages
|
||||||
info = too_big?(message_meta, count, count_all)
|
info = too_big?(message_meta, count, count_all)
|
||||||
if info
|
if info
|
||||||
|
@ -283,6 +287,50 @@ returns
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def messages_is_too_old_verify?(message_meta, count, count_all)
|
||||||
|
headers = parse_headers(message_meta.attr['RFC822.HEADER'])
|
||||||
|
return true if !messages_is_verify_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Verify-Time'].blank?
|
||||||
|
|
||||||
|
begin
|
||||||
|
verify_time = Time.zone.parse(headers['X-Zammad-Verify-Time'])
|
||||||
|
rescue => e
|
||||||
|
Rails.logger.error e
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return true if verify_time < Time.zone.now - 30.minutes
|
||||||
|
|
||||||
|
Rails.logger.info " - ignore message #{count}/#{count_all} - because message has a verify message"
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def messages_is_verify_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Verify'] == 'true'
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def messages_is_ignore_message?(headers)
|
||||||
|
return true if headers['X-Zammad-Ignore'] == 'true'
|
||||||
|
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_headers(string)
|
||||||
|
return {} if string.blank?
|
||||||
|
|
||||||
|
headers = {}
|
||||||
|
headers_pairs = string.split("\r\n")
|
||||||
|
headers_pairs.each do |pair|
|
||||||
|
key_value = pair.split(': ')
|
||||||
|
next if key_value[0].blank?
|
||||||
|
|
||||||
|
headers[key_value[0]] = key_value[1]
|
||||||
|
end
|
||||||
|
headers
|
||||||
|
end
|
||||||
|
|
||||||
# rubocop:disable Metrics/ParameterLists
|
# rubocop:disable Metrics/ParameterLists
|
||||||
def already_imported?(message_id, message_meta, count, count_all, keep_on_server, channel)
|
def already_imported?(message_id, message_meta, count, count_all, keep_on_server, channel)
|
||||||
# rubocop:enable Metrics/ParameterLists
|
# rubocop:enable Metrics/ParameterLists
|
||||||
|
|
|
@ -91,7 +91,7 @@ returns
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
# check how many content messages we have, for notice used
|
# check how many content messages we have, for notice used
|
||||||
if !mail.match?(/x-zammad-ignore/i)
|
if !mail.match?(/(X-Zammad-Ignore: true|X-Zammad-Verify: true)/)
|
||||||
content_messages += 1
|
content_messages += 1
|
||||||
break if content_max_check < content_messages
|
break if content_max_check < content_messages
|
||||||
end
|
end
|
||||||
|
@ -112,7 +112,7 @@ returns
|
||||||
mails.reverse!
|
mails.reverse!
|
||||||
|
|
||||||
# check for verify message
|
# check for verify message
|
||||||
mails.each do |m|
|
mails.first(2000).each do |m|
|
||||||
mail = m.pop
|
mail = m.pop
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
|
@ -137,12 +137,28 @@ returns
|
||||||
count = 0
|
count = 0
|
||||||
count_fetched = 0
|
count_fetched = 0
|
||||||
notice = ''
|
notice = ''
|
||||||
mails.each do |m|
|
mails.first(2000).each do |m|
|
||||||
count += 1
|
count += 1
|
||||||
Rails.logger.info " - message #{count}/#{count_all}"
|
Rails.logger.info " - message #{count}/#{count_all}"
|
||||||
mail = m.pop
|
mail = m.pop
|
||||||
next if !mail
|
next if !mail
|
||||||
|
|
||||||
|
# ignore verify messages
|
||||||
|
if mail.match?(/(X-Zammad-Ignore: true|X-Zammad-Verify: true)/)
|
||||||
|
if mail =~ /X-Zammad-Verify-Time:\s(.+?)\s/
|
||||||
|
begin
|
||||||
|
verify_time = Time.zone.parse($1)
|
||||||
|
if verify_time > Time.zone.now - 30.minutes
|
||||||
|
info = " - ignore message #{count}/#{count_all} - because it's a verify message"
|
||||||
|
Rails.logger.info info
|
||||||
|
next
|
||||||
|
end
|
||||||
|
rescue => e
|
||||||
|
Rails.logger.error e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# ignore to big messages
|
# ignore to big messages
|
||||||
max_message_size = Setting.get('postmaster_max_size').to_f
|
max_message_size = Setting.get('postmaster_max_size').to_f
|
||||||
real_message_size = mail.size.to_f / 1024 / 1024
|
real_message_size = mail.size.to_f / 1024 / 1024
|
||||||
|
|
|
@ -308,10 +308,13 @@ returns on fail
|
||||||
body: "This is a Test Email of Zammad to verify if Zammad can send emails to an external address.\n\nIf you see this email, you can ignore and delete it.",
|
body: "This is a Test Email of Zammad to verify if Zammad can send emails to an external address.\n\nIf you see this email, you can ignore and delete it.",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
if subject
|
if subject.present?
|
||||||
mail['X-Zammad-Test-Message'] = subject
|
mail['X-Zammad-Test-Message'] = subject
|
||||||
end
|
end
|
||||||
mail['X-Zammad-Ignore'] = 'true'
|
mail['X-Zammad-Ignore'] = 'true'
|
||||||
|
mail['X-Zammad-Fqdn'] = Setting.get('fqdn')
|
||||||
|
mail['X-Zammad-Verify'] = 'true'
|
||||||
|
mail['X-Zammad-Verify-Time'] = Time.zone.now.iso8601
|
||||||
mail['X-Loop'] = 'yes'
|
mail['X-Loop'] = 'yes'
|
||||||
mail['Precedence'] = 'bulk'
|
mail['Precedence'] = 'bulk'
|
||||||
mail['Auto-Submitted'] = 'auto-generated'
|
mail['Auto-Submitted'] = 'auto-generated'
|
||||||
|
|
|
@ -109,16 +109,17 @@ module CommonActions
|
||||||
route = Regexp.new(Regexp.quote("/##{route}"))
|
route = Regexp.new(Regexp.quote("/##{route}"))
|
||||||
end
|
end
|
||||||
|
|
||||||
options.reverse_merge!(wait: 0, url: true)
|
# wait 1 sec by default because Firefox is slow
|
||||||
|
options.reverse_merge!(wait: 1, url: true)
|
||||||
|
|
||||||
have_current_path("/##{route}", **options)
|
have_current_path(route, **options)
|
||||||
end
|
end
|
||||||
|
|
||||||
# This is a convenient wrapper method around #have_current_route
|
# This is a convenient wrapper method around #have_current_route
|
||||||
# which requires no previous `expect(page).to ` call.
|
# which requires no previous `expect(page).to ` call.
|
||||||
#
|
#
|
||||||
# @example
|
# @example
|
||||||
# expect_current_routes('login')
|
# expect_current_route('login')
|
||||||
# => checks for SPA route '/#login'
|
# => checks for SPA route '/#login'
|
||||||
#
|
#
|
||||||
def expect_current_route(route, **options)
|
def expect_current_route(route, **options)
|
||||||
|
|
|
@ -8,11 +8,11 @@ RSpec.describe 'Authentication', type: :system do
|
||||||
password: 'test',
|
password: 'test',
|
||||||
)
|
)
|
||||||
|
|
||||||
have_current_route 'dashboard'
|
expect_current_route 'dashboard'
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Logout' do
|
scenario 'Logout' do
|
||||||
logout
|
logout
|
||||||
have_current_route 'login', wait: 2
|
expect_current_route 'login', wait: 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,21 +4,21 @@ RSpec.describe 'Unauthenticated redirect', type: :system, authenticated: false d
|
||||||
|
|
||||||
scenario 'Sessions' do
|
scenario 'Sessions' do
|
||||||
visit 'system/sessions'
|
visit 'system/sessions'
|
||||||
have_current_route 'login'
|
expect_current_route 'login'
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Profile' do
|
scenario 'Profile' do
|
||||||
visit 'profile/linked'
|
visit 'profile/linked'
|
||||||
have_current_route 'login'
|
expect_current_route 'login'
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Ticket' do
|
scenario 'Ticket' do
|
||||||
visit 'ticket/zoom/1'
|
visit 'ticket/zoom/1'
|
||||||
have_current_route 'login'
|
expect_current_route 'login'
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Not existing route' do
|
scenario 'Not existing route' do
|
||||||
visit 'not_existing'
|
visit 'not_existing'
|
||||||
have_current_route 'not_existing'
|
expect_current_route 'not_existing'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,7 +13,7 @@ RSpec.describe 'Mail accounts', type: :system do
|
||||||
# wait for verification process to finish
|
# wait for verification process to finish
|
||||||
expect(page).to have_css('.js-agent h2', text: 'Invite Colleagues', wait: 4.minutes)
|
expect(page).to have_css('.js-agent h2', text: 'Invite Colleagues', wait: 4.minutes)
|
||||||
|
|
||||||
have_current_route 'getting_started/agents'
|
expect_current_route 'getting_started/agents'
|
||||||
end
|
end
|
||||||
|
|
||||||
def fill_in_credentials(account)
|
def fill_in_credentials(account)
|
||||||
|
|
|
@ -54,12 +54,12 @@ RSpec.describe 'System setup process', type: :system, set_up: false do
|
||||||
|
|
||||||
# configure Email Notification
|
# configure Email Notification
|
||||||
expect(page).to have_css('.js-outbound h2', text: 'Email Notification')
|
expect(page).to have_css('.js-outbound h2', text: 'Email Notification')
|
||||||
have_current_route 'getting_started/email_notification'
|
expect_current_route 'getting_started/email_notification'
|
||||||
click_on('Continue')
|
click_on('Continue')
|
||||||
|
|
||||||
# create email account
|
# create email account
|
||||||
expect(page).to have_css('.js-channel h2', text: 'Connect Channels')
|
expect(page).to have_css('.js-channel h2', text: 'Connect Channels')
|
||||||
have_current_route 'getting_started/channel'
|
expect_current_route 'getting_started/channel'
|
||||||
click('.js-channel .btn.email')
|
click('.js-channel .btn.email')
|
||||||
|
|
||||||
within('.js-intro') do
|
within('.js-intro') do
|
||||||
|
@ -75,7 +75,7 @@ RSpec.describe 'System setup process', type: :system, set_up: false do
|
||||||
|
|
||||||
# wait for verification process to finish
|
# wait for verification process to finish
|
||||||
expect(page).to have_css('.js-agent h2', text: 'Invite Colleagues', wait: 2.minutes)
|
expect(page).to have_css('.js-agent h2', text: 'Invite Colleagues', wait: 2.minutes)
|
||||||
have_current_route 'getting_started/agents'
|
expect_current_route 'getting_started/agents'
|
||||||
|
|
||||||
# invite agent1
|
# invite agent1
|
||||||
within('.js-agent') do
|
within('.js-agent') do
|
||||||
|
@ -88,14 +88,14 @@ RSpec.describe 'System setup process', type: :system, set_up: false do
|
||||||
expect(page).to have_css('body', text: 'Invitation sent!')
|
expect(page).to have_css('body', text: 'Invitation sent!')
|
||||||
|
|
||||||
# expect to still be on the same page
|
# expect to still be on the same page
|
||||||
have_current_route 'getting_started/agents'
|
expect_current_route 'getting_started/agents'
|
||||||
within('.js-agent') do
|
within('.js-agent') do
|
||||||
click_on('Continue')
|
click_on('Continue')
|
||||||
end
|
end
|
||||||
|
|
||||||
# expect Dashboard of a fresh system
|
# expect Dashboard of a fresh system
|
||||||
expect(page).to have_css('body', text: 'My Stats')
|
expect(page).to have_css('body', text: 'My Stats')
|
||||||
have_current_route 'clues'
|
expect_current_route 'clues'
|
||||||
find(:clues_close, wait: 4).in_fixed_postion.click
|
find(:clues_close, wait: 4).in_fixed_postion.click
|
||||||
|
|
||||||
# verify organization and fqdn
|
# verify organization and fqdn
|
||||||
|
|
|
@ -103,6 +103,9 @@ class AgentTicketTagTest < TestCase
|
||||||
browser: browser2,
|
browser: browser2,
|
||||||
number: ticket3[:number],
|
number: ticket3[:number],
|
||||||
)
|
)
|
||||||
|
empty_search(
|
||||||
|
browser: browser2,
|
||||||
|
)
|
||||||
|
|
||||||
# set tag #1
|
# set tag #1
|
||||||
click(
|
click(
|
||||||
|
@ -272,6 +275,9 @@ class AgentTicketTagTest < TestCase
|
||||||
browser: browser2,
|
browser: browser2,
|
||||||
number: ticket3[:number],
|
number: ticket3[:number],
|
||||||
)
|
)
|
||||||
|
empty_search(
|
||||||
|
browser: browser2,
|
||||||
|
)
|
||||||
|
|
||||||
# verify tags
|
# verify tags
|
||||||
tags_verify(
|
tags_verify(
|
||||||
|
|
|
@ -2238,10 +2238,8 @@ wait untill text in selector disabppears
|
||||||
css: '.content.active .newTicket button.js-submit',
|
css: '.content.active .newTicket button.js-submit',
|
||||||
mute_log: true,
|
mute_log: true,
|
||||||
)
|
)
|
||||||
screenshot(browser: instance, comment: 'ticket_create_after_submit_1')
|
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
screenshot(browser: instance, comment: 'ticket_create_after_submit_2')
|
|
||||||
9.times do
|
9.times do
|
||||||
if instance.current_url.match?(/#{Regexp.quote('#ticket/zoom/')}/)
|
if instance.current_url.match?(/#{Regexp.quote('#ticket/zoom/')}/)
|
||||||
assert(true, 'ticket created')
|
assert(true, 'ticket created')
|
||||||
|
@ -2721,18 +2719,9 @@ wait untill text in selector disabppears
|
||||||
element.send_keys(params[:number])
|
element.send_keys(params[:number])
|
||||||
sleep 3
|
sleep 3
|
||||||
|
|
||||||
empty_search(browser: instance)
|
|
||||||
|
|
||||||
# search by number again
|
|
||||||
element = instance.find_elements(css: '#global-search')[0]
|
|
||||||
element.click
|
|
||||||
element.clear
|
|
||||||
element.send_keys(params[:number])
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
# open ticket
|
# open ticket
|
||||||
#instance.find_element(partial_link_text: params[:number] } ).click
|
#instance.find_element(partial_link_text: params[:number] } ).click
|
||||||
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:number]}') .nav-tab-icon\").first().click()")
|
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:number]}') .nav-tab-name\").first().click()")
|
||||||
watch_for(
|
watch_for(
|
||||||
browser: instance,
|
browser: instance,
|
||||||
css: '.content.active .ticketZoom-header .ticket-number'
|
css: '.content.active .ticketZoom-header .ticket-number'
|
||||||
|
@ -2769,7 +2758,7 @@ wait untill text in selector disabppears
|
||||||
|
|
||||||
# open ticket
|
# open ticket
|
||||||
#instance.find_element(partial_link_text: params[:title] } ).click
|
#instance.find_element(partial_link_text: params[:title] } ).click
|
||||||
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:title]}') .nav-tab-icon\").click()")
|
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:title]}') .nav-tab-name\").first().click()")
|
||||||
sleep 1
|
sleep 1
|
||||||
title = instance.find_elements(css: '.content.active .ticketZoom-header .js-objectTitle')[0].text
|
title = instance.find_elements(css: '.content.active .ticketZoom-header .js-objectTitle')[0].text
|
||||||
if !title.match?(/#{params[:title]}/)
|
if !title.match?(/#{params[:title]}/)
|
||||||
|
@ -2856,7 +2845,7 @@ wait untill text in selector disabppears
|
||||||
element.send_keys(params[:value])
|
element.send_keys(params[:value])
|
||||||
sleep 2
|
sleep 2
|
||||||
#instance.find_element(partial_link_text: params[:value] } ).click
|
#instance.find_element(partial_link_text: params[:value] } ).click
|
||||||
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-icon\").click()")
|
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-name\").first().click()")
|
||||||
watch_for(
|
watch_for(
|
||||||
browser: instance,
|
browser: instance,
|
||||||
css: '.content.active h1'
|
css: '.content.active h1'
|
||||||
|
@ -2892,7 +2881,7 @@ wait untill text in selector disabppears
|
||||||
sleep 3
|
sleep 3
|
||||||
|
|
||||||
#instance.find_element(partial_link_text: params[:value]).click
|
#instance.find_element(partial_link_text: params[:value]).click
|
||||||
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-icon\").click()")
|
instance.execute_script("$(\".js-global-search-result a:contains('#{params[:value]}') .nav-tab-name\").first().click()")
|
||||||
watch_for(
|
watch_for(
|
||||||
browser: instance,
|
browser: instance,
|
||||||
css: '.content.active h1'
|
css: '.content.active h1'
|
||||||
|
|
Loading…
Reference in a new issue