1 # -*- encoding: utf-8 -*-
\r
4 describe ComicsController do
7 @user = Factory :user_yas
\r
8 @author = @user.author #ユーザ作成時に連動して作成される
11 describe '一覧表示に於いて' do
13 @comic = Factory :normal_comic, :author_id => @user.author.id
14 Comic.stub(:list).and_return([@comic, @comic, @comic])
18 it '与えられたpageがセットされている' do
19 get :index, :page => 5
20 assigns(:page).should eq 5
22 it '省略されると@pageに1値が入る' do
24 assigns(:page).should eq 1
27 context 'つつがなく終わるとき' do
28 it 'ステータスコード200 OKを返す' do
30 response.should be_success
32 it 'コミックモデルに一覧を問い合わせている' do
33 Comic.should_receive(:list).exactly(1)
\r
36 it '@comicsにリストを取得している' do
38 assigns(:comics).should have_at_least(3).items
41 it 'indexテンプレートを描画する' do
43 response.should render_template("index")
48 get :index, :format => :json
49 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
51 it 'データがリスト構造になっている' do
52 get :index, :format => :json
53 json = JSON.parse response.body
\r
54 json.should have_at_least(3).items
56 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
57 get :index, :format => :json
58 json = JSON.parse response.body
59 json.first.has_key?("title").should be_true
63 context '作家権限がないとき' do
68 it 'ステータスコード302 Foundを返す' do
70 response.status.should eq 302
74 response.should redirect_to '/users/sign_in'
78 it 'ステータスコード401 Unauthorizedを返す' do
79 get :index, :format => :json
80 response.status.should eq 401
82 it '応答メッセージにUnauthorizedを返す' do
83 get :index, :format => :json
\r
84 response.message.should match(/Unauthorized/)
90 describe '単体表示に於いて' do
92 @comic = Factory :normal_comic, :author_id => @user.author.id
93 Comic.stub(:show).and_return(@comic)
96 context 'つつがなく終わるとき' do
97 it 'ステータスコード200 OKを返す' do
98 get :show, :id => @comic.id
99 response.should be_success
101 it 'コミックモデルに単体取得を問い合わせている' do
102 Comic.should_receive(:show).exactly(1)
\r
105 it '@comicにアレを取得している' do
106 get :show, :id => @comic.id
107 assigns(:comic).id.should eq(@comic.id)
110 it 'showテンプレートを描画する' do
111 get :show, :id => @comic.id
112 response.should render_template("show")
117 get :show, :id => @comic.id, :format => :json
118 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
121 get :show, :id => @comic.id, :format => :json
122 json = JSON.parse response.body
123 json["title"].should match(/normal/)
127 context '作家権限がないとき' do
132 it 'ステータスコード302 Foundを返す' do
133 get :show, :id => @comic.id
134 response.status.should eq 302
136 it 'サインインページへ遷移する' do
137 get :show, :id => @comic.id
138 response.body.should redirect_to '/users/sign_in'
142 it 'ステータスコード401 Unauthorizedを返す' do
143 get :show, :id => @comic.id, :format => :json
144 response.status.should eq 401
146 it '応答メッセージにUnauthorizedを返す' do
147 get :show, :id => @comic.id, :format => :json
148 response.message.should match(/Unauthorized/)
153 context '対象コミックがないとき' do
155 it '例外404 not_foundを返す' do
158 }.should raise_error(ActiveRecord::RecordNotFound)
162 it '例外404 not_foundを返す' do
164 get :show, :id => 0, :format => :json
165 }.should raise_error(ActiveRecord::RecordNotFound)
169 context '非公開コミックを見ようとしたとき' do
171 it '例外403 forbiddenを返す' do
172 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
173 hidden = Factory :hidden_comic, :author_id => @author.id
175 get :show, :id => hidden
176 }.should raise_error(ActiveRecord::Forbidden)
180 it '例外403 forbiddenを返す' do
181 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
182 hidden = Factory :hidden_comic, :author_id => @author.id
184 get :show, :id => hidden, :format => :json
185 }.should raise_error(ActiveRecord::Forbidden)
192 describe 'コミック数取得に於いて' do
194 Comic.should_receive(:visible_count).and_return(3)
197 context 'つつがなく終わるとき' do
198 it 'ステータスコード200 OKを返す' do
199 get :count, :format => :json
200 response.should be_success
204 get :count, :format => :json
205 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
207 it 'データがHash構造になっていてコミック数が1である' do
208 get :count, :format => :json
209 json = JSON.parse response.body
210 json["count"].should == 3
216 describe '新規作成フォーム表示に於いて' do
220 context 'つつがなく終わるとき' do
221 it 'ステータスコード200 OKを返す' do
223 response.should be_success
225 it '@comicに新規データを用意している' do
227 assigns(:comic).should be_a_new(Comic)
229 it 'コミックモデルにデフォルト値補充を依頼している' do
230 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
234 it 'newテンプレートを描画する' do
236 response.should render_template("new")
240 it 'new.jsテンプレートを描画する' do
241 get :new, :format => :js
242 response.should render_template("new")
246 context '作家権限がないとき' do
251 it 'ステータスコード302 Foundを返す' do
253 response.status.should eq 302
255 it 'サインインページへ遷移する' do
257 response.body.should redirect_to '/users/sign_in'
261 it 'ステータスコード401 Unauthorizedを返す' do
262 get :new, :format => :js
263 response.status.should eq 401
265 it '応答メッセージにUnauthorizedを返す' do
266 get :new, :format => :js
267 response.message.should match(/Unauthorized/)
273 describe '新規作成に於いて' do
277 context 'つつがなく終わるとき' do
279 Comic.any_instance.should_receive(:save).exactly(1)
280 post :create, :comic => Factory.attributes_for(:normal_comic)
282 it "@comicに作成されたコミックを保持していて、それがDBにある" do
283 post :create, :comic => Factory.attributes_for(:normal_comic)
284 assigns(:comic).should be_a(Comic)
285 assigns(:comic).should be_persisted
288 it 'ステータスコード302 Foundを返す' do
289 Comic.any_instance.stub(:save).and_return(true)
290 post :create, :comic => Factory.attributes_for(:normal_comic)
291 response.status.should eq 302
293 it '作成されたコミックの表示ページへ遷移する' do
294 # Comic.any_instance.stub(:save).and_return(true)
295 post :create, :comic => Factory.attributes_for(:normal_comic)
296 response.should redirect_to(Comic.last)
300 it 'ステータスコード200 OKを返す' do
301 # Comic.any_instance.stub(:save).and_return(true)
302 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
303 response.should be_success
305 it '作成されたコミックをjsonデータで返す' do
306 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
307 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
310 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
311 json = JSON.parse response.body
312 json["title"].should match(/normal/)
316 context '作家権限がないとき' do
321 it 'ステータスコード302 Foundを返す' do
322 post :create, :comic => Factory.attributes_for(:normal_comic)
323 response.status.should eq 302
325 it 'サインインページへ遷移する' do
326 post :create, :comic => Factory.attributes_for(:normal_comic)
327 response.body.should redirect_to '/users/sign_in'
331 it 'ステータスコード401 Unauthorizedを返す' do
332 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
333 response.status.should eq 401
335 it '応答メッセージにUnauthorizedを返す' do
336 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
337 response.message.should match(/Unauthorized/)
341 context '検証、保存に失敗した' do
343 Comic.any_instance.stub(:save).and_return(false)
345 it "未保存のコミックを保持している" do
346 post :create, :comic => {}
347 assigns(:comic).should be_a_new(Comic)
350 it 'ステータスコード200 OKを返す' do
351 post :create, :comic => {}
352 response.status.should eq 200
355 post :create, :comic => {}
356 response.should render_template("new")
360 it 'ステータスコード422 unprocessable_entity を返す' do
361 post :create, :comic => {}, :format => :json
362 response.status.should eq 422
364 it '応答メッセージUnprocessable Entityを返す' do
365 post :create, :comic => {}, :format => :json
366 response.message.should match(/Unprocessable/)
372 describe '編集フォーム表示に於いて' do
374 @comic = Factory :normal_comic, :author_id => @user.author.id
376 Comic.stub(:show).and_return(@comic)
378 context 'つつがなく終わるとき' do
379 it 'ステータスコード200 OKを返す' do
380 get :edit, :id => @comic.id
381 response.should be_success
383 it 'コミックモデルに単体取得を問い合わせている' do
384 Comic.should_receive(:show).exactly(1)
\r
385 get :edit, :id => @comic.id
387 it '@comicにデータを用意している' do
388 get :edit, :id => @comic.id
389 assigns(:comic).should eq @comic
392 it 'editテンプレートを描画する' do
393 get :edit, :id => @comic.id
394 response.should render_template("edit")
398 it 'edit.jsテンプレートを描画する' do
399 get :edit, :id => @comic.id, :format => :js
400 response.should render_template("edit")
404 context '作家権限がないとき' do
409 it 'ステータスコード302 Foundを返す' do
410 get :edit, :id => @comic.id
411 response.status.should eq 302
413 it 'サインインページへ遷移する' do
414 get :edit, :id => @comic.id
415 response.body.should redirect_to '/users/sign_in'
419 it 'ステータスコード401 Unauthorizedを返す' do
420 get :edit, :id => @comic.id, :format => :js
421 response.status.should eq 401
423 it '応答メッセージにUnauthorizedを返す' do
424 get :edit, :id => @comic.id, :format => :js
425 response.message.should match(/Unauthorized/)
433 @comic = Factory :normal_comic, :author => @author
436 context '事前チェックしておく' do
437 it 'コミックモデルに単体取得を問い合わせている' do
438 Comic.stub(:show).with(any_args()).and_return @comic
\r
439 Comic.should_receive(:show).exactly(1)
\r
440 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
443 Comic.any_instance.should_receive(:update_attributes).with(any_args)
444 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
446 it '@comicにアレを取得している' do
447 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
448 assigns(:comic).id.should eq(@comic.id)
451 context 'つつがなく終わるとき' do
453 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
\r
454 Comic.find(@comic.id).visible.should eq 0
457 it 'ステータスコード302 Foundを返す' do
458 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
459 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
460 response.status.should eq 302
462 it '更新されたコミックの表示ページへ遷移する' do
463 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
464 response.should redirect_to(@comic)
468 it 'ステータスコード200 OKを返す' do
469 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
470 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
471 response.should be_success
474 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
475 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
476 response.body.should match /./
480 context '作家権限がないとき' do
484 it 'ステータスコード302 Foundを返す' do
485 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
486 response.status.should eq 302
489 it 'サインインページへ遷移する' do
490 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
491 response.body.should redirect_to '/users/sign_in'
495 it '応答メッセージにUnauthorizedを返す' do
496 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
497 response.message.should match(/Unauthorized/)
501 context '検証、保存に失敗したとき' do
503 Comic.any_instance.stub(:update_attributes).and_return(false)
506 it 'ステータスコード200 Okを返す' do
507 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
508 response.status.should eq 200
511 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
512 response.should render_template("edit")
516 it 'ステータスコード422 unprocessable_entity を返す' do
517 Comic.any_instance.stub(:update_attributes).and_return(false)
518 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
519 response.status.should eq 422
521 it '応答メッセージUnprocessable Entityを返す' do
522 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
523 response.message.should match(/Unprocessable/)