Skip to content

Instantly share code, notes, and snippets.

@litch
Last active December 14, 2015 07:49
Show Gist options
  • Save litch/5053398 to your computer and use it in GitHub Desktop.
Save litch/5053398 to your computer and use it in GitHub Desktop.
class SpeakersController < ApplicationController
load_and_authorize_resource :event
load_and_authorize_resource :speaker, through: [:event], shallow: true #the array here could only be the single symbol but since i almost always wind up adding more, i just start with it
before_filter :new_speaker, :only => [:new, :create]
respond_to :html
def index
end
def show
end
def new
end
def edit
end
def create
@event.speakers.new(speakers_params)
@speaker.save
respond_with @speaker
end
def update
@speaker.update_attributes(speakers_params)
respond_with @speaker
end
private
def new_speaker
@speaker = Speaker.new
end
def speakers_params
params.require(:speaker).permit(:name, :title, :bio, :event_id)
end
end
require 'spec_helper'
describe SpeakersController do
before :each do
@event = create :event
@speaker = create :speaker, event: @event
login_admin
end
describe "before filters" do
it "finds the speaker" do
speaker = mock_model(Speaker)
Speaker.should_receive(:find).and_return(speaker)
controller.send(:find_speaker).should == speaker
end
it "assigns new speaker" do
controller.send(:new_speaker).should be_a_new(Speaker)
end
it "finds the event" do
event = mock_model(Event)
Event.should_receive(:find).and_return(event)
controller.send(:find_event).should == event
end
end
describe "GET index" do
it "assigns all speakers for event" do
get :index, event_id: @event.id
assigns(:speakers).should eq([@speaker])
end
end
describe "GET show" do
it "assigns the speaker" do
get :show, event_id: @event.id, id: @speaker.id
assigns(:speaker).should eq(@speaker)
end
end
describe "GET new" do
it "assigns a new speaker" do
get :new, event_id: @event.id
assigns(:speaker).should be_a_new(Speaker)
end
end
describe "GET edit" do
it "assigns the speaker" do
get :edit, event_id: @event.id, id: @speaker.id
assigns(:speaker).should eq(@speaker)
end
end
describe "POST create" do
describe "with valid params" do
it "creates a new speaker" do
expect {
post :create, event_id: @event.id, speaker: FactoryGirl.attributes_for(:speaker)
}.to change(Speaker, :count).by(1)
end
it "redirects to the created speaker page" do
post :create, event_id: @event.id, speaker: FactoryGirl.attributes_for(:speaker)
response.should be_redirect
end
end
describe "with invalid params" do
it "does not save speaker" do
expect {
post :create, event_id: @event.id, speaker: {name: ''}
}.to_not change(Speaker, :count).by(1)
end
it "renders the 'new' template" do
post :create, event_id: @event.id, speaker: {name: ''}
response.should render_template :new
end
end
end
describe "PUT update" do
describe "with valid params" do
it "updates the speaker" do
Speaker.any_instance.should_receive(:update_attributes).and_return(true)
put :update, event_id: @event.id, id: @speaker.id, speaker: FactoryGirl.attributes_for(:speaker)
end
it "redirects to the speaker page" do
put :update, event_id: @event.id, id: @speaker.id, speaker: FactoryGirl.attributes_for(:speaker)
response.should be_redirect
end
end
describe "with invalid params" do
it "does not update the speaker" do
Speaker.any_instance.should_receive(:update_attributes).and_return(false)
put :update, event_id: @event.id, id: @speaker.id, speaker: {name: ''}
end
it "re-renders the 'edit' template" do
put :update, event_id: @event.id, id: @speaker.id, speaker: {name: ''}
response.should render_template :edit
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment