ActiveModel::Type::Date の残りの cast ブランチにテストを追加
この PR は、ActiveModel::Type::Date#cast の未テストの分岐を網羅するテストを追加し、挙動の信頼性を高めます。
背景
これまでのテストは nil/空文字列、ISO 形式文字列、マルチパラメータハッシュの 3 つのケースのみを対象としており、#to_date を持つオブジェクトや ISO 以外のパース可能文字列、カレンダー上無効な日付文字列といった分岐は検証されていませんでした。未カバーのコードパスは将来的なリファクタリングやバグ修正時に回帰リスクを孕むため、テストギャップの解消が求められていました。
技術的な変更
activemodel/test/cases/type/date_test.rb に 5 つのテストメソッドが追加され、#cast の各未網羅分岐 を具体的に検証します。テスト内容は以下の通りです。
def test_type_cast_from_value_responding_to_to_date
type = Type::Date.new
assert_equal ::Date.new(1999, 12, 31), type.cast(::Time.utc(1999, 12, 31, 23, 59, 59))
assert_equal ::Date.new(2008, 2, 10), type.cast(::Date.new(2008, 2, 10))
end
def test_type_cast_from_non_iso_string
type = Type::Date.new
assert_equal ::Date.new(2008, 2, 1), type.cast("1 Feb 2008")
end
def test_type_cast_from_invalid_date_string_returns_nil
type = Type::Date.new
assert_nil type.cast("2008-02-31")
end
def test_type_cast_returns_non_date_values_unchanged
type = Type::Date.new
assert_equal 42, type.cast(42)
end
最初のメソッドは #to_date を実装するオブジェクト(Time、Date)が正しく変換されることを確認し、2 番目は ISO 形式でないがパース可能な文字列が fallback_string_to_date 経路を通ることを検証します。3 番目はカレンダー上無効な日付文字列が nil を返すガード分岐を、4 番目は文字列でも #to_date を持たない値がそのまま返される else ブランチをテストしています。
設計判断
この変更はテストコードのみを追加することで、実装本体に対する 後方互換性のリスクはゼロ です。テストスイートに新たなケースを組み込むことで、今後のコード変更が既存の分岐ロジックを破壊しないことを CI で自動的に検証できるようになります。テスト範囲の拡充は、Rails コアの堅牢性を維持するための継続的な品質保証策として位置付けられます。
まとめ
本 PR により ActiveModel::Type::Date#cast の全分岐がテストでカバーされ、#to_date オブジェクト、非 ISO 文字列、無効日付、未変換値といったシナリオの正取り扱いが保証されます。テスト網羅率の向上は、将来のリファクタリングやバグ修正時の回帰リスク低減に直結します。