日々是精進。(はてな館)

日々ネットで調べたり、付箋に書き留めたものをアップしています。子育てで中断しながらも、年に数回投稿しています。皆様の恩恵に感謝しつつ。

日々の記録を残しています。皆様の恩恵に感謝しつつ。

20190708 Issue Badgeのテストの修正とモック対応。

シンプルにブログを書く、の2日目。はてな31本目になります。

今日は保留にしておいた、Redmine Issue Badge PluginのRedmine4.x対応をちょっとしました。

テストについて

この中で、以下のようなテストをしています。

  • ユーザを作成(最初はAdmin設定なし)
  • マイページにアクセスして、バッジ表示設定をONにする
  • ユーザを管理者に変更する(updateする)
  • 管理者権限でRedmineの設定画面のプラグイン調整画面にアクセスする

この 「ユーザを管理者に変更する」処理で、user.update(admin: true) という処理をしています。

エラーが出るようになった

こちら自体は、以前もテストコードで同じ操作で問題はなかったのですが、Redmine4対応分を1年くらい前から準備してその後放置していたら、今年になってテストを回した時にエラーが発生してしまいました。

なぜ?と思ったら、「ユーザを管理者にする・管理者から外す」といった特権に関わる操作では、セキュリティ上の重要イベント?としてメールを飛ばすようになっていて、そのあたりの挙動がちょっと変わったためのようでした。

Redmineのfeature specでのエラー

 

これは、user.rb の中で、ユーザ情報を保存(更新)したあとに、通知メールを飛ばす処理が走ることに関連します。

after_save :update_notified_project_ids, :destroy_tokens, :deliver_security_notification

ここで、gistに貼ったように、Mailer.deliver_security_notification が呼ばれます。この通知がうまく出せないので、ユーザをAdminに昇格させる処理が実施できず、結果的にはAdmin権限を期待したテストが失敗しちゃう、というものです。

Redmine側の関連チケット

こちらになります。

Revision 17588 - Send emails asynchronously (#26791). Custom async_* delivery methods are rem... - Redmine

とりあえずあまりよくわかっていないのですが、この関連で after_saveのところ. -> メール送信のところで失敗になっていることだけはわかったので、さて、テストをどうするか。

deliver_security_notificationをモックにする

結局のところは、deliver_security_notification を呼び出すところをモックで対応することにしました。(allow_any_instance_of のところ)
    background do
      # Prevent to call User.deliver_security_notification when user is created.
      allow_any_instance_of(User).to receive(:deliver_security_notification).and_return(true)

      project.trackers << tracker
      member = Member.new(project: project, user_id: user.id)
      member.member_roles << MemberRole.new(role: role)
      member.save

      issues
      user.update(admin: true)
      log_user(user.login, user.login)
      visit '/settings/plugin/redmine_issue_badge'
    end

これでなんとかOK。

いったんはこれでしのぎましたが、after_saveを一時的に無効化するという手段もあるので、そちらも合わせてつけておきます。(なるべく影響を少なくする、という点では allow ... のモックのほうがいいのかも)

deliver_security_notificationの無効(その2)

 

簡単な例ですが、「yieldを使うのもありかな」と思えたのは、チェリー本 (プロを目指す人のためのRuby入門)のおかげかなと思っています!

daily-postit.hatenablog.com