`in_paginated_batches` スペックを `lease_connection` に移行し `permanent_connection_checkout = :disallowed` に対応
permanent_connection_checkout = :disallowed が有効な環境下でテストが失敗する問題を修正するため、ActiveRecord::Base.connection を ActiveRecord::Base.lease_connection に置き換えました。
背景
spec/support/rails_template.rb では、テスト環境を含むすべての環境に対して config.active_record.permanent_connection_checkout = :disallowed が設定されています。この設定が有効な場合、ActiveRecord::Base.connection を直接呼び出すとエラーが発生します。
in_paginated_batches のスペックでは、クエリキャッシュが無効化されていることを確認するために ActiveRecord::Base.connection.query_cache_enabled を呼び出していました。この呼び出しが上記の設定と衝突し、テストが失敗する原因となっていました。
permanent_connection_checkout = :disallowed は、コネクションを明示的にチェックアウトせずに connection を呼び出す実装上の問題を検出するための設定であり、この設定をすべての環境に適用することで潜在的なコネクション管理の問題を早期に発見できます。
技術的な変更
spec/unit/resource_controller/data_access_spec.rb 内の1行を置き換えることで対応しています。
変更前:
expect(ActiveRecord::Base.connection.query_cache_enabled).to be_falsy
変更後:
expect(ActiveRecord::Base.lease_connection.query_cache_enabled).to be_falsy
lease_connection は Rails 7.2 で導入された API で、permanent_connection_checkout = :disallowed の設定下でも安全にコネクションを取得できます。connection との違いは、リクエストやトランザクションのスコープに縛られない一時的なコネクションの借り出しを行う点にあります。
rails_template.rb 側の変更はなく、permanent_connection_checkout = :disallowed の設定は意図的にすべての環境に適用され続けます。
設計判断
テスト設定を緩和するのではなく、テストコード側を修正する方針が採用されました。
permanent_connection_checkout = :disallowed の設定を外す、あるいはテスト環境だけ除外するという選択肢もありましたが、本PRではその設定を維持したまま呼び出し側を修正しています。これは、同設定が本来の目的である「不適切なコネクション呼び出しの検出」を果たし続けるようにするための判断です。
テストの厳格さを下げることなく、Rails 7.2+ の推奨 API に沿った実装へ移行した変更といえます。
まとめ
1行の変更ながら、permanent_connection_checkout = :disallowed という厳格なコネクション管理ポリシーをテスト環境でも維持するための重要な修正です。lease_connection への移行は、Rails 7.2+ の推奨 API への準拠であり、コネクション管理の問題を隠蔽せず適切に検出できる状態を保ちます。