Redmine プラグインチュートリアル for V4.x系 国際化対応とテスト追加

※ 本記事は [Redmine Advent Calendar 2020] (https://adventar.org/calendars/5392)の 21 日目の記事の続きです。

## 初めに
[Redmine プラグインチュートリアル for V4.x系](https://qiita.com/rbtgr/items/12a1f33361700359e235)で、チュートリアルを一通り実施しました。
これだけでは少し物足りなので、ここからは本家原文にない、ちょっとしたおまけです。
国際化対応(言語切り替え対応)と、テストを追加してみましょう。

### 確認環境

* Ruby 2.6.6
* Rails 5.2.4.4
* Redmine 4.1.1
* 作成したプラグイン https://github.com/rbtgr/redmine_plugin_tutorial_polls

## 国際化対応

#### 日本語設定ファイル(ja.yml)の作成

プラグイン作成時に、英語表示の設定ファイルは、自動で作成されます。

チュートリアの`権限の追加` の章での内容にさらに、`label_poll: Poll`を追加して以下のようにします。

```yml:plugins/polls/config/locales/en.yml
"en":
  permission_view_polls: View Polls
  permission_vote_polls: Vote Polls
  label_poll: Polls
```

同様に日本語表示の設定ファイルを作成します。

```yml:plugins/polls/config/locales/ja.yml
"ja":
  permission_view_polls: 投票 閲覧権限
  permission_vote_polls: 投票 投票権限
  label_poll: 投票
```

次はメニューのキャプションを国際化対応します


```rb:plugins/polls/init.rb
# (中略)
  menu(
    :project_menu,
    :polls,
    { controller: 'polls', action: 'index' },
    caption: :label_poll,
    after: :activity,
    param: :project_id
  )
```

これで、メニューや権限設定画面が日本語化されます


#### 表示文言の国際化対応 (lメソッド)

Viewでの国際化対応には、`lメソッド(えるめそっど)`を使います。余談ですが、本家Railsでは、tメソッドを使いますが、RedMineではlメソッドに置き換わっています。若干紛らわしいの注意ですね。

[Redmine 4.0(Rails 5.1)でのプラグイン作成について - torutkのブログ](https://torutk.hatenablog.jp/entry/20180505/p1)
[Redmine Glossaryプラグイン再構築 - ソフトウェアエンジニアリング - Torutk](https://www.torutk.com/projects/swe/wiki/Redmine_Glossary%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E5%86%8D%E6%A7%8B%E7%AF%89)

```erb:plugins/polls/app/views/polls/index.html.erb

<% content_for :header_tags do %>
    <%= stylesheet_link_tag 'voting', plugin: 'polls' %>
<% end %>
<% html_title l(:label_poll)%>

<h2><%=l(:label_poll)%></h2>
・・・
```

これで表示文言が変更されます。

## テストの追加

チュートリアルのテストでは、Polllコントローラのindexで、Poll画面を開くテストだけですが、voteで「投票できているか」をテストできるようにしてみます。

### fixture の作成

voteのテストを行うためには、DBにテストのためのPollモデルのデータを用意しておく必要があります。
そのためにFixtureをいう機能を使います。

`polls.yml`というファイルを作成し、以下のように記載します。

```yml:plugins/polls/test/fixtures/polls.yml
polls_001:
  id: 1
  question: テスト質問
  'yes': 0
  'no': 0
```
注意：yes と no は'(シングルクオテーション)で囲まないとエラーになります。
(ここでかなり悩みました)

> [Rails テスティングガイド - Railsガイド](https://railsguides.jp/testing.html)
4.2.2 YAML
・・・
'yes'や'no'などのYAMLキーワードに似たキーについては、引用符で囲むことでYAMLパーサーが正常に動作できます。


### test_indexの修正と、test_voteの追加

既存の`test_index` の修正と合わせて、下記の`test_vote` を追加します。

```rb:plugins/polls/test/functional/polls_controller_test.rb
require File.expand_path('../../test_helper', __FILE__)

class PollsControllerTest < ActionController::TestCase
  fixtures :projects, :users
  plugin_fixtures :polls

  def test_index
    # プロジェクトメンバーのセッション
    @request.session[:user_id] = 2

    # ロールに権限を追加
    Role.find(1).add_permission! :view_polls

    # 特定のモジュールの有効/無効を切り替える
    #roject.find(1).enabled_module_names = [:mymodule]

    get :index, :params => {project_id: 1}
    assert_response :success
    assert_template 'index'
  end

  def test_vote
    @request.session[:user_id] = 2
    Role.find(1).add_permission! :view_polls, :vote_polls

    post :vote, :params => {id: 1, answer: 'yes' }
    assert_redirected_to "/polls"

    get :index, :params => {project_id: 1}
    assert_include 'Yes</a> (1)', response.body
  end
end
```

正直、この辺の描きっぷりは、あまり自信のないところです。
あとでもう少ししっかりした書き方を確認したい・・・