Iso2022JpMailer 再挑戦

script/plugin install で、と思ったらリダイレクトされているようでコマンドベースで上手に入らぬ。くまくま本方式で再度チャレンジ。
script/console で見てみた結果は UTF に見えたのですが、rake test:units は微妙な調整後 (何)、通りました。vendor/plugins に投入する方式は何が原因でコード変換されていなかったか、という部分はきちんと調べた方が良いな。

で、次は機能試験。test/functionals/articles_controller_test.rb の test_comment_post というメソドでコメント投稿の試験をしている模様。

  def test_comment_post
    init_comment_num = Article.find(1).comments.length

    post :comment, :id => 1, :comment => { :body => "comment_body", :author => "yoshii", :url => "127.0.0.1"}
    assert_response :success
    assert_template '_comment'

    assert_equal init_comment_num + 1, Article.find(1).comments.length
  end

確認してるのは、画面遷移と レコード件数の確認、となっている。AWDwR では subject、to、body の検査をしてるけどメイルが送信されてる事、が確認できればヨシ、とする。(を

ので、試験としては以下のような感じ??

  def test_comment_post
    emails = ActionMailer::Base.deliveries
    emails.clear

    init_comment_num = Article.find(1).comments.length

    post :comment, :id => 1, :comment => { :body => "comment_body", :author => "yoshii", :url => "127.0.0.1"}
    assert_response :success
    assert_template '_comment'

    assert_equal 1, emails.size

    assert_equal init_comment_num + 1, Article.find(1).comments.length
  end

で、app/controllers/article_controller.rb の comment メソドは以下のような形で実装、と。

  def comment 
    @article = Article.find(@params["id"])    
    @comment = Comment.new(@params["comment"])
    @comment.article = @article
    @comment.ip = request.remote_ip

    if @request.post? and @comment.save      
      CommentMailer.deliver_input(@comment)

      @comment.body = ""
      
      cookies['author']  = { :value => @comment.author, :expires => 2.weeks.from_now } 
      cookies['url']     = { :value => @comment.url, :expires => 2.weeks.from_now } 
      
      render_partial("comment", @comment)      
    else
      render_partial("comment_error", @comment)
    end
  end  

機能試験も通りましたな (当たり前)。試験環境でも正常動作。いえーい。

次のタスクは kernel のナニ or 動作しなかった原因追求??

追記

一応、model と unit test も以下に控えておく。

app/models/comment_mailer.rb

class CommentMailer < Iso2022jpMailer

  def input(comment, sent_at = Time.now)
    @subject    = base64('コメント投稿通知')
    @body       = { :comment => comment.body,
      :title => Article.find(comment.article_id).title, 
      :posted_by => comment.created_at, 
      :email => comment.email, 
      :url => comment.url, 
      :ip => comment.ip }
    @recipients = "#{User.find(Article.find(comment.article_id).user_id).email}"
    @from       = ''
    @sent_on    = sent_at
    @headers    = {}
  end
end

test/unit/comment_mailer_test.rb

require File.dirname(__FILE__) + '/../test_helper'
require 'comment_mailer'

class CommentMailerTest < Test::Unit::TestCase
  fixtures :contents, :comments, :users

  FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures'
  CHARSET = "iso-2022-jp"

  include ActionMailer::Quoting

  def base64(text, charset="iso-2022-jp", convert=true)
    if convert
      if charset == "iso-2022-jp"
        text = NKF.nkf('-j -m0', text)
      end
      text = [text].pack('m').delete("\r\n")
      "=?#{charset}?B?#{text}?="
    end
  end

  def setup
    ActionMailer::Base.delivery_method = :test
    ActionMailer::Base.perform_deliveries = true
    ActionMailer::Base.deliveries = []

    @expected = TMail::Mail.new
    @expected.set_content_type "text", "plain", { "charset" => CHARSET }
  end

  def test_input
    @expected.subject = base64('コメント投稿通知')
    @expected.body    = NKF.nkf('-j', read_fixture('input').to_s)
    @expected.date    = Time.now
    @expected.to      = @number1_user.email

    assert_equal @expected.encoded, CommentMailer.create_input(@comment2, @expected.date).encoded
  end

  private
    def read_fixture(action)
      IO.readlines("#{FIXTURES_PATH}/comment_mailer/#{action}")
    end

    def encode(subject)
      quoted_printable(subject, CHARSET)
    end
end

微妙な部分があるんですが、スルーかなぁ。
↓このあたり

    @expected.to      = @number1_user.email