stub!(:authenticate), tikam! pakai authenticate dan keluar controller

Posted: December 8, 2007 in ノート, Rails, RSpec, RUBY, Ruby on Rails, Technology

penerjemahan kata “tikam” dari stub itu memang jujur saya paksa biar jadi majas hiperbola. bukan niat hati ingin jadi kayak media rating tinggi hanya karna terlalu banyak pakai majas hiperbola bahkan menjadikan berita sepanjang 1 meter menjadi 1 juta kilometer. tapi saya sering suka mempraktekkan majas hiperbola ini untuk praktek mnemonics, ya, ada hukum di pembelajaran otak, makin ngaco, makin berlebih-lebihan, makin seksi, maka semakin gampang untuk diingat, misalkan ingin berbelanja ke supermarket supaya tidak perlu bawa bawa listing daftar yang ingin dibeli cukup dihapal aja, kalau mau beli pisang, bayangkan aja sewaktu Anda membuka pintu, pintu apapun itu, pintu rumahkah, pintu mal kah, di balik pintu itu ada kejutan berupa pisang raksasa lebat bercula tiga, dan kaki Anda tertindih olehnya. Rasakan itu benar-benar dan tanamkan benar-benar masuk ke dalam alam bawah sadar sebelum pergi keluar, niscaya akan mudah mengingatnya. Ini resep dari saya, berhubung saya orang visual, kalau Anda bukan orang visual, misalkan orang audio, maka tinggal asosiasikan semua contoh diatas tadi dengan suara-suara yang sangat menikam dan masuk ke dalam alam bawah sadar Anda. Begitu pula bila Anda orang kinestetik.

Ah, ayo kembali ke topik semula, BTW di paragraf atas tu kan ada kata-kata tikam lagi demi hebatnya efek tikaman itu hingga keluarlah apa yang diinginkan.

Topiknya untuk post ini adalah gimana mem-by-pass duh bahasa indonesianya melewatkan spec’ing saya kalau saya pakai Basic HTTP Authentication yang sudah didukung di Rails 2.0 itu (atau yang ada di Rails Edge di trunk). Saking gampangnya cara membuat penghalau login dan password ini sampai-sampai saya jadi ingat terus :-D bayangin aja mulai dari blognya rails sampai ada filmnya segala di railscasts, sampai baca di source codenya… Indonesia memang sudah seyogyanya mendukung sumber daya manusia putra bangsa Indonesia yang sama-sama kita banggakan dengan infrastruktur internet canggih supaya internet mudah diakses dimana pun juga dan GRATIS! (Kalau harapan ini bukanlah saya ingin memakai majas hiperbola, tapi memang sebenar-benarnya denotatif alias makna yang benar-benar saya maksud, karena yang saya inginkan malah sebetulnya ada lagi, selain gratis, juga diberi bonus, baik berupa oleh-oleh, buku, makanan, uang, atau apapun juga yang sifatnya baik).

taroh code ini di before_filter controller mana aja yang ingin Anda proteksi dengan HTTP Auth, kalau pingin di semua action method berarti taroh saja di file application.rb

before_filter :authenticate

kemudian pasang metode panjang dan keren itu di dalam kawasan protected.

def authenticate
  authenticate_or_request_with_http_basic do |username, password|
    username == 'arie' && password == 'keren'
  end
end

maka dengan mudah setelah itu Anda bisa berselancar dengan diproteksi login yang usernamenya harus Anda isikan string “arie” dan passwordnya “keren”, baru bisa masuk ;-)

BTW kalau baca di blognya rails itu string string tu ditaroh di konstanta di bagian atas.

Nah yang jadi fokus saya adalah gimana ngelewatin itu kalau pengen ngetes alias spec’ing controller kita.

Ini saya ambil contoh satu aja ya, misalkan ingin spec’ing index action method pada controller GirlsController. Maka di file /spec/controllers/girls_controller_spec.rb bisa taroh ini buat selalu disematkan ke describe yang membutuhkan.

describe GirlsController, 'in general', :shared => true do
  before(:each) do
    controller.stub!(:authenticate).and_return(controller)
  end
end

nah kalau sudah ada mantra di atas tinggal bikin describe yang untuk index action methodnya:

describe GirlsController, 'index' do
  it_should_behave_like 'GirlsController in general'

  it 'should render template index'

  it 'should assigns girls'
end

udah jalankan :-D (pencet apple R) nanti keluar warna kuning pertanda P alias Pending

……………………………………

tulisan ini sebetulnya saya tulis kurang lebih seminggu dua minggu yang lalu, tapi karena kesibukan saya disini jadi saya pikir saya cukupkan saja karena tidak akan sempat menyelesaikan ini berupa tulisan tapi saya sudah menyelesaikan ini yang berupa codes, saya khawatir daripada saya nanti menunda-nunda lagi terus-terusan akhirnya malah gak jadi saya publish ke blog ini, jadi maaf sekarang saya copy paste aja ya codesnya. Codes boleh diambil disini.

File: spec/controllers/girls_controller_spec.rb

require File.dirname(__FILE__) + '/../spec_helper'

describe GirlsController, 'in general', :shared => true do
  before(:each) do
    controller.stub!(:authenticate).and_return(controller)
  end
end

