diff --git a/app/services/forest_liana/operator_date_interval_parser.rb b/app/services/forest_liana/operator_date_interval_parser.rb index 6775cfb0..8ee9ab44 100644 --- a/app/services/forest_liana/operator_date_interval_parser.rb +++ b/app/services/forest_liana/operator_date_interval_parser.rb @@ -73,30 +73,34 @@ def to_client_timezone(date) def get_date_filter(operator, value) return nil unless is_date_operator? operator - case operator - when OPERATOR_FUTURE - return ">= '#{Time.now}'" - when OPERATOR_PAST - return "<= '#{Time.now}'" - when OPERATOR_TODAY - return "BETWEEN '#{to_client_timezone(Time.now.beginning_of_day)}' " + - "AND '#{to_client_timezone(Time.now.end_of_day)}'" - when OPERATOR_PREVIOUS_X_DAYS - ensure_integer_value(value) - return "BETWEEN '" + - "#{to_client_timezone(Integer(value).day.ago.beginning_of_day)}'" + - " AND '#{to_client_timezone(1.day.ago.end_of_day)}'" - when OPERATOR_PREVIOUS_X_DAYS_TO_DATE - ensure_integer_value(value) - return "BETWEEN '" + - "#{to_client_timezone((Integer(value) - 1).day.ago.beginning_of_day)}'" + - " AND '#{Time.now}'" - when OPERATOR_BEFORE_X_HOURS_AGO - ensure_integer_value(value) - return "< '#{to_client_timezone((Integer(value)).hour.ago)}'" - when OPERATOR_AFTER_X_HOURS_AGO - ensure_integer_value(value) - return "> '#{to_client_timezone((Integer(value)).hour.ago)}'" + filter = case operator + when OPERATOR_FUTURE + ">= '#{Time.now}'" + when OPERATOR_PAST + "<= '#{Time.now}'" + when OPERATOR_TODAY + "BETWEEN '#{to_client_timezone(Time.now.beginning_of_day)}' " + + "AND '#{to_client_timezone(Time.now.end_of_day)}'" + when OPERATOR_PREVIOUS_X_DAYS + ensure_integer_value(value) + "BETWEEN '" + + "#{to_client_timezone(Integer(value).day.ago.beginning_of_day)}'" + + " AND '#{to_client_timezone(1.day.ago.end_of_day)}'" + when OPERATOR_PREVIOUS_X_DAYS_TO_DATE + ensure_integer_value(value) + "BETWEEN '" + + "#{to_client_timezone((Integer(value) - 1).day.ago.beginning_of_day)}'" + + " AND '#{Time.now}'" + when OPERATOR_BEFORE_X_HOURS_AGO + ensure_integer_value(value) + "< '#{(Integer(value)).hour.ago}'" + when OPERATOR_AFTER_X_HOURS_AGO + ensure_integer_value(value) + "> '#{(Integer(value)).hour.ago}'" + end + + if filter != nil + return filter end duration = PERIODS[operator][:duration] diff --git a/test/services/forest_liana/operator_date_interval_parser_test.rb b/test/services/forest_liana/operator_date_interval_parser_test.rb new file mode 100644 index 00000000..58632baf --- /dev/null +++ b/test/services/forest_liana/operator_date_interval_parser_test.rb @@ -0,0 +1,16 @@ +module ForestLiana + class OperatorDateIntervalParserTest < ActiveSupport::TestCase + test 'OPERATOR_AFTER_X_HOURS_AGO and OPERATOR_BEFORE_X_HOURS_AGO should not take timezone into account' do + # Setting a big timezone (GMT+10) on purpose, the timezone should not be applied on the result date + operatorDateIntervalParser = OperatorDateIntervalParser.new('Australia/Sydney') + + result = operatorDateIntervalParser.get_date_filter(OperatorDateIntervalParser::OPERATOR_AFTER_X_HOURS_AGO, 2) + hourComputed = result.split('> ')[1].tr('\'', '').to_datetime.hour + assert hourComputed == Time.now.utc.hour - 2 + + result = operatorDateIntervalParser.get_date_filter(OperatorDateIntervalParser::OPERATOR_BEFORE_X_HOURS_AGO, 2) + hourComputed = result.split('< ')[1].tr('\'', '').to_datetime.hour + assert hourComputed == Time.now.utc.hour - 2 + end + end +end