diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7353601b4..bfe5b71b6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 diff --git a/spec/lib/sessions/backend/activity_stream_spec.rb b/spec/lib/sessions/backend/activity_stream_spec.rb index 071cc28fd..c79419b95 100644 --- a/spec/lib/sessions/backend/activity_stream_spec.rb +++ b/spec/lib/sessions/backend/activity_stream_spec.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 diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f17817753..dfca9cfcc 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -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 } diff --git a/test/browser/admin_overview_test.rb b/test/browser/admin_overview_test.rb index e9cfe0b9c..a6bbae3f0 100644 --- a/test/browser/admin_overview_test.rb +++ b/test/browser/admin_overview_test.rb @@ -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 diff --git a/test/browser/agent_organization_profile_test.rb b/test/browser/agent_organization_profile_test.rb index 89826290d..1a91bf94e 100644 --- a/test/browser/agent_organization_profile_test.rb +++ b/test/browser/agent_organization_profile_test.rb @@ -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: { diff --git a/test/browser/agent_ticket_attachment_test.rb b/test/browser/agent_ticket_attachment_test.rb index c23a7864d..abaf83d72 100644 --- a/test/browser/agent_ticket_attachment_test.rb +++ b/test/browser/agent_ticket_attachment_test.rb @@ -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,14 +329,15 @@ 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( css: '.content.active .js-submit:disabled', ) watch_for_disappear( - css: '.content.active .js-submit:disabled', + css: '.content.active .js-submit:disabled', + timeout: 4.minutes, ) exists( css: '.content.active .js-submit', @@ -355,14 +356,23 @@ 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( css: '.content.active .js-submit:disabled', ) watch_for_disappear( - css: '.content.active .js-submit:disabled', + 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 diff --git a/test/browser/agent_ticket_create_reset_customer_selection_test.rb b/test/browser/agent_ticket_create_reset_customer_selection_test.rb index 176499e3d..83cedd3d2 100644 --- a/test/browser/agent_ticket_create_reset_customer_selection_test.rb +++ b/test/browser/agent_ticket_create_reset_customer_selection_test.rb @@ -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', diff --git a/test/browser/agent_ticket_link_test.rb b/test/browser/agent_ticket_link_test.rb index 5eb964a11..19de03399 100644 --- a/test/browser/agent_ticket_link_test.rb +++ b/test/browser/agent_ticket_link_test.rb @@ -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"]', diff --git a/test/browser/agent_ticket_macro_test.rb b/test/browser/agent_ticket_macro_test.rb index 3b2883ed7..da18df919 100644 --- a/test/browser/agent_ticket_macro_test.rb +++ b/test/browser/agent_ticket_macro_test.rb @@ -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 diff --git a/test/browser/agent_ticket_merge_test.rb b/test/browser/agent_ticket_merge_test.rb index 27ed3b6eb..99d6c90e9 100644 --- a/test/browser/agent_ticket_merge_test.rb +++ b/test/browser/agent_ticket_merge_test.rb @@ -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], diff --git a/test/browser/agent_ticket_overview_level0_test.rb b/test/browser/agent_ticket_overview_level0_test.rb index 848cd17ff..1c72eef83 100644 --- a/test/browser/agent_ticket_overview_level0_test.rb +++ b/test/browser/agent_ticket_overview_level0_test.rb @@ -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"]', ) diff --git a/test/browser/agent_ticket_tag_test.rb b/test/browser/agent_ticket_tag_test.rb index bf7adf729..1013ff8ae 100644 --- a/test/browser/agent_ticket_tag_test.rb +++ b/test/browser/agent_ticket_tag_test.rb @@ -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', diff --git a/test/browser/agent_ticket_text_module_test.rb b/test/browser/agent_ticket_text_module_test.rb index 27caa39b0..ca44ff399 100644 --- a/test/browser/agent_ticket_text_module_test.rb +++ b/test/browser/agent_ticket_text_module_test.rb @@ -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, diff --git a/test/browser/agent_ticket_time_accounting_test.rb b/test/browser/agent_ticket_time_accounting_test.rb index 3bfafb8df..2f047577d 100644 --- a/test/browser/agent_ticket_time_accounting_test.rb +++ b/test/browser/agent_ticket_time_accounting_test.rb @@ -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( diff --git a/test/browser/agent_ticket_zoom_hide_test.rb b/test/browser/agent_ticket_zoom_hide_test.rb index 984df91e0..2f1210124 100644 --- a/test/browser/agent_ticket_zoom_hide_test.rb +++ b/test/browser/agent_ticket_zoom_hide_test.rb @@ -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 diff --git a/test/browser/agent_user_manage_test.rb b/test/browser/agent_user_manage_test.rb index 906427e0e..15555cc80 100644 --- a/test/browser/agent_user_manage_test.rb +++ b/test/browser/agent_user_manage_test.rb @@ -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"]', diff --git a/test/browser/agent_user_profile_test.rb b/test/browser/agent_user_profile_test.rb index 664a03d0f..929502aa4 100644 --- a/test/browser/agent_user_profile_test.rb +++ b/test/browser/agent_user_profile_test.rb @@ -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: { diff --git a/test/browser/chat_test.rb b/test/browser/chat_test.rb index 7350986ce..0d5b0b9d8 100644 --- a/test/browser/chat_test.rb +++ b/test/browser/chat_test.rb @@ -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"]', diff --git a/test/browser/first_steps_test.rb b/test/browser/first_steps_test.rb index 2506abbda..bd3f30012 100644 --- a/test/browser/first_steps_test.rb +++ b/test/browser/first_steps_test.rb @@ -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()', ) diff --git a/test/browser/keyboard_shortcuts_test.rb b/test/browser/keyboard_shortcuts_test.rb index c266cb85d..0f971ef49 100644 --- a/test/browser/keyboard_shortcuts_test.rb +++ b/test/browser/keyboard_shortcuts_test.rb @@ -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') diff --git a/test/browser/maintenance_mode_test.rb b/test/browser/maintenance_mode_test.rb index f00952423..b617688ea 100644 --- a/test/browser/maintenance_mode_test.rb +++ b/test/browser/maintenance_mode_test.rb @@ -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, diff --git a/test/browser/maintenance_session_message_test.rb b/test/browser/maintenance_session_message_test.rb index 5ea58c808..8c7093a4c 100644 --- a/test/browser/maintenance_session_message_test.rb +++ b/test/browser/maintenance_session_message_test.rb @@ -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', diff --git a/test/browser/manage_test.rb b/test/browser/manage_test.rb index 0ecc13415..ba89f07bf 100644 --- a/test/browser/manage_test.rb +++ b/test/browser/manage_test.rb @@ -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', diff --git a/test/browser/preferences_token_access_test.rb b/test/browser/preferences_token_access_test.rb index d6d97cfee..5329221d3 100644 --- a/test/browser/preferences_token_access_test.rb +++ b/test/browser/preferences_token_access_test.rb @@ -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' diff --git a/test/browser/signup_password_change_and_reset_test.rb b/test/browser/signup_password_change_and_reset_test.rb index b174f2cb7..c807e5fd7 100644 --- a/test/browser/signup_password_change_and_reset_test.rb +++ b/test/browser/signup_password_change_and_reset_test.rb @@ -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 diff --git a/test/browser/translation_test.rb b/test/browser/translation_test.rb index be17b75b5..6efcd617b 100644 --- a/test/browser/translation_test.rb +++ b/test/browser/translation_test.rb @@ -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"]') diff --git a/test/browser/user_access_permissions_test.rb b/test/browser/user_access_permissions_test.rb index c3792b53a..605ca3177 100644 --- a/test/browser/user_access_permissions_test.rb +++ b/test/browser/user_access_permissions_test.rb @@ -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,17 +349,25 @@ 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"]') - # 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) - zoom_top_avatar_selector = '.content.active .tabsSidebar-holder .js-avatar' - scroll_to( - position: 'botton', - css: zoom_top_avatar_selector, - ) - click(css: zoom_top_avatar_selector) + begin + retries ||= 0 - click(css: '.content.active .js-action .icon-arrow-down', fast: true) - exists_not(css: '.content.active .js-action [data-type="edit"]') + # 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) + zoom_top_avatar_selector = '.content.active .tabsSidebar-holder .js-avatar' + scroll_to( + position: 'botton', + css: zoom_top_avatar_selector, + ) + click(css: zoom_top_avatar_selector) + + 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 diff --git a/test/browser_test_helper.rb b/test/browser_test_helper.rb index 3556a0d20..0188eb46f 100644 --- a/test/browser_test_helper.rb +++ b/test/browser_test_helper.rb @@ -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