You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
5.4 KiB
Ruby
231 lines
5.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
shared_examples_for 'guest user trying to modify' do
|
|
it { should redirect_to(login_path) }
|
|
specify { flash[:notice].should =~ /login first/ }
|
|
end
|
|
|
|
shared_examples_for 'non-owner user trying to modify' do
|
|
it { should redirect_to(asciicast_path(asciicast)) }
|
|
specify { flash[:alert].should =~ /can't/ }
|
|
end
|
|
|
|
describe AsciicastsController do
|
|
let(:user) { stub_model(User, :nickname => 'nick') }
|
|
let(:asciicast) { stub_model(Asciicast, :id => 666) }
|
|
|
|
subject { response }
|
|
|
|
describe '#index' do
|
|
let(:asciicasts) { [double('asciicast')] }
|
|
let(:page) { double('page').to_s }
|
|
|
|
before do
|
|
Asciicast.should_receive(:newest_paginated).
|
|
with(page, an_instance_of(Fixnum)).and_return(asciicasts)
|
|
|
|
PaginatingDecorator.should_receive(:new).with(asciicasts).
|
|
and_return(asciicasts)
|
|
|
|
get :index, :page => page
|
|
end
|
|
|
|
it { should be_success }
|
|
specify { assigns(:asciicasts).should == asciicasts }
|
|
specify { assigns(:category_name).should =~ /^All/ }
|
|
specify { assigns(:current_category).should == :all }
|
|
end
|
|
|
|
describe '#popular' do
|
|
let(:asciicasts) { [double('asciicast')] }
|
|
let(:page) { double('page').to_s }
|
|
|
|
before do
|
|
Asciicast.should_receive(:popular_paginated).
|
|
with(page, an_instance_of(Fixnum)).and_return(asciicasts)
|
|
|
|
PaginatingDecorator.should_receive(:new).with(asciicasts).
|
|
and_return(asciicasts)
|
|
|
|
get :popular, :page => page
|
|
end
|
|
|
|
it { should be_success }
|
|
specify { assigns(:asciicasts).should == asciicasts }
|
|
specify { assigns(:category_name).should =~ /^Popular/ }
|
|
specify { assigns(:current_category).should == :popular }
|
|
end
|
|
|
|
describe '#show' do
|
|
before do
|
|
Asciicast.should_receive(:find).and_return(asciicast)
|
|
|
|
asciicast.title = 'some tit'
|
|
end
|
|
|
|
context 'for html request' do
|
|
before do
|
|
AsciicastDecorator.should_receive(:new).with(asciicast).
|
|
and_return(asciicast)
|
|
|
|
get :show, :id => asciicast.id, :format => :html
|
|
end
|
|
|
|
it { should be_success }
|
|
specify { assigns(:asciicast).should == asciicast }
|
|
specify { assigns(:title).should == asciicast.title }
|
|
end
|
|
|
|
context 'for json request' do
|
|
let(:asciicast) { FactoryGirl.build(:asciicast, :id => 666) }
|
|
|
|
before do
|
|
AsciicastJSONDecorator.should_receive(:new).with(asciicast).
|
|
and_return(asciicast)
|
|
|
|
get :show, :id => asciicast.id, :format => :json
|
|
end
|
|
|
|
it { should be_success }
|
|
end
|
|
end
|
|
|
|
describe '#edit' do
|
|
let(:make_request) { get :edit, :id => asciicast.id }
|
|
|
|
before do
|
|
Asciicast.should_receive(:find).and_return(asciicast)
|
|
asciicast.user = user
|
|
end
|
|
|
|
context 'for owner user' do
|
|
before do
|
|
login_as user
|
|
make_request
|
|
end
|
|
|
|
it { should be_success }
|
|
end
|
|
|
|
context 'for guest user' do
|
|
before do
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'guest user trying to modify'
|
|
end
|
|
|
|
context 'for other user' do
|
|
before do
|
|
login_as stub_model(User)
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'non-owner user trying to modify'
|
|
end
|
|
end
|
|
|
|
describe '#update' do
|
|
let(:make_request) { put :update, :id => asciicast.id, :asciicast => { } }
|
|
|
|
before do
|
|
Asciicast.should_receive(:find).and_return(asciicast)
|
|
asciicast.user = user
|
|
end
|
|
|
|
context 'for owner user' do
|
|
before do
|
|
login_as user
|
|
end
|
|
|
|
context 'when update succeeds' do
|
|
before do
|
|
asciicast.should_receive(:update_attributes).and_return(true)
|
|
make_request
|
|
end
|
|
|
|
it { should redirect_to(asciicast_path(asciicast)) }
|
|
specify { flash[:notice].should =~ /was updated/ }
|
|
end
|
|
|
|
context 'when update fails' do
|
|
before do
|
|
asciicast.should_receive(:update_attributes).and_return(false)
|
|
make_request
|
|
end
|
|
|
|
it { should render_template(:edit) }
|
|
end
|
|
end
|
|
|
|
context 'for guest user' do
|
|
before do
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'guest user trying to modify'
|
|
end
|
|
|
|
context 'for other user' do
|
|
before do
|
|
login_as stub_model(User)
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'non-owner user trying to modify'
|
|
end
|
|
end
|
|
|
|
describe '#destroy' do
|
|
let(:make_request) { delete :destroy, :id => asciicast.id }
|
|
|
|
before do
|
|
Asciicast.should_receive(:find).and_return(asciicast)
|
|
asciicast.user = user
|
|
end
|
|
|
|
context 'for owner user' do
|
|
before do
|
|
login_as user
|
|
end
|
|
|
|
context 'when destroy succeeds' do
|
|
before do
|
|
asciicast.should_receive(:destroy).and_return(true)
|
|
make_request
|
|
end
|
|
|
|
it { should redirect_to(profile_path(user)) }
|
|
specify { flash[:notice].should =~ /was deleted/ }
|
|
end
|
|
|
|
context 'when destroy fails' do
|
|
before do
|
|
asciicast.should_receive(:destroy).and_return(false)
|
|
make_request
|
|
end
|
|
|
|
it { should redirect_to(asciicast_path(asciicast)) }
|
|
specify { flash[:alert].should =~ /again/ }
|
|
end
|
|
end
|
|
|
|
context 'for guest user' do
|
|
before do
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'guest user trying to modify'
|
|
end
|
|
|
|
context 'for other user' do
|
|
before do
|
|
login_as stub_model(User)
|
|
make_request
|
|
end
|
|
|
|
it_should_behave_like 'non-owner user trying to modify'
|
|
end
|
|
end
|
|
end
|