Skip to content

test: 検索テストの日付条件が実行時刻に依存して 0 件になるのを修正 - #102

Open
dotani1111 wants to merge 1 commit into
EC-CUBE:4.4from
dotani1111:dev/4.4-fix-search-test-date
Open

dotani1111 wants to merge 1 commit into
EC-CUBE:4.4from
dotani1111:dev/4.4-fix-search-test-date

Conversation

@dotani1111

Copy link
Copy Markdown

概要(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 行の修正)
  • ±2 日が正しく効けば終端は投稿の 3 日後 JST 0 時となり、タイムゾーン差(最大 ±14 時間)では範囲外になり得ません

テスト(Test)

  • PHPUnit: 18 tests / 47 assertions すべて成功(ローカル)

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更はありません
  • フックポイントの呼び出しタイミングの変更はありません
  • フックポイントのパラメータの削除・データ型の変更はありません
  • twigファイルに渡しているパラメータの削除・データ型の変更はありません
  • Serviceクラスの公開関数の、引数の削除・データ型の変更はありません
  • 入出力ファイル(CSVなど)のフォーマット変更はありません

※ 変更はテストコードのみです。

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか
    • 権限を超えた操作が可能にならないか
    • 不要なファイルアップロードがないか
    • 外部へ公開されるファイルや機能の追加ではないか
    • テンプレートでのエスケープ漏れがないか

🤖 Generated with Claude Code

- 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>
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ba3d28e6-bcdb-45fc-bc4f-790c883c92b6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ttokoro20240902 ttokoro20240902 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 102 レビュー — test: 検索テストの日付条件が実行時刻に依存して 0 件になるのを修正

  • base 4.4 / head dev/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 する

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

R1(重大度 低・確信度 高・任意) コメントが「clone を外すと何が起きるか」まで残っていない

  • 事実: コメントは「同一インスタンスを返すため共有状態を壊さないよう clone する」まで。実際の障害は ±2 日が相殺してウィンドウが実質 0 幅になり、UTC/JST 差で検索結果が 0 件になることだが、そこは書かれていない。
  • 影響: 将来の読み手が「防御的な clone」と解釈して外す・整理する余地が残り、同じ時刻依存の失敗が再発しうる。
  • 提案: 「clone しないと ±2 日が相殺して review_end が投稿当日になり、UTC/JST 差により JST 0:00〜8:59 実行で 0 件になる」旨を 1 行足す。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants