アカウント削除を即時ではなく予約に変更する際に、削除予約日時と削除予定日時のカラムを追加して、現在日時と現在日時+7日が入るかのテスト書きました。
Time.currentで、日時を設定するタイミングが異なるので、普通にやると微妙にズレますね。
なので、開始前と終了後の間に入っているかで評価するようにしました。

普通にSpecを書いてみる

spec/routing/users/registrations_routing_spec.rb に追加

  # DELETE /users アカウント削除(処理)
  describe 'DELETE /users' do
    context 'ログイン中、削除予定日時がない' do
      include_context 'ログイン処理', false
      it '削除予約日時が現在日時と一致' do
        delete user_registration_path
        expect(User.last.delete_reserved_at).to eq(Time.current)
      end
      it "削除予定日時が#{Settings['delete_schedule_days']}日後と一致" do
        delete user_registration_path
        expect(User.last.delete_schedule_at).to eq(Time.current + Settings['delete_schedule_days'].days)
      end
    end
    context 'ログイン中、削除予定日時がある' do
      # TODO
    end
  end

config/settings.yml に追加

delete_schedule_days: 7

Tips: Time.nowよりもTime.currentを使った方が良いらしいです。
サーバーの環境変数参照するか、application.rbのtime_zoneを参照するかの違い。

$ rspec spec/requests/users/registrations_spec.rb
Failures:

  1) Users::Registrations DELETE /users ログイン中、削除予定日時がない 削除予約日時が現在日時と一致
     Failure/Error: expect(User.last.delete_reserved_at).to eq(Time.current)
     
       expected: 2020-08-02 10:53:09.563344000 +0900
            got: 2020-08-02 10:53:09.558092000 +0900
     
  2) Users::Registrations DELETE /users ログイン中、削除予定日時がない 削除予定日時が7日後と一致
     Failure/Error: expect(User.last.delete_schedule_at).to eq(Time.current + Settings['delete_schedule_days'].days)
     
       expected: 2020-08-09 10:53:09.605313000 +0900
            got: 2020-08-09 10:53:09.601200000 +0900

8 examples, 2 failures

予想通り、日時をセットするタイミングと、評価するタイミングが微妙にズレますね。

Specを直す

リクエスト前に現在日時を保存して、評価時に現在との間にあるか評価するようにします。
追記:DBによりms以下が切り捨てられるので、.floorでstart_timeを切り捨て。

spec/routing/users/registrations_routing_spec.rb を変更

+      let!(:start_time) { Time.current.floor }
       it '削除予約日時が現在日時と一致' do
+        start_time = Time.current
         delete user_registration_path
-        expect(User.last.delete_reserved_at).to eq(Time.current)
+        expect(User.last.delete_reserved_at).to be_between(start_time, Time.current)
       end
       it "削除予定日時が#{Settings['delete_schedule_days']}日後と一致" do
+        start_time = Time.current
         delete user_registration_path
-        expect(User.last.delete_schedule_at).to eq(Time.current + Settings['delete_schedule_days'].days)
+        expect(User.last.delete_schedule_at).to be_between(start_time + Settings['delete_schedule_days'].days, Time.current + Settings['delete_schedule_days'].days)
       end
$ rspec spec/requests/users/registrations_spec.rb
8 examples, 0 failure

【参考】ここまでのコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/41de540a3645b82b6882153056f203976636b13a

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です