試験 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 な試験見よ。