From 7f5cf4c082af51d4fb3f16b2060c95751983a93d Mon Sep 17 00:00:00 2001 From: Mark Hendriksen Date: Mon, 10 Nov 2025 23:07:07 +0100 Subject: [PATCH] Add 'all_time' period option to Period model (#279) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add 'all_time' period option to Period model Introduces an 'all_time' period to the Period model, which spans from the family's oldest entry date to the current date. Includes tests to verify correct creation and date range calculation for the new period. * Update test/models/period_test.rb Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Mark Hendriksen * Improve 'all_time' period fallback logic Updates the 'all_time' period to use a 5-year fallback range when no family or entries exist, or when the oldest entry date is today. Adds tests to verify correct behavior for these edge cases. * Update period.rb --------- Signed-off-by: Mark Hendriksen Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Juan José Mata --- app/models/period.rb | 16 ++++++++++++++++ test/models/period_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/app/models/period.rb b/app/models/period.rb index 183c6ef8c..c3678bba4 100644 --- a/app/models/period.rb +++ b/app/models/period.rb @@ -69,6 +69,22 @@ class Period label_short: "10Y", label: "Last 10 Years", comparison_label: "vs. 10 years ago" + }, + "all_time" => { + date_range: -> { + oldest_date = Current.family&.oldest_entry_date + # If no family or no entries exist, use a reasonable historical fallback + # to ensure "All Time" represents a meaningful range, not just today + start_date = if oldest_date && oldest_date < Date.current + oldest_date + else + 5.years.ago.to_date + end + [ start_date, Date.current ] + }, + label_short: "All", + label: "All Time", + comparison_label: "vs. beginning" } } diff --git a/test/models/period_test.rb b/test/models/period_test.rb index eaea02c59..b7e3e4f5d 100644 --- a/test/models/period_test.rb +++ b/test/models/period_test.rb @@ -57,4 +57,42 @@ class PeriodTest < ActiveSupport::TestCase expected = "#{start_date.strftime("%b %d, %Y")} to #{end_date.strftime("%b %d, %Y")}" assert_equal expected, period.comparison_label end + + test "all_time period can be created" do + period = Period.from_key("all_time") + assert_equal "all_time", period.key + assert_equal "All Time", period.label + assert_equal "All", period.label_short + assert_equal "vs. beginning", period.comparison_label + end + + test "all_time period uses family's oldest entry date" do + # Mock Current.family to return a family with oldest_entry_date + mock_family = mock("family") + mock_family.expects(:oldest_entry_date).returns(2.years.ago.to_date) + Current.expects(:family).at_least_once.returns(mock_family) + + period = Period.from_key("all_time") + assert_equal 2.years.ago.to_date, period.start_date + assert_equal Date.current, period.end_date + end + + test "all_time period uses fallback when no family or entries exist" do + Current.expects(:family).returns(nil) + + period = Period.from_key("all_time") + assert_equal 5.years.ago.to_date, period.start_date + assert_equal Date.current, period.end_date + end + + test "all_time period uses fallback when oldest_entry_date equals current date" do + # Mock a family that has no historical entries (oldest_entry_date returns today) + mock_family = mock("family") + mock_family.expects(:oldest_entry_date).returns(Date.current) + Current.expects(:family).at_least_once.returns(mock_family) + + period = Period.from_key("all_time") + assert_equal 5.years.ago.to_date, period.start_date + assert_equal Date.current, period.end_date + end end