試験 green になったんですが

何を盛り込まねば、なのかが忘却の彼方。今日色んな事を五月雨式にヤッツケてたので後天性記憶不全もかなり激しいカンジ。
rails s で見てみるに

  • Provider は選択式になっていない
  • provider な controller は admin のみ

今は rails g したばっかの状態で試験 green になるようにしただけなのか。

したこと

spec/support/request_helper.rb を以下なカンジに。

module RequestHelpers
  def create_logged_in_user
    conn = FactoryGirl.create :conn
    user = User.find(conn.user_id)
    user.confirm!
    user.save!
    login(user)
    user
  end
 
  def login(user)
    login_as user, scope: :user, :run_callbacks => false
  end

end

あるいは spec/support/controller_macros.rb のログインなナニも同様に修正。

  def login_user
    controller.stub(:authenticate_user!).and_return true
    @request.env["devise.mapping"] = Devise.mappings[:user]
    conn = FactoryGirl.create(:conn)
    user = User.find(conn.user_id)
    user.confirm!
    sign_in user
  end

ということで

機能盛り込み着手。とりあえず provider な controller が admin からしか見えない、というソレからなのかどうか。spec/factories.rb に以下を追加。

  factory :adminuser do
#    id 2
    email    "fuga@example.com"
    password "foobarbaz"
    password_confirmation "foobarbaz"
    admin true
  end

で、spec/support/controller_macros.rb の login_admin を以下に。

  def login_admin
    @request.env["devise.mapping"] = Devise.mappings[:admin]
    sign_in FactoryGirl.create(:adminuser)
  end

えーと、その前に admin ではない人は redirect される、って試験が必要なのか。ちなみに spec/request で使われてる login なメソドは controller_macros ではなかったはず。spec/support/request_helpers.rb か。
とりあえず、ということで以下に。

describe "Providers" do
  describe "user who do not have privilege" do
    before do
      create_logged_in_user
    end

    describe "GET /providers" do
      it "returns HTTP status 302" do
        get "/providers"
        response.status.should be(302)
      end
    end

    describe "GET /providers/new" do
      it "returns HTTP status 302" do
        get "/providers/new"
        response.status.should be(302)
      end
    end

    describe "GET /providers/0/edit" do
      it "returns HTTP status 302" do
        get "/providers/0/edit"
        response.status.should be(302)
      end
    end

    describe "GET /providers/0" do
      it "returns HTTP status 302" do
        get "providers/0"
        response.status.should be(302)
      end
    end
  end
end

試験実行してみましたが普通に何かをしようとして試験失敗。とりあえずフィルタなメソド追加して controller の before_filter な指示をしてあげれば良いのだと思いますが、メソド定義はどこですべきか。
面倒なので app/helpers/application_helper.rb にて以下を定義。

module ApplicationHelper
  def authenticate_admin!
    unless current_user.admin?
      redirect_to :controller => 'conns', :action => 'index'
    end
  end
end

で、controller で以下を指定なのか。

class ProvidersController < ApplicationController
  before_filter :authenticate_user!
  before_filter :authenticate_admin!

で、試験実行してみたんですが、authenticate_admin! が無いと叱られる。確認してみるに共通な filter は app/controllers/application.rb に定義とのこと。わははは。そりゃそうか。移動したら見事に試験パス。次は admin でログインしたナニを書けば良いのね。
ええと、spec/factories.rb を以下に修正。つうか以下を追加。

  factory :adminuser, class: User do
#    id 2
    email    "fuga@example.com"
    password "foobarbaz"
    password_confirmation "foobarbaz"
    admin true
  end

で、以下な試験を追加。

  describe "user who have privilege" do
    before do
      create_logged_in_admin_user
      @provider = FactoryGirl.create :provider
    end

    describe "GET /providers" do
      it "returns HTTP status 200" do
        get "/providers"
        response.status.should be(200)
      end
    end

    describe "GET /providers/new" do
      it "returns HTTP status 200" do
        get "/providers/new"
        response.status.should be(200)
      end
    end

    describe "GET /providers/1/edit" do
      it "returns HTTP status 200" do
        get "/providers/1/edit"
        response.status.should be(200)
      end
    end

    describe "GET /providers/1" do
      it "returns HTTP status 200" do
        get "providers/1"
        response.status.should be(200)
      end
    end
  end

これでフィルタされてる動作は保証されてる、ってことで良いのかな。

次に移る前に

デグレードな試験してみたら沢山の red がナニ。providers_controller な試験なのでこれから修正を。 つうか例えば以下な試験だと

  describe "GET index" do
    it "assigns all providers as @providers" do
      provider = Provider.create! valid_attributes
      get :index, {}, valid_session
      assigns(:providers).should eq([provider])
    end
  end

以下な実装で

  def index
    @providers = Provider.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @providers }
    end
  end

試験は成功しそうな気がするんですが、結果を見るに @providers は nil になってるな。つうか確認してみたら試験は全部失敗している。もしかしてこれって

  def valid_session
    {}
  end

てのがアレなのかどうなのか。

他の controller な試験見てみたんですが、観点が全然違っててorz
今日はここで止めます。つうか他の controller な試験見よ。