20190708 Issue Badgeのテストの修正とモック対応。
シンプルにブログを書く、の2日目。はてなの31本目になります。
今日は保留にしておいた、Redmine Issue Badge PluginのRedmine4.x対応をちょっとしました。
Hi! I've just released Redmine Issue Badge Plugin v0.1.0.
— たかのあきこ@freeCodeCamp攻略中 (@akiko_pusu) July 8, 2019
Supporting Redmine.4.x :) Feedback. translations highly appreciate!#redminehttps://t.co/bQm2cwydSs
テストについて
この中で、以下のようなテストをしています。
- ユーザを作成(最初はAdmin設定なし)
- マイページにアクセスして、バッジ表示設定をONにする
- ユーザを管理者に変更する(updateする)
- 管理者権限でRedmineの設定画面のプラグイン調整画面にアクセスする
この 「ユーザを管理者に変更する」処理で、user.update(admin: true) という処理をしています。
エラーが出るようになった
こちら自体は、以前もテストコードで同じ操作で問題はなかったのですが、Redmine4対応分を1年くらい前から準備してその後放置していたら、今年になってテストを回した時にエラーが発生してしまいました。
なぜ?と思ったら、「ユーザを管理者にする・管理者から外す」といった特権に関わる操作では、セキュリティ上の重要イベント?としてメールを飛ばすようになっていて、そのあたりの挙動がちょっと変わったためのようでした。
これは、user.rb の中で、ユーザ情報を保存(更新)したあとに、通知メールを飛ばす処理が走ることに関連します。
after_save :update_notified_project_ids, :destroy_tokens, :deliver_security_notification
ここで、gistに貼ったように、Mailer.deliver_security_notification が呼ばれます。この通知がうまく出せないので、ユーザをAdminに昇格させる処理が実施できず、結果的にはAdmin権限を期待したテストが失敗しちゃう、というものです。
Redmine側の関連チケット
こちらになります。
とりあえずあまりよくわかっていないのですが、この関連で after_saveのところ. -> メール送信のところで失敗になっていることだけはわかったので、さて、テストをどうするか。
deliver_security_notificationをモックにする
これでなんとかOK。
いったんはこれでしのぎましたが、after_saveを一時的に無効化するという手段もあるので、そちらも合わせてつけておきます。(なるべく影響を少なくする、という点では allow ... のモックのほうがいいのかも)
deliver_security_notificationの無効(その2)
簡単な例ですが、「yieldを使うのもありかな」と思えたのは、チェリー本 (プロを目指す人のためのRuby入門)のおかげかなと思っています!