アカウント削除を即時ではなく予約に変更する際に、削除予約日時と削除予定日時のカラムを追加して、現在日時と現在日時+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.currentdelete 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.currentdelete 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