# GET /girls
describe GirlsController, 'index' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girls = mock_model(Girl)
    Girl.stub!(:find).and_return(@girls)
  end
  
  it "should render template index" do
    load_page
    response.should render_template(:index)
  end
  
  it "should assigns girls" do
    load_page
    assigns[:girls].should == @girls
  end
  
  def load_page(params={})
    defaults = {}
    get :index, defaults.merge!(params)
  end
end

# GET /girls/new
describe GirlsController, 'new' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girl = mock_model(Girl)
    Girl.stub!(:new).and_return(@girl)
  end
  
  it "should render new" do
    load_page
    response.should render_template(:new)
  end
  
  it "should assign girl" do
    load_page
    assigns[:girl].should == @girl
  end
  
  def load_page(params={})
    defaults = {}
    get :new, defaults.merge!(params)
  end
end

# POST /girls
describe GirlsController, 'create' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @params = { 'fake' => 'params' }
    @girl = mock_model(Girl, :save => true)
    Girl.stub!(:new).and_return(@girl)
  end
  
  it "should create a new girl" do
    Girl.should_receive(:new).with(@params).and_return(@girl)
    load_page
  end
  
  it "should save a new girl" do
    @girl.should_receive(:save).and_return(true)
    load_page
  end
  
  it "should assign flash notice and redirect to /girl/123 upon success" do
    load_page
    flash[:notice].should_not be_blank
    response.should redirect_to(girl_url(@girl))
  end
  
  it "should render new upon failure" do
    @girl.stub!(:save).and_return(false)
    load_page
    response.should render_template(:new)
  end
  
  def load_page(params={})
    defaults = { :girl => @params }
    post :create, defaults.merge!(params)
  end
end

# GET /girls/123/edit
describe GirlsController, 'edit' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girl = mock_model(Girl)
    Girl.stub!(:find).and_return(@girl)
  end
  
  it "should render edit" do
    load_page
    response.should render_template(:edit)
  end
  
  it "should assign girl" do
    load_page
    assigns[:girl].should == @girl
  end
  
  def load_page(params={})
    defaults = { :id => @girl.id }
    get :edit, defaults.merge!(params)
  end
end

# PUT /girls/123
describe GirlsController, 'update' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girl = mock_model(Girl, :update_attributes => true)
    Girl.stub!(:find).and_return(@girl)
  end
  
  it "should update a girl" do
    @girl.should_receive(:update_attributes).with(@params).and_return(true)
    load_page
  end
  
  it "should assign flash notice and redirect to /girls upon success" do
    @girl.stub!(:update_attributes).and_return(true)
    load_page
    flash[:notice].should_not be_blank
    redirect_to girl_url(@girl)
  end
  
  it "should render edit upon failure" do
    @girl.stub!(:update_attributes).and_return(false)
    load_page
    response.should render_template(:edit)
  end
  
  def load_page(params={})
    defaults = { :girl => @params, :id => @girl.id }
    put :update, defaults.merge!(params)
  end
end

# GET /girls/123
describe GirlsController, 'show' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girl = mock_model(Girl)
    Girl.stub!(:find).and_return(@girl)
  end
  
  it "should render show" do
    load_page
    response.should render_template(:show)
  end
  
  it "should assign girl" do
    load_page
    assigns[:girl].should == @girl
  end
  
  def load_page(params={})
    defaults = { :id => @girl.id }
    get :show, defaults.merge!(params)
  end
end

# DELETE /girls/123
describe GirlsController, 'destroy' do
  it_should_behave_like 'GirlsController in general'
  
  before(:each) do
    @girl = mock_model(Girl, :destroy => true)
    Girl.stub!(:find).and_return(@girl)
  end
  
  it "should delete a girl" do
    @girl.should_receive(:destroy)
    load_page
  end
  
  it "should redirect to /girls" do
    load_page
    response.should redirect_to(girls_url)
  end
  
  it "should assign flash notice upon successful destroy" do
    load_page
    flash[:notice].should_not be_blank
  end
  
  it "should assign flash error upon destroy failure" do
    @girl.should_receive(:destroy).and_return(false)
    load_page
    flash[:error].should_not be_blank
  end
  
  def load_page(params={})
    defaults = { :id => @girl.id }
    delete :destroy, defaults.merge!(params)
  end
end

File: app/controllers/girls_controller.rb

class GirlsController  [ :show, :edit, :update, :destroy ]

  # GET /girls
  def index
    @girls = Girl.find(:all)
  end
  
  # GET /girls/123
  def show
  end
  
  # GET /girls/new
  def new
    @girl = Girl.new
  end
  
  # POST /girls
  def create
    @girl = Girl.new(params[:girl])
    if @girl.save
      flash[:notice] = 'Successfully saved a new girl!'
      redirect_to girl_url(@girl)
    else
      render :action => 'new'
    end
  end
  
  # GET /girls/123/edit
  def edit
  end
  
  # PUT /girls/123
  def update
    if @girl.update_attributes(params[:girl])
      flash[:notice] = 'Successfully updated a girl!'
      redirect_to girl_url(@girl)
    else
      render :action => 'edit'
    end
  end
  
  # DELETE /girls/123
  def destroy
    if @girl.destroy
      flash[:notice] = 'Successfully deleted a girl!'
    else
      flash[:error] = 'Sadly failed to delete a girl!'
    end
    redirect_to girls_url
  end

  #########
  protected
  #########
  
    def load_girl
      @girl = Girl.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      flash[:error] = 'Girl not found!'
      redirect_to girls_url
    end
end

tinggalkan feedback konstruktif atau lebih baik diam

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s