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