require "test_helper" class PeriodTest < ActiveSupport::TestCase test "raises validation error when start_date or end_date is missing" do error = assert_raises(ActiveModel::ValidationError) do Period.new(start_date: nil, end_date: nil) end assert_includes error.message, "Start date can't be blank" assert_includes error.message, "End date can't be blank" end test "raises validation error when start_date is not before end_date" do error = assert_raises(ActiveModel::ValidationError) do Period.new(start_date: Date.current, end_date: Date.current - 1.day) end assert_includes error.message, "Start date must be before end date" end test "can create custom period" do period = Period.new(start_date: Date.current - 15.days, end_date: Date.current) assert_equal "Custom Period", period.label end test "from_key returns period for valid key" do period = Period.from_key("last_30_days") assert_equal 30.days.ago.to_date, period.start_date assert_equal Date.current, period.end_date end test "from_key with invalid key and no fallback raises error" do error = assert_raises(Period::InvalidKeyError) do Period.from_key("invalid_key") end end test "label returns correct label for known period" do period = Period.from_key("last_30_days") assert_equal "Last 30 Days", period.label end test "label returns Custom Period for unknown period" do period = Period.new(start_date: Date.current - 15.days, end_date: Date.current) assert_equal "Custom Period", period.label end test "comparison_label returns correct label for known period" do period = Period.from_key("last_30_days") assert_equal "vs. last month", period.comparison_label end test "comparison_label returns date range for unknown period" do start_date = Date.current - 15.days end_date = Date.current period = Period.new(start_date: start_date, end_date: end_date) expected = "#{start_date.strftime("%b %d, %Y")} to #{end_date.strftime("%b %d, %Y")}" assert_equal expected, period.comparison_label end end