Repository navigation
test: 検索テストの日付条件が実行時刻に依存して 0 件になるのを修正 - #102
dotani1111 wants to merge 1 commit into
Conversation
- getCreateDate() は同一インスタンスを返すため、review_start の -2日と review_end の +2日の modify が相殺し、review_end が create 当日になっていた - create_date は UTC 保存・検索日付は JST 解釈のため、JST 0:00〜8:59 の実行では 当日日付の review_end が検索範囲外となり 0 件になる - clone してから modify し、±2日のウィンドウを意図どおりにする Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ttokoro20240902
left a comment
There was a problem hiding this comment.
PR 102 レビュー — test: 検索テストの日付条件が実行時刻に依存して 0 件になるのを修正
- base
4.4/ headdev/4.4-fix-search-test-date@a9fc42d/ CI: 8/8 green(CodeRabbit は base ブランチ無効でスキップ) - 作成 2026-08-20(報告直前に HEAD 再確認済み)
- 総評: マージ可。差分はテストコード 3 行のみで、原因分析・修正内容ともに妥当。
\DateTimeは可変でmodify()が同一インスタンスを破壊的に変更するため-2 days→+2 daysが相殺し、review_endが投稿当日になっていた点をcloneで正しく解消できている。PR 記載の失敗条件(JST 0:00〜8:59)も、上限が「投稿当日の翌日 0 時 JST = 当日 15 時 UTC」になることと、実際の失敗 run(JST 8:42 = UTC 23:42)が一致しており整合的。指摘は任意対応の 2 件のみ。
指摘一覧
| ID | 重大度 | 確信度 | ステータス | 該当 | 指摘 |
|---|---|---|---|---|---|
| R1 | 低 | 高 | 任意 | Tests/Web/ReviewAdminControllerTest.php:314 |
コメントが「clone を外すと何が起きるか」まで残っていない |
全体指摘(行に紐づかないもの)
| ID | 重大度 | 指摘 | 提案 |
|---|---|---|---|
| R2 | 情報 | テスト側で ±2 日のマージンを取る方針は妥当だが、根本にある「create_date は UTC・検索フォームの日付は JST 解釈」というズレ自体は製品コード側(Repository/ProductReviewRepository.php:99-106 の review_end + 1 日)に残る |
本 PR の範囲外。管理画面の投稿日検索の境界挙動(MySQL/PostgreSQL 差を含む)を follow-up issue で確認する価値あり |
評価できる点
- 「相殺して 0 幅になる」という気付きにくい原因を、
review_endを投稿当日/翌日に変えて 0 件・1 件を確認するという再現手順で裏取りしている。 - 修正が ±2 日のウィンドウを意図どおり効かせることで、タイムゾーン差(最大 ±14 時間)に対して十分なマージンを確保できている(上限は投稿の 3 日後 0 時)。
- 同種パターンの他箇所が無いことも確認できる範囲(
git grep 'modify('は本ファイルとリポジトリの +1 日処理のみ)で、修正漏れが無い。 - 修正をテストコードに限定し、互換性チェックリストもその旨を明記している。
| 'recommend_level' => $review->getRecommendLevel(), | ||
| 'review_start' => $review->getCreateDate()->modify('-2 days')->format('Y-m-d'), | ||
| 'review_end' => $review->getCreateDate()->modify('+2 days')->format('Y-m-d'), | ||
| // getCreateDate() は同一インスタンスを返すため、modify で共有状態を壊さないよう clone する |
There was a problem hiding this comment.
R1(重大度 低・確信度 高・任意) コメントが「clone を外すと何が起きるか」まで残っていない
- 事実: コメントは「同一インスタンスを返すため共有状態を壊さないよう clone する」まで。実際の障害は ±2 日が相殺してウィンドウが実質 0 幅になり、UTC/JST 差で検索結果が 0 件になることだが、そこは書かれていない。
- 影響: 将来の読み手が「防御的な clone」と解釈して外す・整理する余地が残り、同じ時刻依存の失敗が再発しうる。
- 提案: 「clone しないと ±2 日が相殺して review_end が投稿当日になり、UTC/JST 差により JST 0:00〜8:59 実行で 0 件になる」旨を 1 行足す。
概要(Overview・Refs Issue)
JST 0:00〜8:59 に CI が実行されると
testReviewSearch/testDownloadCsvが必ず失敗する、テストの時刻依存バグを修正します。#101 の CI(JST 8:42 実行)で 8 ジョブすべてが同じ 2 テストで失敗し発覚しました(該当 run)。
4.4 ブランチ自体の問題のため、push CI や他 PR でも実行時刻によって再現します。
原因
initForm()が検索条件の日付を作る際、getCreateDate()が返す同一の DateTime インスタンスにmodify('-2 days')→modify('+2 days')を順に適用しているため相殺し、review_endが「投稿の 2 日後」ではなく「投稿当日」の日付になります。これ単体では成立します(リポジトリ側が
review_endに +1 日して終端にするため)が、create_date は UTC で保存され、検索フォームの日付は JST として解釈されるため、終端は「JST 翌日 0 時 = UTC 当日 15 時」になります。UTC 15:00 以降(= JST 0:00〜8:59)に実行すると「UTC now」の create_date が終端を過ぎ、検索が 0 件になります。
裏取りとして、
review_endを投稿当日にすると 0 件・翌日にすると 1 件になることをローカルで確認しています。方針(Policy)
cloneしてからmodifyし、±2 日の検索ウィンドウを意図どおりにする(3 行の修正)テスト(Test)
マイナーバージョン互換性保持のための制限事項チェックリスト
※ 変更はテストコードのみです。
レビュワー確認項目
🤖 Generated with Claude Code