前回(Railsでイベントの通知をモデリングする)の続きです。
通知モデルのユニットテストを実装します。
通知モデル(Notification)はデフォルトで処理前(processed: false)になる。
test/models/notification_test.rb
class NotificationTest < ActiveSupport::TestCase
test "processed デフォルト値" do
sut = Notification.create! scheduled_at: Time.current
assert_not sut.processed
end
次に処理待ちの通知スコープ(waited)のテストを実装する。
予定日時を軸にテストを3つに分けた。
・対象外(過去)
・対象
・対象外(未来)
対象外(過去)
過去の通知は対象外になる。
現在時刻と比較しやすいようにfreeze_timeで時間を止める。
test "waited 対象外(過去)" do
expected_count = 0
freeze_time do
Notification.delete_all
Notification.create! scheduled_at: 1.year.before
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の1年前(過去)"
Notification.delete_all
Notification.create! scheduled_at: 2.days.before
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の2日前(過去)"
Notification.delete_all
Notification.create! scheduled_at: (1.day + 1.second).before
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の1日と1秒前(過去)"
end
end
対象
通知対象のテストを実装する。
1日前から現在時刻までが対象になる。
test "waited 対象" do
expected_count = 1
freeze_time do
Notification.delete_all
Notification.create! scheduled_at: 1.day.before
assert_equal expected_count,
Notification.waited.count, "対象:予定日時が現在日時の1日前(過去)"
Notification.delete_all
Notification.create! scheduled_at: 1.minute.before
assert_equal expected_count,
Notification.waited.count, "対象:予定日時が現在日時の1分前(過去)"
Notification.delete_all
Notification.create! scheduled_at: Time.current
assert_equal expected_count,
Notification.waited.count, "対象:予定日時が現在時刻"
end
end
対象外(未来)
未来の通知は対象外になる。
test "waited 対象外(未来)" do
expected_count = 0
freeze_time do
Notification.delete_all
Notification.create! scheduled_at: 1.minute.after
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の1分後(未来)"
Notification.delete_all
Notification.create! scheduled_at: 1.day.after
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の1日後(未来)"
Notification.delete_all
Notification.create! scheduled_at: 2.days.after
assert_equal expected_count,
Notification.waited.count, "対象外:予定日時が現在日時の2日後(未来)"
end
end
最後に通知メソッド(notify)のテストを実装する。
通知後は処理済みになる。
test "notify" do
freeze_time do
Notification.delete_all
sut = Notification.create! scheduled_at: Time.current
Notification.notify
assert sut.reload.processed, "notify後は処理済み"
end
end
以上です。
▼この記事がいいね!と思ったらブックマークお願いします