diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 724b0b789..e881f8299 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -12,11 +12,7 @@ class ReportsController < ApplicationController @end_date = parse_date_param(:end_date) || default_end_date # Validate and fix date range if end_date is before start_date - if @start_date > @end_date - # Swap the dates to maintain user's intended date range - @start_date, @end_date = @end_date, @start_date - flash.now[:alert] = t("reports.invalid_date_range") - end + validate_and_fix_date_range(show_flash: true) # Build the period @period = Period.custom(start_date: @start_date, end_date: @end_date) @@ -50,9 +46,8 @@ class ReportsController < ApplicationController @end_date = parse_date_param(:end_date) || default_end_date # Validate and fix date range if end_date is before start_date - if @start_date > @end_date - @start_date, @end_date = @end_date, @start_date - end + # Don't show flash message since we're returning CSV data + validate_and_fix_date_range(show_flash: false) @period = Period.custom(start_date: @start_date, end_date: @end_date) @@ -106,6 +101,14 @@ class ReportsController < ApplicationController private + def validate_and_fix_date_range(show_flash: false) + return unless @start_date > @end_date + + # Swap the dates to maintain user's intended date range + @start_date, @end_date = @end_date, @start_date + flash.now[:alert] = t("reports.invalid_date_range") if show_flash + end + def ensure_money(value) return value if value.is_a?(Money) # Value is numeric (BigDecimal or Integer) in dollars - pass directly to Money.new diff --git a/test/controllers/reports_controller_test.rb b/test/controllers/reports_controller_test.rb index 0b35a6bfd..d597af925 100644 --- a/test/controllers/reports_controller_test.rb +++ b/test/controllers/reports_controller_test.rb @@ -106,8 +106,9 @@ class ReportsControllerTest < ActionDispatch::IntegrationTest # Should show flash message about invalid date range assert flash[:alert].present?, "Flash alert should be present" assert_match /End date cannot be before start date/, flash[:alert] - # Should display the swapped date range - assert_select ".text-sm.text-secondary", text: /Showing data from #{Regexp.escape(end_date.strftime("%b %-d, %Y"))} to #{Regexp.escape(start_date.strftime("%b %-d, %Y"))}/ + # Verify the response body contains the swapped date range in the correct order + assert_includes @response.body, end_date.strftime("%b %-d, %Y") + assert_includes @response.body, start_date.strftime("%b %-d, %Y") end test "spending patterns returns data when expense transactions exist" do