Merge branch 'develop' of git.znuny.com:zammad/zammad into develop
This commit is contained in:
commit
525086d09c
28 changed files with 246 additions and 246 deletions
|
@ -302,7 +302,7 @@ test:integration:otrs_6_mysql:
|
|||
- mysql
|
||||
script:
|
||||
- export RAILS_ENV=test
|
||||
- export IMPORT_OTRS_ENDPOINT="http://vz1185.test.znuny.com/otrs/public.pl?Action=ZammadMigrator"
|
||||
- export IMPORT_OTRS_ENDPOINT="https://vz1185.test.znuny.com/otrs/public.pl?Action=ZammadMigrator"
|
||||
- rake db:create
|
||||
- rake db:migrate
|
||||
- ruby -I test/ test/integration/otrs_import_test.rb
|
||||
|
@ -315,7 +315,7 @@ test:integration:otrs_6_postgresql:
|
|||
- postgresql
|
||||
script:
|
||||
- export RAILS_ENV=test
|
||||
- export IMPORT_OTRS_ENDPOINT="http://vz1185.test.znuny.com/otrs/public.pl?Action=ZammadMigrator"
|
||||
- export IMPORT_OTRS_ENDPOINT="https://vz1185.test.znuny.com/otrs/public.pl?Action=ZammadMigrator"
|
||||
- rake db:create
|
||||
- rake db:migrate
|
||||
- ruby -I test/ test/integration/otrs_import_test.rb
|
||||
|
|
|
@ -17,8 +17,9 @@ RSpec.describe Sessions::Backend::ActivityStream do
|
|||
end
|
||||
|
||||
it 'manages race condition' do
|
||||
Thread.new { associated_tickets.each(&:destroy) }
|
||||
thread = Thread.new { associated_tickets.each(&:destroy) }
|
||||
expect { subject.load }.not_to raise_error
|
||||
thread.join
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -691,6 +691,25 @@ RSpec.describe User do
|
|||
end
|
||||
end
|
||||
|
||||
context 'falsely added on update (change: [nil, ""])' do
|
||||
let(:orig_number) { nil }
|
||||
let(:new_number) { '' }
|
||||
|
||||
before { subject } # create user
|
||||
|
||||
it 'does not attempt to update CallerId record' do
|
||||
allow(Cti::CallerId).to receive(:build).with(any_args)
|
||||
|
||||
expect(Cti::CallerId.where(object: 'User', o_id: subject.id).count)
|
||||
.to eq(0)
|
||||
|
||||
expect { subject.update(phone: new_number) }
|
||||
.to change { Cti::CallerId.where(object: 'User', o_id: subject.id).count }.by(0)
|
||||
|
||||
expect(Cti::CallerId).not_to have_received(:build)
|
||||
end
|
||||
end
|
||||
|
||||
context 'removed on update' do
|
||||
let(:orig_number) { '1234567890' }
|
||||
let(:new_number) { nil }
|
||||
|
|
|
@ -94,24 +94,11 @@ class AdminOverviewTest < TestCase
|
|||
}
|
||||
)
|
||||
|
||||
click(
|
||||
browser: instance,
|
||||
css: 'a[href="#ticket/view"]',
|
||||
mute_log: true,
|
||||
)
|
||||
click(
|
||||
browser: instance,
|
||||
css: "div.overview-header a[href='#ticket/view/#{name}']",
|
||||
mute_log: true,
|
||||
overview_open(
|
||||
name: name
|
||||
)
|
||||
|
||||
# Sort the tickets according to their onscreen Y location
|
||||
tickets_low_to_high = ticket_titles.map do |title|
|
||||
[title,
|
||||
get_location( css: "td[title='#{title}']").y]
|
||||
end
|
||||
tickets_low_to_high = tickets_low_to_high.sort_by { |x| -x[1] }.map { |x| x[0] }
|
||||
assert_equal(ticket_titles, tickets_low_to_high)
|
||||
assert_equal(ticket_titles.reverse, ordered_ticket_titles(ticket_titles))
|
||||
|
||||
# Update overview to sort groups from low to high
|
||||
overview_update(
|
||||
|
@ -121,23 +108,21 @@ class AdminOverviewTest < TestCase
|
|||
}
|
||||
)
|
||||
|
||||
click(
|
||||
browser: instance,
|
||||
css: 'a[href="#ticket/view"]',
|
||||
mute_log: true,
|
||||
)
|
||||
click(
|
||||
browser: instance,
|
||||
css: "div.overview-header a[href='#ticket/view/#{name}']",
|
||||
mute_log: true,
|
||||
overview_open(
|
||||
name: name
|
||||
)
|
||||
|
||||
# Sort the tickets according to their onscreen Y location
|
||||
tickets_high_to_low = ticket_titles.map do |title|
|
||||
# wait till the scheduler pushed
|
||||
# the changes to the FE
|
||||
sleep 5
|
||||
|
||||
assert_equal(ticket_titles, ordered_ticket_titles(ticket_titles))
|
||||
end
|
||||
|
||||
def ordered_ticket_titles(ticket_titles)
|
||||
ticket_titles.map do |title|
|
||||
[title,
|
||||
get_location( css: "td[title='#{title}']").y]
|
||||
end
|
||||
tickets_high_to_low = tickets_high_to_low.sort_by { |x| x[1] }.map { |x| x[0] }
|
||||
assert_equal(ticket_titles, tickets_high_to_low)
|
||||
end.sort_by { |x| x[1] }.map { |x| x[0] }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -47,10 +47,7 @@ class AgentOrganizationProfileTest < TestCase
|
|||
click(css: '.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.active .js-action [data-type="edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: note,
|
||||
|
@ -65,6 +62,7 @@ class AgentOrganizationProfileTest < TestCase
|
|||
value: 'some note abc',
|
||||
)
|
||||
click(css: '.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.active .profile-window',
|
||||
|
@ -80,15 +78,14 @@ class AgentOrganizationProfileTest < TestCase
|
|||
# change lastname back
|
||||
click(css: '.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.active .js-action [data-type="edit"]')
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="name"]',
|
||||
value: 'Zammad Foundation',
|
||||
)
|
||||
click(css: '.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
verify_task(
|
||||
data: {
|
||||
|
|
|
@ -162,15 +162,15 @@ class AgentTicketAttachmentTest < TestCase
|
|||
|
||||
# submit form
|
||||
click(css: '.content.active .js-submit')
|
||||
sleep 2
|
||||
|
||||
# check warning
|
||||
modal_ready()
|
||||
match(
|
||||
css: '.content.active .modal',
|
||||
value: 'missing',
|
||||
)
|
||||
click(css: '.content.active .modal .js-cancel')
|
||||
sleep 2
|
||||
modal_disappear()
|
||||
|
||||
ticket_update(
|
||||
data: {
|
||||
|
@ -259,7 +259,7 @@ class AgentTicketAttachmentTest < TestCase
|
|||
# modify customer
|
||||
click(browser: browser1, css: '.content.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
|
||||
click(browser: browser1, css: '.content.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
|
||||
sleep 2
|
||||
modal_ready(browser: browser1)
|
||||
set(browser: browser1, css: '.modal [name="address"]', value: 'some new address')
|
||||
click(browser: browser1, css: '.modal .js-submit')
|
||||
modal_disappear(browser: browser1)
|
||||
|
@ -279,7 +279,7 @@ class AgentTicketAttachmentTest < TestCase
|
|||
# change org of customer, check if org is shown in sidebar
|
||||
click(browser: browser1, css: '.content.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
|
||||
click(browser: browser1, css: '.content.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
|
||||
sleep 2
|
||||
modal_ready(browser: browser1)
|
||||
set(browser: browser1, css: '.modal .js-input', value: 'zammad')
|
||||
click(browser: browser1, css: '.modal .js-input')
|
||||
click(browser: browser1, css: '.modal .js-option')
|
||||
|
@ -329,7 +329,7 @@ class AgentTicketAttachmentTest < TestCase
|
|||
# First test the attachment uploading for new tickets
|
||||
file_upload(
|
||||
css: '.content.active .attachmentPlaceholder-inputHolder input',
|
||||
files: [Rails.root.join('test', 'data', 'upload', 'upload2.jpg')],
|
||||
files: [large_file],
|
||||
no_sleep: true,
|
||||
)
|
||||
exists(
|
||||
|
@ -337,6 +337,7 @@ class AgentTicketAttachmentTest < TestCase
|
|||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .js-submit:disabled',
|
||||
timeout: 4.minutes,
|
||||
)
|
||||
exists(
|
||||
css: '.content.active .js-submit',
|
||||
|
@ -355,7 +356,7 @@ class AgentTicketAttachmentTest < TestCase
|
|||
)
|
||||
file_upload(
|
||||
css: '.content.active .attachmentPlaceholder-inputHolder input',
|
||||
files: [Rails.root.join('test', 'data', 'upload', 'upload2.jpg')],
|
||||
files: [large_file],
|
||||
no_sleep: true,
|
||||
)
|
||||
exists(
|
||||
|
@ -363,6 +364,15 @@ class AgentTicketAttachmentTest < TestCase
|
|||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .js-submit:disabled',
|
||||
timeout: 4.minutes,
|
||||
)
|
||||
end
|
||||
|
||||
def large_file
|
||||
file = Tempfile.new
|
||||
file.binmode
|
||||
file.write(SecureRandom.random_bytes(6.megabyte))
|
||||
file.close
|
||||
file.path
|
||||
end
|
||||
end
|
||||
|
|
|
@ -177,9 +177,7 @@ class AgentTicketCreateResetCustomerSelectionTest < TestCase
|
|||
click(css: '.content.active .tabsSidebar .sidebar[data-tab="customer"] .js-actions')
|
||||
click(css: '.content.active .tabsSidebar .sidebar[data-tab="customer"] .js-actions li[data-type="customer-change"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
exists_not(
|
||||
css: '.content.active .modal .user_autocompletion.form-group.has-error',
|
||||
|
|
|
@ -46,7 +46,8 @@ class AgentTicketLinkTest < TestCase
|
|||
click(
|
||||
css: '.content.active .links .js-add',
|
||||
)
|
||||
sleep 2
|
||||
|
||||
modal_ready()
|
||||
|
||||
set(
|
||||
css: '.content.active .modal-body [name="ticket_number"]',
|
||||
|
|
|
@ -113,7 +113,10 @@ class AgentTicketMacroTest < TestCase
|
|||
|
||||
perform_macro(name: macro_name)
|
||||
|
||||
exists_not(css: '.tasks > a')
|
||||
watch_for_disappear(
|
||||
css: '.tasks > a',
|
||||
timeout: 5,
|
||||
)
|
||||
end
|
||||
|
||||
def test_ux_flow_next_up_advance_to_next_ticket_from_overview
|
||||
|
|
|
@ -58,11 +58,8 @@ class AgentTicketMergeTest < TestCase
|
|||
# merge tickets
|
||||
click( css: '.active div[data-tab="ticket"] .js-actions .icon-arrow-down' )
|
||||
click( css: '.active div[data-tab="ticket"] .js-actions [data-type="ticket-merge"]' )
|
||||
watch_for(
|
||||
css: '.modal',
|
||||
value: 'merge',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal input[name="master_ticket_number"]',
|
||||
value: ticket1[:number],
|
||||
|
@ -115,11 +112,8 @@ class AgentTicketMergeTest < TestCase
|
|||
# merge tickets
|
||||
click( css: '.active div[data-tab="ticket"] .js-actions .icon-arrow-down' )
|
||||
click( css: '.active div[data-tab="ticket"] .js-actions [data-type="ticket-merge"]' )
|
||||
watch_for(
|
||||
css: '.modal',
|
||||
value: 'merge',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal input[name="master_ticket_number"]',
|
||||
value: ticket3[:number],
|
||||
|
|
|
@ -96,10 +96,8 @@ class AgentTicketOverviewLevel0Test < TestCase
|
|||
# click options and enable number and article count
|
||||
click(css: '.content.active [data-type="settings"]')
|
||||
|
||||
watch_for(
|
||||
css: '.modal h1',
|
||||
value: 'Edit',
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
check(
|
||||
css: '.modal input[value="number"]',
|
||||
)
|
||||
|
@ -156,10 +154,8 @@ class AgentTicketOverviewLevel0Test < TestCase
|
|||
# disable number and article count
|
||||
click(css: '.content.active [data-type="settings"]')
|
||||
|
||||
watch_for(
|
||||
css: '.modal h1',
|
||||
value: 'Edit',
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
uncheck(
|
||||
css: '.modal input[value="number"]',
|
||||
)
|
||||
|
|
|
@ -254,7 +254,11 @@ class AgentTicketTagTest < TestCase
|
|||
browser: browser2,
|
||||
js: "$('.content.active .js-name:contains(\"tag3\")').click()",
|
||||
)
|
||||
sleep 2
|
||||
|
||||
modal_ready(
|
||||
browser: browser2,
|
||||
)
|
||||
|
||||
set(
|
||||
browser: browser2,
|
||||
css: '.modal [name="name"]',
|
||||
|
@ -308,7 +312,11 @@ class AgentTicketTagTest < TestCase
|
|||
browser: browser2,
|
||||
js: "$('.content.active .js-name:contains(\"tag5\")').closest('tr').find('.js-delete').click()",
|
||||
)
|
||||
sleep 2
|
||||
|
||||
modal_ready(
|
||||
browser: browser2,
|
||||
)
|
||||
|
||||
click(
|
||||
browser: browser2,
|
||||
css: '.modal .js-submit',
|
||||
|
|
|
@ -227,7 +227,8 @@ class AgentTicketTextModuleTest < TestCase
|
|||
browser: browser2,
|
||||
css: '.active div[data-tab="ticket"] .js-actions [data-type="customer-change"]',
|
||||
)
|
||||
sleep 1
|
||||
|
||||
modal_ready(browser: browser2)
|
||||
|
||||
ticket_customer_select(
|
||||
browser: browser2,
|
||||
|
@ -240,10 +241,7 @@ class AgentTicketTextModuleTest < TestCase
|
|||
css: '.modal-content .js-submit',
|
||||
)
|
||||
|
||||
watch_for_disappear(
|
||||
browser: browser2,
|
||||
css: '.modal',
|
||||
)
|
||||
modal_disappear(browser: browser2)
|
||||
|
||||
set(
|
||||
browser: browser2,
|
||||
|
|
|
@ -41,11 +41,7 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.active .js-submit',
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal [name=time_unit]',
|
||||
value: '4',
|
||||
|
@ -53,10 +49,8 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .js-timeUnit',
|
||||
value: '4',
|
||||
|
@ -80,11 +74,7 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.active .js-submit',
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal [name=time_unit]',
|
||||
value: '4,6',
|
||||
|
@ -92,10 +82,8 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .js-timeUnit',
|
||||
value: '4.6',
|
||||
|
@ -111,10 +99,7 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
css: '.active .js-submit',
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal [name=time_unit]',
|
||||
value: '4abc',
|
||||
|
@ -132,10 +117,7 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_disappear()
|
||||
watch_for(
|
||||
css: '.content.active .js-timeUnit',
|
||||
value: '8.6',
|
||||
|
@ -198,29 +180,18 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.active .js-submit',
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
# Click outside the modal to make it disappear
|
||||
execute(
|
||||
js: 'document.elementFromPoint(300, 100).click();',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
click(
|
||||
css: '.active .js-submit',
|
||||
)
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal [name=time_unit]',
|
||||
value: '4',
|
||||
|
@ -228,10 +199,7 @@ class AgentTicketTimeAccountingTest < TestCase
|
|||
click(
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
value: 'Time Accounting',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
# disable time accounting
|
||||
click(
|
||||
|
|
|
@ -52,18 +52,14 @@ class AgentTicketZoomHideTest < TestCase
|
|||
css: '.attachment-icon img',
|
||||
)
|
||||
|
||||
watch_for(
|
||||
css: 'body > .modal',
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
# Now go to a previous ticket and confirm that the modal disappears
|
||||
location(
|
||||
url: browser_url + '/#ticket/zoom/1',
|
||||
)
|
||||
sleep 2
|
||||
exists_not(
|
||||
css: 'body > .modal',
|
||||
)
|
||||
modal_disappear()
|
||||
end
|
||||
|
||||
def teardown
|
||||
|
|
|
@ -35,11 +35,7 @@ class AgentUserManageTest < TestCase
|
|||
sleep 0.5
|
||||
click(css: '.content.active .newTicket .recipientList-entry.js-objectNew')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
timeout: 1,
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal input[name="firstname"]',
|
||||
value: firstname,
|
||||
|
@ -54,6 +50,8 @@ class AgentUserManageTest < TestCase
|
|||
)
|
||||
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
sleep 4
|
||||
|
||||
# check is used to check selected
|
||||
|
@ -170,10 +168,7 @@ class AgentUserManageTest < TestCase
|
|||
click(css: '.content.active .tabsSidebar .sidebar[data-tab="customer"] .js-actions')
|
||||
click(css: '.content.active .tabsSidebar .sidebar[data-tab="customer"] .js-actions li[data-type="customer-change"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
click(css: '.content.active .modal [name="customer_id_completion"]')
|
||||
|
||||
# check if pulldown is open, it's not working stable via selenium
|
||||
|
@ -230,10 +225,7 @@ class AgentUserManageTest < TestCase
|
|||
)
|
||||
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .tabsSidebar .sidebar[data-tab="customer"]',
|
||||
|
|
|
@ -43,10 +43,7 @@ class AgentUserProfileTest < TestCase
|
|||
click(css: '.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.active .js-action [data-type="edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: 'some note 123',
|
||||
|
@ -61,6 +58,7 @@ class AgentUserProfileTest < TestCase
|
|||
value: 'some note abc',
|
||||
)
|
||||
click(css: '.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.active .profile-window',
|
||||
|
@ -76,15 +74,14 @@ class AgentUserProfileTest < TestCase
|
|||
# change lastname back
|
||||
click(css: '.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.active .js-action [data-type="edit"]')
|
||||
watch_for(
|
||||
css: '.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'Braun',
|
||||
)
|
||||
click(css: '.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
verify_task(
|
||||
data: {
|
||||
|
|
|
@ -462,6 +462,8 @@ class ChatTest < TestCase
|
|||
browser: agent,
|
||||
css: '.active .js-settings',
|
||||
)
|
||||
|
||||
modal_ready(browser: agent)
|
||||
set(
|
||||
browser: agent,
|
||||
css: '.modal [name="chat::phrase::1"]',
|
||||
|
|
|
@ -23,7 +23,9 @@ class FirstStepsTest < TestCase
|
|||
|
||||
# invite agent (with more then one group)
|
||||
click(css: '.active.content .js-inviteAgent')
|
||||
sleep 4
|
||||
|
||||
modal_ready()
|
||||
|
||||
set(
|
||||
css: '.modal [name="firstname"]',
|
||||
value: 'Bob',
|
||||
|
@ -49,10 +51,11 @@ class FirstStepsTest < TestCase
|
|||
css: 'body div.modal',
|
||||
value: 'Sending',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
# invite customer
|
||||
click(css: '.active.content .js-inviteCustomer')
|
||||
sleep 4
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="firstname"]',
|
||||
value: 'Client',
|
||||
|
@ -81,12 +84,14 @@ class FirstStepsTest < TestCase
|
|||
css: 'body div.modal',
|
||||
value: 'Sending',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
# test ticket
|
||||
click(
|
||||
css: '.active.content .js-testTicket',
|
||||
fast: true,
|
||||
)
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: 'body div.modal',
|
||||
value: 'A Test Ticket has been created',
|
||||
|
@ -99,6 +104,8 @@ class FirstStepsTest < TestCase
|
|||
css: 'body div.modal',
|
||||
value: 'Test Ticket',
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
execute(
|
||||
js: '$(".active.content .sidebar").show()',
|
||||
)
|
||||
|
|
|
@ -37,27 +37,15 @@ class KeyboardShortcutsTest < TestCase
|
|||
shortcut(key: 'h')
|
||||
end
|
||||
end
|
||||
watch_for(
|
||||
css: '.modal',
|
||||
value: 'Keyboard Shortcuts',
|
||||
timeout: 6,
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
# hide shortkeys
|
||||
shortcut(key: 'h')
|
||||
watch_for_disappear(
|
||||
css: '.modal',
|
||||
value: 'Keyboard Shortcuts',
|
||||
timeout: 2,
|
||||
)
|
||||
modal_disappear()
|
||||
|
||||
# show shortkeys
|
||||
shortcut(key: 'h')
|
||||
watch_for(
|
||||
css: '.modal',
|
||||
value: 'Keyboard Shortcuts',
|
||||
timeout: 2,
|
||||
)
|
||||
modal_ready()
|
||||
|
||||
# show notifications
|
||||
shortcut(key: 'a')
|
||||
|
|
|
@ -39,15 +39,12 @@ class MaintenanceModeTest < TestCase
|
|||
)
|
||||
|
||||
# check warning
|
||||
watch_for(
|
||||
browser: browser1,
|
||||
css: '.content.active .modal .modal-header',
|
||||
value: 'confirm',
|
||||
)
|
||||
modal_ready(browser: browser1)
|
||||
click(
|
||||
browser: browser1,
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
modal_disappear(browser: browser1)
|
||||
|
||||
watch_for(
|
||||
browser: browser2,
|
||||
|
@ -127,15 +124,12 @@ class MaintenanceModeTest < TestCase
|
|||
)
|
||||
|
||||
# check warning
|
||||
watch_for(
|
||||
browser: browser1,
|
||||
css: '.content.active .modal .modal-header',
|
||||
value: 'confirm',
|
||||
)
|
||||
modal_ready(browser: browser1)
|
||||
click(
|
||||
browser: browser1,
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
modal_disappear(browser: browser1)
|
||||
|
||||
watch_for(
|
||||
browser: browser2,
|
||||
|
|
|
@ -50,6 +50,7 @@ class MaintenanceSessionMessageTest < TestCase
|
|||
css: '.content.active .js-Message button.js-submit',
|
||||
)
|
||||
|
||||
modal_ready(browser: browser2)
|
||||
watch_for(
|
||||
browser: browser2,
|
||||
css: '.modal',
|
||||
|
@ -71,6 +72,7 @@ class MaintenanceSessionMessageTest < TestCase
|
|||
browser: browser2,
|
||||
css: 'div.modal-header .js-close',
|
||||
)
|
||||
modal_disappear(browser: browser2)
|
||||
|
||||
# check #2
|
||||
click(
|
||||
|
@ -98,6 +100,7 @@ class MaintenanceSessionMessageTest < TestCase
|
|||
css: '.content.active .js-Message button.js-submit',
|
||||
)
|
||||
|
||||
modal_ready(browser: browser2)
|
||||
watch_for(
|
||||
browser: browser2,
|
||||
css: '.modal',
|
||||
|
@ -119,6 +122,7 @@ class MaintenanceSessionMessageTest < TestCase
|
|||
browser: browser2,
|
||||
css: 'div.modal-header .js-close',
|
||||
)
|
||||
modal_disappear(browser: browser2)
|
||||
|
||||
# check #3
|
||||
click(
|
||||
|
@ -149,6 +153,7 @@ class MaintenanceSessionMessageTest < TestCase
|
|||
css: '.content.active .js-Message button.js-submit',
|
||||
)
|
||||
|
||||
modal_ready(browser: browser2)
|
||||
watch_for(
|
||||
browser: browser2,
|
||||
css: '.modal',
|
||||
|
|
|
@ -28,13 +28,14 @@ class ManageTest < TestCase
|
|||
)
|
||||
|
||||
click(css: '.table-overview tr:last-child td')
|
||||
sleep 2
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal input[name="lastname"]',
|
||||
value: "2Manage Lastname#{random}",
|
||||
)
|
||||
click(css: '.modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: 'body',
|
||||
|
@ -55,8 +56,8 @@ class ManageTest < TestCase
|
|||
sleep 1
|
||||
|
||||
click(css: '.content:not(.hide) .action:last-child .js-edit')
|
||||
sleep 1
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal input[name=name]',
|
||||
value: "some sla update #{random}",
|
||||
|
@ -66,6 +67,7 @@ class ManageTest < TestCase
|
|||
value: '2:01',
|
||||
)
|
||||
click(css: '.modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: 'body',
|
||||
|
|
|
@ -16,11 +16,8 @@ class PreferencesTokenAccessTest < TestCase
|
|||
click(css: 'a[href="#profile/token_access"]')
|
||||
|
||||
click(css: '.content.active .js-create')
|
||||
watch_for(
|
||||
css: '.modal .modal-title',
|
||||
value: 'Add a Personal Access Token'
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal .js-input',
|
||||
value: 'Some App#1',
|
||||
|
@ -37,6 +34,8 @@ class PreferencesTokenAccessTest < TestCase
|
|||
value: 'Your New Personal Access Token'
|
||||
)
|
||||
click(css: '.modal .js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .js-tokenList',
|
||||
value: 'Some App#1'
|
||||
|
@ -47,10 +46,8 @@ class PreferencesTokenAccessTest < TestCase
|
|||
)
|
||||
|
||||
click(css: '.content.active .js-create')
|
||||
watch_for(
|
||||
css: '.modal .modal-title',
|
||||
value: 'Add a Personal Access Token'
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.content.active .modal .js-input',
|
||||
value: 'Some App#2',
|
||||
|
@ -63,12 +60,16 @@ class PreferencesTokenAccessTest < TestCase
|
|||
value: 'Your New Personal Access Token'
|
||||
)
|
||||
click(css: '.modal .js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .js-tokenList',
|
||||
value: 'Some App#2'
|
||||
)
|
||||
|
||||
click(css: '.content.active .js-tokenList a')
|
||||
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: '.content.active .modal .modal-header',
|
||||
value: 'confirm',
|
||||
|
@ -76,6 +77,7 @@ class PreferencesTokenAccessTest < TestCase
|
|||
click(
|
||||
css: '.content.active .modal .js-submit',
|
||||
)
|
||||
modal_disappear()
|
||||
watch_for_disappear(
|
||||
css: '.content.active .js-tokenList',
|
||||
value: 'Some App#2'
|
||||
|
|
|
@ -31,9 +31,11 @@ class SignupPasswordChangeAndResetTest < TestCase
|
|||
value: 'some-pass',
|
||||
)
|
||||
click(css: 'button.js-submit')
|
||||
sleep 5
|
||||
|
||||
exists_not(css: '.signup')
|
||||
watch_for_disappear(
|
||||
css: '.signup',
|
||||
timeout: 10,
|
||||
)
|
||||
|
||||
match(
|
||||
css: '.user-menu .user a',
|
||||
|
@ -61,11 +63,9 @@ class SignupPasswordChangeAndResetTest < TestCase
|
|||
execute(
|
||||
js: 'App.Event.trigger("user_signup_verify", App.Session.get())',
|
||||
)
|
||||
watch_for(
|
||||
css: '.modal',
|
||||
value: 'Account not verified',
|
||||
)
|
||||
modal_ready()
|
||||
click(css: '.modal .js-submit')
|
||||
|
||||
execute(
|
||||
js: 'App.Auth.logout()',
|
||||
)
|
||||
|
@ -81,9 +81,7 @@ class SignupPasswordChangeAndResetTest < TestCase
|
|||
css: '#content',
|
||||
value: 'Your email address has been verified',
|
||||
)
|
||||
exists_not(
|
||||
css: '.modal',
|
||||
)
|
||||
modal_disappear()
|
||||
sleep 2
|
||||
|
||||
# change password
|
||||
|
|
|
@ -283,13 +283,14 @@ class TranslationTest < TestCase
|
|||
)
|
||||
|
||||
click(css: '.content.active .js-syncChanges')
|
||||
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'Letzte Übersetzung laden',
|
||||
)
|
||||
watch_for_disappear(
|
||||
css: '.content.active .modal',
|
||||
timeout: 6 * 60,
|
||||
modal_disappear(
|
||||
timeout: 6.minutes,
|
||||
)
|
||||
|
||||
click(css: 'a[href="#current_user"]')
|
||||
|
|
|
@ -38,10 +38,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
click(css: '.content.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.content.active .js-action [data-type="edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
modal_ready()
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'some note 123',
|
||||
|
@ -56,6 +53,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
value: 'some note abc',
|
||||
)
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .profile-window',
|
||||
|
@ -71,15 +69,14 @@ class AgentProfilePermissionsTest < TestCase
|
|||
# change lastname back
|
||||
click(css: '.content.active .js-action .icon-arrow-down', fast: true)
|
||||
click(css: '.content.active .js-action [data-type="edit"]')
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'Braun',
|
||||
)
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
verify_task(
|
||||
data: {
|
||||
|
@ -190,17 +187,17 @@ class AgentProfilePermissionsTest < TestCase
|
|||
click(css: '.content.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
|
||||
click(css: '.content.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'B2',
|
||||
)
|
||||
|
||||
set(
|
||||
css: '.modal [data-name="note"]',
|
||||
value: 'some note abc',
|
||||
)
|
||||
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .sidebar[data-tab="customer"] .sidebar-block [data-name="note"]',
|
||||
|
@ -212,16 +209,11 @@ class AgentProfilePermissionsTest < TestCase
|
|||
value: 'Nicole B2',
|
||||
)
|
||||
|
||||
sleep 2
|
||||
# change lastname back
|
||||
click(css: '.content.active .sidebar[data-tab="customer"] .js-actions')
|
||||
click(css: 'li[data-type="customer-edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'Braun',
|
||||
|
@ -231,6 +223,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
value: 'some note abc',
|
||||
)
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .sidebar[data-tab="customer"] .sidebar-block [data-name="note"]',
|
||||
|
@ -283,11 +276,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
click(css: '.content.active .js-action .dropdown-toggle')
|
||||
click(css: '.content.active .js-action [data-type="edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'B2',
|
||||
|
@ -297,6 +286,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
value: 'some note abc',
|
||||
)
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .profile-window',
|
||||
|
@ -313,10 +303,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
click(css: '.content.active .js-action .dropdown-toggle')
|
||||
click(css: '.content.active .js-action [data-type="edit"]')
|
||||
|
||||
watch_for(
|
||||
css: '.content.active .modal',
|
||||
value: 'note',
|
||||
)
|
||||
modal_ready()
|
||||
set(
|
||||
css: '.modal [name="lastname"]',
|
||||
value: 'Braun',
|
||||
|
@ -326,6 +313,7 @@ class AgentProfilePermissionsTest < TestCase
|
|||
value: 'note',
|
||||
)
|
||||
click(css: '.content.active .modal button.js-submit')
|
||||
modal_disappear()
|
||||
|
||||
verify_task(
|
||||
data: {
|
||||
|
@ -361,6 +349,9 @@ class AgentProfilePermissionsTest < TestCase
|
|||
exists(css: '.content.active .sidebar[data-tab="customer"] .js-actions .dropdown-toggle')
|
||||
exists_not(css: '.content.active .sidebar[data-tab="customer"] .js-actions [data-type="customer-edit"]')
|
||||
|
||||
begin
|
||||
retries ||= 0
|
||||
|
||||
# scroll to the Avatar at the top of the zoom view and click it
|
||||
# scrolling is needed because the browser might have scrolled down
|
||||
# caused by a undeliverable email (of the created ticket)
|
||||
|
@ -373,5 +364,10 @@ class AgentProfilePermissionsTest < TestCase
|
|||
|
||||
click(css: '.content.active .js-action .icon-arrow-down', fast: true)
|
||||
exists_not(css: '.content.active .js-action [data-type="edit"]')
|
||||
rescue Selenium::WebDriver::Error::UnknownError
|
||||
sleep retries
|
||||
retries += 1
|
||||
retry if retries < 3
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -552,7 +552,12 @@ class TestCase < Test::Unit::TestCase
|
|||
log('modal_ready', params)
|
||||
|
||||
instance = params[:browser] || @browser
|
||||
sleep 3
|
||||
|
||||
watch_for(
|
||||
browser: instance,
|
||||
css: '.modal.in',
|
||||
timeout: params[:timeout] || 4,
|
||||
)
|
||||
end
|
||||
|
||||
=begin
|
||||
|
@ -2497,6 +2502,53 @@ wait untill text in selector disabppears
|
|||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
overview_open(
|
||||
browser: browser2,
|
||||
name: overview_name,
|
||||
)
|
||||
|
||||
overview_open(
|
||||
browser: browser2,
|
||||
link: "#ticket/view/some_special_name",
|
||||
)
|
||||
|
||||
=end
|
||||
|
||||
def overview_open(params)
|
||||
switch_window_focus(params)
|
||||
log('overview_open', params)
|
||||
|
||||
instance = params[:browser] || @browser
|
||||
|
||||
# click on overview task in sidebar
|
||||
instance.find_elements(css: '.js-overviewsMenuItem')[0].click
|
||||
|
||||
# show larger overview selection list
|
||||
sleep 0.5
|
||||
execute(
|
||||
browser: instance,
|
||||
js: '$(".content.active .sidebar").css("display", "block")',
|
||||
)
|
||||
|
||||
link = if params[:link]
|
||||
params[:link]
|
||||
elsif params[:name]
|
||||
"\#ticket/view/#{params[:name]}"
|
||||
end
|
||||
|
||||
# switch to overview
|
||||
instance.find_elements(css: ".content.active .sidebar a[href=\"#{link}\"]")[0].click
|
||||
|
||||
# hide larger overview selection list again
|
||||
sleep 0.5
|
||||
execute(
|
||||
browser: instance,
|
||||
js: '$(".content.active .sidebar").css("display", "none")',
|
||||
)
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
ticket_open_by_overview(
|
||||
|
@ -2520,18 +2572,8 @@ wait untill text in selector disabppears
|
|||
|
||||
instance = params[:browser] || @browser
|
||||
|
||||
instance.find_elements(css: '.js-overviewsMenuItem')[0].click
|
||||
sleep 0.5
|
||||
execute(
|
||||
browser: instance,
|
||||
js: '$(".content.active .sidebar").css("display", "block")',
|
||||
)
|
||||
instance.find_elements(css: ".content.active .sidebar a[href=\"#{params[:link]}\"]")[0].click
|
||||
sleep 0.5
|
||||
execute(
|
||||
browser: instance,
|
||||
js: '$(".content.active .sidebar").css("display", "none")',
|
||||
)
|
||||
overview_open(params)
|
||||
|
||||
if params[:title]
|
||||
element = instance.find_element(css: '.content.active').find_element(partial_link_text: params[:title])
|
||||
if !element
|
||||
|
|
Loading…
Reference in a new issue