通知モデルのユニットテストを実装する

前回(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

以上です。



▼この記事がいいね!と思ったらブックマークお願いします
このエントリーをはてなブックマークに追加