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
26 it '与えられたpage_sizeがセットされている' do
27 get :index, :page_size => 15
28 assigns(:page_size).should eq 15
30 it '省略されると@page_sizeにデフォルト値が入る' do
32 assigns(:page_size).should eq Comic.default_page_size
\r
34 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
35 get :index, :page_size => 1500
36 assigns(:page_size).should eq Comic.max_page_size
38 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
39 get :index, :page_size => 0
40 assigns(:page_size).should eq Comic.default_page_size
43 context 'つつがなく終わるとき' do
44 it 'ステータスコード200 OKを返す' do
46 response.should be_success
48 it 'コミックモデルに一覧を問い合わせている' do
49 Comic.should_receive(:list).exactly(1)
\r
52 it '@comicsにリストを取得している' do
54 assigns(:comics).should have_at_least(3).items
57 it 'indexテンプレートを描画する' do
59 response.should render_template("index")
64 get :index, :format => :json
65 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
67 it 'データがリスト構造になっている' do
68 get :index, :format => :json
69 json = JSON.parse response.body
\r
70 json.should have_at_least(3).items
72 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
73 get :index, :format => :json
74 json = JSON.parse response.body
75 json.first.has_key?("title").should be_true
79 context '作家権限がないとき' do
84 it 'ステータスコード302 Foundを返す' do
86 response.status.should eq 302
90 response.should redirect_to '/users/sign_in'
94 it 'ステータスコード401 Unauthorizedを返す' do
95 get :index, :format => :json
96 response.status.should eq 401
98 it '応答メッセージにUnauthorizedを返す' do
99 get :index, :format => :json
\r
100 response.message.should match(/Unauthorized/)
106 describe '単体表示に於いて' do
108 @comic = Factory :normal_comic, :author_id => @user.author.id
109 Comic.stub(:show).and_return(@comic)
112 context 'つつがなく終わるとき' do
113 it 'ステータスコード200 OKを返す' do
114 get :show, :id => @comic.id
115 response.should be_success
117 it 'コミックモデルに単体取得を問い合わせている' do
118 Comic.should_receive(:show).exactly(1)
\r
121 it '@comicにアレを取得している' do
122 get :show, :id => @comic.id
123 assigns(:comic).id.should eq(@comic.id)
126 it 'showテンプレートを描画する' do
127 get :show, :id => @comic.id
128 response.should render_template("show")
133 get :show, :id => @comic.id, :format => :json
134 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
137 get :show, :id => @comic.id, :format => :json
138 json = JSON.parse response.body
139 json["title"].should match(/normal/)
143 context '作家権限がないとき' do
148 it 'ステータスコード302 Foundを返す' do
149 get :show, :id => @comic.id
150 response.status.should eq 302
152 it 'サインインページへ遷移する' do
153 get :show, :id => @comic.id
154 response.body.should redirect_to '/users/sign_in'
158 it 'ステータスコード401 Unauthorizedを返す' do
159 get :show, :id => @comic.id, :format => :json
160 response.status.should eq 401
162 it '応答メッセージにUnauthorizedを返す' do
163 get :show, :id => @comic.id, :format => :json
164 response.message.should match(/Unauthorized/)
169 context '対象コミックがないとき' do
171 it '例外404 not_foundを返す' do
174 }.should raise_error(ActiveRecord::RecordNotFound)
178 it '例外404 not_foundを返す' do
180 get :show, :id => 0, :format => :json
181 }.should raise_error(ActiveRecord::RecordNotFound)
185 context '非公開コミックを見ようとしたとき' do
187 it '例外403 forbiddenを返す' do
188 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
189 hidden = Factory :hidden_comic, :author_id => @author.id
191 get :show, :id => hidden
192 }.should raise_error(ActiveRecord::Forbidden)
196 it '例外403 forbiddenを返す' do
197 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
198 hidden = Factory :hidden_comic, :author_id => @author.id
200 get :show, :id => hidden, :format => :json
201 }.should raise_error(ActiveRecord::Forbidden)
209 @comic = Factory :normal_comic, :author_id => @user.author.id
210 Comic.stub(:show).and_return(@comic)
213 context '事前チェックする' do
215 Panel.stub(:count).and_return(10)
217 it '与えられたoffsetがセットされている' do
218 get :play, :id => @comic.id, :offset => 7
219 assigns(:offset).should eq 7
221 it '省略されると@offsetに0値が入る' do
222 get :play, :id => @comic.id
223 assigns(:offset).should eq 0
225 it 'コマ数以上が与えられるとコマ数-1が入る' do
226 get :play, :id => @comic.id, :offset => 10
227 assigns(:offset).should eq 9
229 it '負の値が与えられると末尾(コマ数)からさかのぼった値が入る' do
230 get :play, :id => @comic.id, :offset => -3
231 assigns(:offset).should eq 7
233 it 'コマ数以上の負の値が与えられると計算できないので0値が入る' do
234 get :play, :id => @comic.id, :offset => -13
235 assigns(:offset).should eq 0
237 it '与えられたcountがセットされている' do
238 get :play, :id => @comic.id, :count => 18
239 assigns(:count).should eq 18
241 it '省略されると@countにデフォルト値が入る' do
242 get :play, :id => @comic.id
243 assigns(:count).should eq Comic.default_panel_size
\r
245 it '最大を超えると@countにデフォルト最大値が入る' do
246 get :play, :id => @comic.id, :count => 1500
247 assigns(:count).should eq Comic.max_panel_size
249 it '不正な値が入ると@countにデフォルト最大値が入る' do
250 get :play, :id => @comic.id, :page_size => 0
251 assigns(:count).should eq Comic.default_panel_size
254 context 'つつがなく終わるとき' do
255 it 'ステータスコード200 OKを返す' do
256 get :play, :id => @comic.id
257 response.should be_success
259 it 'コミックモデルに単体取得を問い合わせている' do
260 Comic.should_receive(:show).exactly(1)
\r
261 get :play, :id => @comic.id
263 it '@comicにアレを取得している' do
264 get :play, :id => @comic.id
265 assigns(:comic).id.should eq(@comic.id)
268 it 'playテンプレートを描画する' do
269 get :play, :id => @comic.id
270 response.should render_template("play")
275 get :play, :id => @comic.id, :format => :json
276 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
279 get :play, :id => @comic.id, :format => :json
280 json = JSON.parse response.body
281 json["title"].should match(/normal/)
285 context '作家権限がないとき' do
290 it 'ステータスコード302 Foundを返す' do
291 get :play, :id => @comic.id
292 response.status.should eq 302
294 it 'サインインページへ遷移する' do
295 get :play, :id => @comic.id
296 response.body.should redirect_to '/users/sign_in'
300 it 'ステータスコード401 Unauthorizedを返す' do
301 get :play, :id => @comic.id, :format => :json
302 response.status.should eq 401
304 it '応答メッセージにUnauthorizedを返す' do
305 get :play, :id => @comic.id, :format => :json
306 response.message.should match(/Unauthorized/)
312 describe 'コミック数取得に於いて' do
314 Comic.should_receive(:visible_count).and_return(3)
317 context 'つつがなく終わるとき' do
318 it 'ステータスコード200 OKを返す' do
319 get :count, :format => :json
320 response.should be_success
324 get :count, :format => :json
325 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
327 it 'データがHash構造になっていてコミック数が1である' do
328 get :count, :format => :json
329 json = JSON.parse response.body
330 json["count"].should == 3
336 describe '新規作成フォーム表示に於いて' do
340 context 'つつがなく終わるとき' do
341 it 'ステータスコード200 OKを返す' do
343 response.should be_success
345 it '@comicに新規データを用意している' do
347 assigns(:comic).should be_a_new(Comic)
349 it 'コミックモデルにデフォルト値補充を依頼している' do
350 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
354 it 'newテンプレートを描画する' do
356 response.should render_template("new")
360 it 'new.jsテンプレートを描画する' do
361 get :new, :format => :js
362 response.should render_template("new")
366 context '作家権限がないとき' do
371 it 'ステータスコード302 Foundを返す' do
373 response.status.should eq 302
375 it 'サインインページへ遷移する' do
377 response.body.should redirect_to '/users/sign_in'
381 it 'ステータスコード401 Unauthorizedを返す' do
382 get :new, :format => :js
383 response.status.should eq 401
385 it '応答メッセージにUnauthorizedを返す' do
386 get :new, :format => :js
387 response.message.should match(/Unauthorized/)
393 describe '新規作成に於いて' do
397 context 'つつがなく終わるとき' do
399 Comic.any_instance.should_receive(:save).exactly(1)
400 post :create, :comic => Factory.attributes_for(:normal_comic)
402 it "@comicに作成されたコミックを保持していて、それがDBにある" do
403 post :create, :comic => Factory.attributes_for(:normal_comic)
404 assigns(:comic).should be_a(Comic)
405 assigns(:comic).should be_persisted
408 it 'ステータスコード302 Foundを返す' do
409 Comic.any_instance.stub(:save).and_return(true)
410 post :create, :comic => Factory.attributes_for(:normal_comic)
411 response.status.should eq 302
413 it '作成されたコミックの表示ページへ遷移する' do
414 # Comic.any_instance.stub(:save).and_return(true)
415 post :create, :comic => Factory.attributes_for(:normal_comic)
416 response.should redirect_to(Comic.last)
420 it 'ステータスコード200 OKを返す' do
421 # Comic.any_instance.stub(:save).and_return(true)
422 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
423 response.should be_success
425 it '作成されたコミックをjsonデータで返す' do
426 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
427 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
430 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
431 json = JSON.parse response.body
432 json["title"].should match(/normal/)
436 context '作家権限がないとき' do
441 it 'ステータスコード302 Foundを返す' do
442 post :create, :comic => Factory.attributes_for(:normal_comic)
443 response.status.should eq 302
445 it 'サインインページへ遷移する' do
446 post :create, :comic => Factory.attributes_for(:normal_comic)
447 response.body.should redirect_to '/users/sign_in'
451 it 'ステータスコード401 Unauthorizedを返す' do
452 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
453 response.status.should eq 401
455 it '応答メッセージにUnauthorizedを返す' do
456 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
457 response.message.should match(/Unauthorized/)
461 context '検証、保存に失敗した' do
463 Comic.any_instance.stub(:save).and_return(false)
465 it "未保存のコミックを保持している" do
466 post :create, :comic => {}
467 assigns(:comic).should be_a_new(Comic)
470 it 'ステータスコード200 OKを返す' do
471 post :create, :comic => {}
472 response.status.should eq 200
475 post :create, :comic => {}
476 response.should render_template("new")
480 it 'ステータスコード422 unprocessable_entity を返す' do
481 post :create, :comic => {}, :format => :json
482 response.status.should eq 422
484 it '応答メッセージUnprocessable Entityを返す' do
485 post :create, :comic => {}, :format => :json
486 response.message.should match(/Unprocessable/)
492 describe '編集フォーム表示に於いて' do
494 @comic = Factory :normal_comic, :author_id => @user.author.id
496 Comic.stub(:show).and_return(@comic)
498 context 'つつがなく終わるとき' do
499 it 'ステータスコード200 OKを返す' do
500 get :edit, :id => @comic.id
501 response.should be_success
503 it 'コミックモデルに単体取得を問い合わせている' do
504 Comic.should_receive(:show).exactly(1)
\r
505 get :edit, :id => @comic.id
507 it '@comicにデータを用意している' do
508 get :edit, :id => @comic.id
509 assigns(:comic).should eq @comic
512 it 'editテンプレートを描画する' do
513 get :edit, :id => @comic.id
514 response.should render_template("edit")
518 it 'edit.jsテンプレートを描画する' do
519 get :edit, :id => @comic.id, :format => :js
520 response.should render_template("edit")
524 context '作家権限がないとき' do
529 it 'ステータスコード302 Foundを返す' do
530 get :edit, :id => @comic.id
531 response.status.should eq 302
533 it 'サインインページへ遷移する' do
534 get :edit, :id => @comic.id
535 response.body.should redirect_to '/users/sign_in'
539 it 'ステータスコード401 Unauthorizedを返す' do
540 get :edit, :id => @comic.id, :format => :js
541 response.status.should eq 401
543 it '応答メッセージにUnauthorizedを返す' do
544 get :edit, :id => @comic.id, :format => :js
545 response.message.should match(/Unauthorized/)
553 @comic = Factory :normal_comic, :author => @author
556 context '事前チェックしておく' do
557 it 'コミックモデルに単体取得を問い合わせている' do
558 Comic.stub(:show).with(any_args()).and_return @comic
\r
559 Comic.should_receive(:show).exactly(1)
\r
560 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
563 Comic.any_instance.should_receive(:update_attributes).with(any_args)
564 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
566 it '@comicにアレを取得している' do
567 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
568 assigns(:comic).id.should eq(@comic.id)
571 context 'つつがなく終わるとき' do
573 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
\r
574 Comic.find(@comic.id).visible.should eq 0
577 it 'ステータスコード302 Foundを返す' do
578 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
579 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
580 response.status.should eq 302
582 it '更新されたコミックの表示ページへ遷移する' do
583 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
584 response.should redirect_to(@comic)
588 it 'ステータスコード200 OKを返す' do
589 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
590 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
591 response.should be_success
594 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
595 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
596 response.body.should match /./
600 context '作家権限がないとき' do
604 it 'ステータスコード302 Foundを返す' do
605 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
606 response.status.should eq 302
609 it 'サインインページへ遷移する' do
610 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
611 response.body.should redirect_to '/users/sign_in'
615 it '応答メッセージにUnauthorizedを返す' do
616 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
617 response.message.should match(/Unauthorized/)
621 context '検証、保存に失敗したとき' do
623 Comic.any_instance.stub(:update_attributes).and_return(false)
626 it 'ステータスコード200 Okを返す' do
627 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
628 response.status.should eq 200
631 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
632 response.should render_template("edit")
636 it 'ステータスコード422 unprocessable_entity を返す' do
637 Comic.any_instance.stub(:update_attributes).and_return(false)
638 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
639 response.status.should eq 422
641 it '応答メッセージUnprocessable Entityを返す' do
642 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
643 response.message.should match(/Unprocessable/)