diff --git a/app/assets/javascripts/app/views/calendar/holiday_selector.jst.eco b/app/assets/javascripts/app/views/calendar/holiday_selector.jst.eco
index 4ed5a2382..8996e5bbc 100644
--- a/app/assets/javascripts/app/views/calendar/holiday_selector.jst.eco
+++ b/app/assets/javascripts/app/views/calendar/holiday_selector.jst.eco
@@ -15,7 +15,7 @@
<%- @Icon('checkbox', 'icon-unchecked') %>
<%- @Icon('checkbox-checked', 'icon-checked') %>
-
<%- @Tdate(day) %>
+ | <%= day %>
|
|
<% if !meta.feed: %>
diff --git a/spec/support/capybara/browser_test_helper.rb b/spec/support/capybara/browser_test_helper.rb
index 2b9e894aa..5f31438c5 100644
--- a/spec/support/capybara/browser_test_helper.rb
+++ b/spec/support/capybara/browser_test_helper.rb
@@ -80,6 +80,27 @@ module BrowserTestHelper
raise e
end
+ # This method is a derivation of Selenium::WebDriver::Wait#until
+ # which ignores Capybara::ElementNotFound exceptions raised
+ # in the given block.
+ #
+ # @example
+ # wait(5).until_disappear { find('[data-title="example"]') }
+ #
+ def until_disappears
+ self.until do
+
+ yield
+ false
+ rescue Capybara::ElementNotFound
+ true
+ end
+ rescue Selenium::WebDriver::Error::TimeOutError => e
+ # cleanup backtrace
+ e.set_backtrace(e.backtrace.drop(3))
+ raise e
+ end
+
# This method loops a given block until the result of it is constant.
#
# @example
diff --git a/spec/support/capybara/common_actions.rb b/spec/support/capybara/common_actions.rb
index 70fa9bc8b..2028fffed 100644
--- a/spec/support/capybara/common_actions.rb
+++ b/spec/support/capybara/common_actions.rb
@@ -183,6 +183,33 @@ module CommonActions
click '.js-openDropdownMacro'
end
+ # Checks if modal is ready
+ #
+ # @param timeout [Integer] seconds to wait
+ def modal_ready(timeout: 4)
+ wait(timeout).until_exists { find('.modal.in') }
+ end
+
+ # Checks if modal has disappeared
+ #
+ # @param timeout [Integer] seconds to wait
+ def modal_disappear(timeout: 4)
+ wait(timeout).until_disappears { find('.modal.in') }
+ end
+
+ # Scrolls to given element
+ #
+ # @option options [String] :css selector
+ # @option options [String] :vertical may be "start", "center", "end", or "nearest". Defaults to "start".
+ def scroll_to(params)
+ vertical = params.fetch :vertical, 'start'
+
+ script = "$('#{params[:css]}').get(0).scrollIntoView({block: '#{vertical}'})"
+
+ execute_script script
+
+ wait(1).until_constant { evaluate_script "$('#{params[:css]}').get(0).scrollTop" }
+ end
end
RSpec.configure do |config|
diff --git a/spec/support/time_zone.rb b/spec/support/time_zone.rb
new file mode 100644
index 000000000..256e06644
--- /dev/null
+++ b/spec/support/time_zone.rb
@@ -0,0 +1,10 @@
+RSpec.configure do |config|
+ config.around(:each, :time_zone) do |example|
+ old_tz = ENV['TZ']
+ ENV['TZ'] = example.metadata[:time_zone]
+
+ example.run
+ ensure
+ ENV['TZ'] = old_tz
+ end
+end
diff --git a/spec/system/admin/calendars/date_spec.rb b/spec/system/admin/calendars/date_spec.rb
new file mode 100644
index 000000000..9fe97a305
--- /dev/null
+++ b/spec/system/admin/calendars/date_spec.rb
@@ -0,0 +1,41 @@
+require 'rails_helper'
+
+RSpec.describe 'Admin Panel > Calendars date', type: :system, authenticated: true, time_zone: 'America/Sao_Paulo' do
+ # https://github.com/zammad/zammad/issues/2229
+ it 'Show festivities dates correctly far away from UTC' do
+ visit '/#manage/calendars'
+
+ click '.js-new'
+
+ modal_ready
+
+ within '.modal-dialog' do
+ fill_in 'name', with: 'test calendar'
+
+ click '.dropdown-toggle'
+ click '.dropdown-menu [data-value="America/Sao_Paulo"]'
+
+ find('.ical_feed select').select 'Brazil'
+
+ click '.js-submit'
+ end
+
+ modal_disappear
+
+ container = find('.action') { |elem| elem.find('.action-row h2').text == 'test calendar' }
+
+ container.find('.js-edit').click
+
+ modal_ready
+
+ within '.modal-dialog' do
+ scroll_to(css: '.modal-dialog', vertical: 'end')
+
+ rows = find_all('.holiday_selector tr') { |elem| elem.has_css?('input.js-summary') && elem.find('input.js-summary').value.starts_with?('Christmas Eve') }
+ row = rows[0]
+
+ expect(row).to have_text('24')
+ expect(row).to have_text('12')
+ end
+ end
+end
|