From da22f4b1bdf4859bfdc026897f53c7efb4dfc743 Mon Sep 17 00:00:00 2001 From: Martin Gruner Date: Fri, 8 Oct 2021 08:41:05 +0200 Subject: [PATCH] Maintenance: Ported Manage > Channels > Email test to capybara. --- app/models/channel/driver/imap.rb | 7 +- script/build/test_slice_tests.sh | 6 - spec/system/channels/email_spec.rb | 107 ++++++++++++++ test/browser/admin_channel_email_test.rb | 180 ----------------------- 4 files changed, 110 insertions(+), 190 deletions(-) delete mode 100644 test/browser/admin_channel_email_test.rb diff --git a/app/models/channel/driver/imap.rb b/app/models/channel/driver/imap.rb index 174608f55..b875db600 100644 --- a/app/models/channel/driver/imap.rb +++ b/app/models/channel/driver/imap.rb @@ -7,6 +7,8 @@ class Channel::Driver::Imap < Channel::EmailParser FETCH_METADATA_TIMEOUT = 2.minutes FETCH_MSG_TIMEOUT = 4.minutes EXPUNGE_TIMEOUT = 16.minutes + DEFAULT_TIMEOUT = 45.seconds + CHECK_ONLY_TIMEOUT = 6.seconds def fetchable?(_channel) true @@ -110,10 +112,7 @@ example Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server},auth_type=#{options.fetch(:auth_type, 'LOGIN')})" # on check, reduce open_timeout to have faster probing - check_type_timeout = 45 - if check_type == 'check' - check_type_timeout = 6 - end + check_type_timeout = check_type == 'check' ? CHECK_ONLY_TIMEOUT : DEFAULT_TIMEOUT timeout(check_type_timeout) do @imap = ::Net::IMAP.new(options[:host], port, ssl, nil, false) diff --git a/script/build/test_slice_tests.sh b/script/build/test_slice_tests.sh index 11e68e141..369764c5e 100755 --- a/script/build/test_slice_tests.sh +++ b/script/build/test_slice_tests.sh @@ -11,7 +11,6 @@ if [ "$LEVEL" == '1' ]; then cp contrib/auto_wizard_test.json auto_wizard.json cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb rm test/browser/abb_one_group_test.rb - rm test/browser/admin_channel_email_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_overview_test.rb rm test/browser/admin_permissions_granular_vs_full_test.rb @@ -68,7 +67,6 @@ elif [ "$LEVEL" == '2' ]; then # only ticket action 2/3 # test/browser/aaa_getting_started_test.rb # test/browser/abb_one_group_test.rb - rm test/browser/admin_channel_email_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_overview_test.rb rm test/browser/admin_permissions_granular_vs_full_test.rb @@ -125,7 +123,6 @@ elif [ "$LEVEL" == '3' ]; then # only ticket action 2/3 # test/browser/aaa_getting_started_test.rb # test/browser/abb_one_group_test.rb - rm test/browser/admin_channel_email_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_overview_test.rb rm test/browser/admin_permissions_granular_vs_full_test.rb @@ -182,7 +179,6 @@ elif [ "$LEVEL" == '4' ]; then # only ticket action 3/3 # test/browser/aaa_getting_started_test.rb # test/browser/abb_one_group_test.rb - rm test/browser/admin_channel_email_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_overview_test.rb rm test/browser/admin_permissions_granular_vs_full_test.rb @@ -238,7 +234,6 @@ elif [ "$LEVEL" == '5' ]; then # only profile action & admin # test/browser/abb_one_group_test.rb - # test/browser/admin_channel_email_test.rb # rm test/browser/admin_drag_drop_to_new_group_test.rb # test/browser/admin_overview_test.rb # rm test/browser/admin_permissions_granular_vs_full_test.rb @@ -297,7 +292,6 @@ elif [ "$LEVEL" == '6' ]; then cp contrib/auto_wizard_test.json auto_wizard.json cp test/integration/aaa_auto_wizard_base_setup_test.rb test/browser/aaa_auto_wizard_base_setup_test.rb rm test/browser/abb_one_group_test.rb - rm test/browser/admin_channel_email_test.rb rm test/browser/admin_drag_drop_to_new_group_test.rb rm test/browser/admin_overview_test.rb rm test/browser/admin_permissions_granular_vs_full_test.rb diff --git a/spec/system/channels/email_spec.rb b/spec/system/channels/email_spec.rb index c17662b37..7aa1e8b3f 100644 --- a/spec/system/channels/email_spec.rb +++ b/spec/system/channels/email_spec.rb @@ -4,6 +4,113 @@ require 'rails_helper' RSpec.describe 'Manage > Channels > Email', type: :system do + context 'when managing email channels', required_envs: %w[MAILBOX_INIT] do + + before do + visit '/#channels/email' + end + + context 'when looking at the default screen' do + + it 'has correct default settings' do + + within :active_content do + # check if postmaster filters are shown + click 'a[href="#c-filter"]' + expect(find('#c-filter .overview')).to have_text 'NO ENTRIES' + + # check if signatures are shown + click 'a[href="#c-signature"]' + expect(find('#c-signature .overview')).to have_text 'default' + + end + end + end + + context 'when creating new channels' do + let(:mailbox_user) { ENV['MAILBOX_INIT'].split(':')[0] } + let(:mailbox_password) { ENV['MAILBOX_INIT'].split(':')[1] } + + before do + # Make sure the channel is loaded + 'Channel::Driver::Imap'.constantize + # The normal timeout may be too low in slow CI environments. + stub_const 'Channel::Driver::Imap::CHECK_ONLY_TIMEOUT', 1.minute + end + + it 'refuses wrong credentials' do + + click 'a[href="#c-account"]' + click '.js-channelNew' + modal_ready + + within '.modal' do + fill_in 'realname', with: 'My System' + fill_in 'email', with: "unknown_user.#{mailbox_user}" + fill_in 'password', with: mailbox_password + select 'Users', from: 'group_id' + click '.js-submit' + expect(page).to have_text('Unable to detect your server settings. Manual configuration needed.') + end + + end + + it 'accepts correct credentials' do + + click 'a[href="#c-account"]' + click '.js-channelNew' + modal_ready + + within '.modal' do + fill_in 'realname', with: 'My System' + fill_in 'email', with: mailbox_user + fill_in 'password', with: mailbox_password + select 'Users', from: 'group_id' + click '.js-submit' + end + + modal_disappear timeout: 2.minutes + + within :active_content do + expect(page).to have_text(mailbox_user) + all('.js-editInbound').last.click + fill_in 'options::folder', with: 'nonexisting_folder' + click '.js-submit' + expect(page).to have_text("Mailbox doesn\'t exist") + end + end + end + + context 'when managing filters' do + let(:filter_name) { "Test Filter #{SecureRandom.uuid}" } + + it 'works as expected' do + + click 'a[href="#c-filter"]' + click '.content.active a[data-type="new"]' + + modal_ready + within '.modal' do + fill_in 'name', with: filter_name + fill_in 'match::from::value', with: 'target' + click '.js-submit' + end + modal_disappear + + expect(page).to have_text(filter_name) + click '.content.active .table .dropdown .btn--table' + click '.content.active .table .dropdown .js-clone' + + modal_ready + click '.modal .js-submit' + modal_disappear + + expect(page).to have_text("Clone: #{filter_name}") + end + + end + end + context 'non editable' do it 'hides "Edit" links' do diff --git a/test/browser/admin_channel_email_test.rb b/test/browser/admin_channel_email_test.rb deleted file mode 100644 index 1d6be9f09..000000000 --- a/test/browser/admin_channel_email_test.rb +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ - -require 'browser_test_helper' - -class AdminChannelEmailTest < TestCase - def test_account_add - - if !ENV['MAILBOX_INIT'] - # raise "Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'" - puts "NOTICE: Need MAILBOX_INIT as ENV variable like export MAILBOX_INIT='unittest01@znuny.com:somepass'" - return - end - mailbox_user = ENV['MAILBOX_INIT'].split(':')[0] - mailbox_password = ENV['MAILBOX_INIT'].split(':')[1] - - @browser = browser_instance - login( - username: 'admin@example.com', - password: 'test', - url: browser_url, - ) - tasks_close_all - - click(css: 'a[href="#manage"]') - click(css: '.content.active a[href="#channels/email"]') - - # check if postmaster filter are shown - click(css: '.content.active a[href="#c-filter"]') - match( - css: '.content.active #c-filter .overview', - value: 'No Entries', - ) - - # check if signatures are shown - click(css: '.content.active a[href="#c-signature"]') - match( - css: '.content.active #c-signature .overview', - value: 'default', - ) - - click(css: '.content.active a[href="#c-account"]') - click(css: '.content.active .js-channelNew') - - modal_ready - set( - css: '.modal input[name="realname"]', - value: 'My System', - ) - set( - css: '.modal input[name="email"]', - value: mailbox_user, - ) - set( - css: '.modal input[name="password"]', - value: mailbox_password, - ) - select( - css: '.modal select[name="group_id"]', - value: 'Users', - ) - click(css: '.modal button.js-submit') - sleep 4 - - watch_for( - css: '.modal', - value: '(already exists|unknown mailbox)', - ) - - click(css: '.modal .js-close') - - # delete all channels - loop do - break if !@browser.find_elements(css: '.content.active .js-channelDelete')[0] - - click(css: '.content.active .js-channelDelete') - sleep 2 - # flanky - click(css: '.modal .js-submit') - sleep 2 - end - - # re-create - click(css: '.content.active .js-channelNew') - - modal_ready - - set( - css: '.modal input[name="realname"]', - value: 'My System', - ) - set( - css: '.modal input[name="email"]', - value: mailbox_user, - ) - set( - css: '.modal input[name="password"]', - value: mailbox_password, - ) - select( - css: '.modal select[name="group_id"]', - value: 'Users', - ) - click(css: '.modal button.js-submit') - modal_disappear(timeout: 20) - - watch_for( - css: '.content.active', - value: mailbox_user, - ) - - # set invalid folder - click(css: '.content.active .js-editInbound') - - modal_ready - - set( - css: '.modal input[name="options::folder"]', - value: 'not_existing_folder', - ) - click(css: '.modal .js-inbound button.js-submit') - watch_for( - css: '.modal', - value: 'Mailbox doesn\'t exist', - ) - - end - - # test the creation and cloning of Postmaster filters - # confirm fix for issue #2170 - Cannot clone PostmasterFilter - def test_filter_clone - filter_name = "Test Filter #{SecureRandom.uuid}" - - @browser = browser_instance - login( - username: 'admin@example.com', - password: 'test', - url: browser_url, - ) - tasks_close_all - - click(css: 'a[href="#manage"]') - click(css: '.content.active a[href="#channels/email"]') - - click(css: '.content.active a[href="#c-filter"]') - - # create a new email filter - click(css: '.content.active a[data-type="new"]') - - modal_ready - set( - css: '.modal input[name="name"]', - value: filter_name, - ) - set( - css: '.modal input[name="match::from::value"]', - value: 'target', - ) - click(css: '.modal .js-submit') - modal_disappear - - watch_for( - css: '.content.active .table', - value: filter_name, - ) - - # now clone filter that we just created - click(css: '.content.active .table .dropdown .btn--table') - click(css: '.content.active .table .dropdown .js-clone') - - modal_ready - click(css: '.modal .js-submit') - modal_disappear - - # confirm the clone exists in the table - watch_for( - css: '.content.active .table', - value: "Clone: #{filter_name}", - ) - end -end