String#truncate の omission が truncate_to を超えるケースをテスト追加
Rails の String#truncate は、:omission 文字列が指定した長さ (truncate_to) より長い場合、結果として omission 文字列だけが返ります。この挙動は公式ドキュメントに記載されていますが、実装を検証するテストが欠如していました。本 PR はそのエッジケースをカバーするテストを追加し、期待通りの動作が保証されることを明示します。
背景
String#truncate が omission longer than truncate_to の場合に全体長を超える可能性がある とドキュメントに記載されているものの、従来のテストスイートには該当シナリオがありませんでした。実装 (activesupport/lib/active_support/core_ext/string/filters.rb) では length_with_room_for_omission が負になると omission のみが返るロジックが存在しますが、未テストのまま残っていたため、回帰リスクが潜在していました。
技術的な変更
テストファイル activesupport/test/core_ext/string_ext_test.rb に以下のメソッドが追加されました。
def test_truncate_with_omission_longer_than_truncate_to
assert_equal "[truncated]", "Hello World!".truncate(3, omission: "[truncated]")
assert_equal "[...]", "Hello World!".truncate(2, omission: "[...]")
end
このテストは、truncate の第二引数 (truncate_to) が omission よりも短い場合に、結果が omission 文字列そのものになることを検証します。期待される出力は omission がそのまま返るケースと、長さがさらに制限された場合に省略記号が返るケースの二つです。コードロジック自体は変更せず、テストのみを追加するため、既存の機能やパフォーマンスに影響はありません。
設計判断
テストのみの追加 という選択は、既存実装が正しいことを裏付けるだけで機能変更を伴わない点が評価されています。Rails のコア拡張は多数のユーティリティメソッドを提供するため、ドキュメントと実装の一致を保証するテスト網は品質維持に不可欠です。今回の PR は、ドキュメント記載の例外ケースを明示的にテストし、将来的なリファクタリングやパラメータ変更時に意図しない振る舞いが導入されるリスクを低減します。
まとめ
String#truncate の omission が truncate_to を超えるシナリオを検証するテストが追加され、公式ドキュメント通りの挙動が自動的に保証されるようになりました。実装変更はなくテストだけでカバーすることで、既存コードへの影響を最小限に抑えつつ、エッジケースの回帰防止を実現しています。