概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: A bug that only appears once a year | Arkency Blog
- 原文公開日: 2017/10/28
- 著者: Anton Paisov
- サイト: Arkency Blog
日本語タイトルは内容に即したものにしました。
Ruby: 年に1度だけ発生する夏時間バグ(翻訳)
特定の状況でのみ発生するバグがあります。そうしたバグのひとつを踏んだのがまさに今日だったのです(これがヒント)。
小さな変更を加えてpushしたところ、ビルドに失敗しました。修正箇所に対応するテストも更新済みだったので、ビルドの失敗は想定外でした。
例外が発生したのはTicketTransferPolicy
という、今回の変更と何の関係もない部分でした。そういうわけで調査を開始しました。
raise DeadlinePassed if deadline_passed?(event)
def deadline_passed?(event)
if FT.on?(:extended_tickets_transfer_deadline, organizer_id: event.user_id)
event.ends_at < Time.current
else
event.starts_at < Time.current.advance(days: 1)
end
end
ヒント: テストの失敗はdeadlineの延長とは無関係です。
失敗したテストをじっくり見てみたところ、ふいに次の行が目に止まりました。
event = test_organizer.create_published_event(starts_at: 25.hours.from_now)
その瞬間なるほどと腑に落ちました。今日は1日が25時間になる日じゃないですか。
訳注: 多くの場合夏時間が始まる日は1日が23時間、夏時間が終わる日は1日が25時間という扱いになります。ただし一部地域では1時間ではなく30分や45分のずれになるところもあります。
個人的には、ここでは25.hours.from_now
ではなくTime.current.advance(days: 1, hours: 1)
というテストを書くのが、テストの一貫性からもベストだと思います。25
を26
に変えても動きますが😢。
それもこれも夏時間(DST、サマータイムとも)のおかげですよ😜。