1 # -*- encoding: utf-8 -*-
\r
4 describe ComicsController do
7 @sp = Factory :system_picture
8 @lg = Factory :license_group
9 @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
10 @user = Factory :user_yas
\r
11 @author = @user.author #ユーザ作成時に連動して作成される
14 describe '一覧表示に於いて' do
16 @comic = Factory :normal_comic, :author_id => @user.author.id
17 Comic.stub(:list).and_return([@comic, @comic, @comic])
21 it '与えられたpageがセットされている' do
22 get :index, :page => 5
23 assigns(:page).should eq 5
25 it '省略されると@pageに1値が入る' do
27 assigns(:page).should eq 1
29 it '与えられたpage_sizeがセットされている' do
30 get :index, :page_size => 15
31 assigns(:page_size).should eq 15
33 it '省略されると@page_sizeにデフォルト値が入る' do
35 assigns(:page_size).should eq Comic.default_page_size
\r
37 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
38 get :index, :page_size => 1500
39 assigns(:page_size).should eq Comic.max_page_size
41 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
42 get :index, :page_size => 0
43 assigns(:page_size).should eq Comic.default_page_size
46 context 'つつがなく終わるとき' do
47 it 'ステータスコード200 OKを返す' do
49 response.should be_success
51 it 'コミックモデルに一覧を問い合わせている' do
52 Comic.should_receive(:list).exactly(1)
\r
55 it '@comicsにリストを取得している' do
57 assigns(:comics).should have_at_least(3).items
60 it 'indexテンプレートを描画する' do
62 response.should render_template("index")
67 get :index, :format => :json
68 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
70 it 'データがリスト構造になっている' do
71 get :index, :format => :json
72 json = JSON.parse response.body
\r
73 json.should have_at_least(3).items
75 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
76 get :index, :format => :json
77 json = JSON.parse response.body
78 json.first.has_key?("title").should be_true
82 context '作家権限がないとき' do
87 it 'ステータスコード302 Foundを返す' do
89 response.status.should eq 302
93 response.should redirect_to '/users/sign_in'
97 it 'ステータスコード401 Unauthorizedを返す' do
98 get :index, :format => :json
99 response.status.should eq 401
101 it '応答メッセージにUnauthorizedを返す' do
102 get :index, :format => :json
\r
103 response.message.should match(/Unauthorized/)
109 describe '単体表示に於いて' do
111 @comic = Factory :normal_comic, :author_id => @user.author.id
112 Comic.stub(:show).and_return(@comic)
115 context 'つつがなく終わるとき' do
116 it 'ステータスコード200 OKを返す' do
117 get :show, :id => @comic.id
118 response.should be_success
120 it 'コミックモデルに単体取得を問い合わせている' do
121 Comic.should_receive(:show).exactly(1)
\r
124 it '@comicにアレを取得している' do
125 get :show, :id => @comic.id
126 assigns(:comic).id.should eq(@comic.id)
129 it 'showテンプレートを描画する' do
130 get :show, :id => @comic.id
131 response.should render_template("show")
136 get :show, :id => @comic.id, :format => :json
137 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
140 get :show, :id => @comic.id, :format => :json
141 json = JSON.parse response.body
142 json["title"].should match(/normal/)
146 context '作家権限がないとき' do
151 it 'ステータスコード302 Foundを返す' do
152 get :show, :id => @comic.id
153 response.status.should eq 302
155 it 'サインインページへ遷移する' do
156 get :show, :id => @comic.id
157 response.body.should redirect_to '/users/sign_in'
161 it 'ステータスコード401 Unauthorizedを返す' do
162 get :show, :id => @comic.id, :format => :json
163 response.status.should eq 401
165 it '応答メッセージにUnauthorizedを返す' do
166 get :show, :id => @comic.id, :format => :json
167 response.message.should match(/Unauthorized/)
172 context '対象コミックがないとき' do
174 it '例外404 not_foundを返す' do
177 }.should raise_error(ActiveRecord::RecordNotFound)
181 it '例外404 not_foundを返す' do
183 get :show, :id => 0, :format => :json
184 }.should raise_error(ActiveRecord::RecordNotFound)
188 context '非公開コミックを見ようとしたとき' do
190 it '例外403 forbiddenを返す' do
191 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
192 hidden = Factory :hidden_comic, :author_id => @author.id
194 get :show, :id => hidden
195 }.should raise_error(ActiveRecord::Forbidden)
199 it '例外403 forbiddenを返す' do
200 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
201 hidden = Factory :hidden_comic, :author_id => @author.id
203 get :show, :id => hidden, :format => :json
204 }.should raise_error(ActiveRecord::Forbidden)
212 @comic = Factory :normal_comic, :author_id => @user.author.id
213 Comic.stub(:show).and_return(@comic)
216 context '事前チェックする' do
218 Panel.stub(:count).and_return(10)
220 it '与えられたoffsetがセットされている' do
221 get :play, :id => @comic.id, :offset => 7
222 assigns(:offset).should eq 7
224 it '省略されると@offsetに0値が入る' do
225 get :play, :id => @comic.id
226 assigns(:offset).should eq 0
228 it 'コマ数以上が与えられるとコマ数-1が入る' do
229 get :play, :id => @comic.id, :offset => 10
230 assigns(:offset).should eq 9
232 it '負の値が与えられると末尾(コマ数)からさかのぼった値が入る' do
233 get :play, :id => @comic.id, :offset => -3
234 assigns(:offset).should eq 7
236 it 'コマ数以上の負の値が与えられると計算できないので0値が入る' do
237 get :play, :id => @comic.id, :offset => -13
238 assigns(:offset).should eq 0
240 it '与えられたcountがセットされている' do
241 get :play, :id => @comic.id, :count => 18
242 assigns(:panel_count).should eq 18
244 it '省略されると@countにデフォルト値が入る' do
245 get :play, :id => @comic.id
246 assigns(:panel_count).should eq Comic.default_panel_size
\r
248 it '最大を超えると@countにデフォルト最大値が入る' do
249 get :play, :id => @comic.id, :count => 1500
250 assigns(:panel_count).should eq Comic.max_panel_size
252 it '不正な値が入ると@countにデフォルト最大値が入る' do
253 get :play, :id => @comic.id, :page_size => 0
254 assigns(:panel_count).should eq Comic.default_panel_size
257 context 'つつがなく終わるとき' do
258 it 'ステータスコード200 OKを返す' do
259 get :play, :id => @comic.id
260 response.should be_success
262 it 'コミックモデルに単体取得を問い合わせている' do
263 Comic.should_receive(:show).exactly(1)
\r
264 get :play, :id => @comic.id
266 it '@comicにアレを取得している' do
267 get :play, :id => @comic.id
268 assigns(:comic).id.should eq(@comic.id)
271 it 'playテンプレートを描画する' do
272 get :play, :id => @comic.id
273 response.should render_template("play")
278 get :play, :id => @comic.id, :format => :json
279 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
282 get :play, :id => @comic.id, :format => :json
283 json = JSON.parse response.body
284 json["title"].should match(/normal/)
288 context '作家権限がないとき' do
293 it 'ステータスコード302 Foundを返す' do
294 get :play, :id => @comic.id
295 response.status.should eq 302
297 it 'サインインページへ遷移する' do
298 get :play, :id => @comic.id
299 response.body.should redirect_to '/users/sign_in'
303 it 'ステータスコード401 Unauthorizedを返す' do
304 get :play, :id => @comic.id, :format => :json
305 response.status.should eq 401
307 it '応答メッセージにUnauthorizedを返す' do
308 get :play, :id => @comic.id, :format => :json
309 response.message.should match(/Unauthorized/)
315 describe 'コミック数取得に於いて' do
317 Comic.should_receive(:visible_count).and_return(3)
320 context 'つつがなく終わるとき' do
321 it 'ステータスコード200 OKを返す' do
322 get :count, :format => :json
323 response.should be_success
327 get :count, :format => :json
328 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
330 it 'データがHash構造になっていてコミック数が1である' do
331 get :count, :format => :json
332 json = JSON.parse response.body
333 json["count"].should == 3
339 describe '新規作成フォーム表示に於いて' do
343 context 'つつがなく終わるとき' do
344 it 'ステータスコード200 OKを返す' do
346 response.should be_success
348 it '@comicに新規データを用意している' do
350 assigns(:comic).should be_a_new(Comic)
352 it 'コミックモデルにデフォルト値補充を依頼している' do
353 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
357 it 'newテンプレートを描画する' do
359 response.should render_template("new")
363 it 'new.jsテンプレートを描画する' do
364 get :new, :format => :js
365 response.should render_template("new")
369 context '作家権限がないとき' do
374 it 'ステータスコード302 Foundを返す' do
376 response.status.should eq 302
378 it 'サインインページへ遷移する' do
380 response.body.should redirect_to '/users/sign_in'
384 it 'ステータスコード401 Unauthorizedを返す' do
385 get :new, :format => :js
386 response.status.should eq 401
388 it '応答メッセージにUnauthorizedを返す' do
389 get :new, :format => :js
390 response.message.should match(/Unauthorized/)
396 describe '新規作成に於いて' do
400 context 'つつがなく終わるとき' do
402 Comic.any_instance.should_receive(:save).exactly(1)
403 post :create, :comic => Factory.attributes_for(:normal_comic)
405 it "@comicに作成されたコミックを保持していて、それがDBにある" do
406 post :create, :comic => Factory.attributes_for(:normal_comic)
407 assigns(:comic).should be_a(Comic)
408 assigns(:comic).should be_persisted
411 it 'ステータスコード302 Foundを返す' do
412 Comic.any_instance.stub(:save).and_return(true)
413 post :create, :comic => Factory.attributes_for(:normal_comic)
414 response.status.should eq 302
416 it '作成されたコミックの表示ページへ遷移する' do
417 # Comic.any_instance.stub(:save).and_return(true)
418 post :create, :comic => Factory.attributes_for(:normal_comic)
419 response.should redirect_to(Comic.last)
423 it 'ステータスコード200 OKを返す' do
424 # Comic.any_instance.stub(:save).and_return(true)
425 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
426 response.should be_success
428 it '作成されたコミックをjsonデータで返す' do
429 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
430 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
433 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
434 json = JSON.parse response.body
435 json["title"].should match(/normal/)
439 context '作家権限がないとき' do
444 it 'ステータスコード302 Foundを返す' do
445 post :create, :comic => Factory.attributes_for(:normal_comic)
446 response.status.should eq 302
448 it 'サインインページへ遷移する' do
449 post :create, :comic => Factory.attributes_for(:normal_comic)
450 response.body.should redirect_to '/users/sign_in'
454 it 'ステータスコード401 Unauthorizedを返す' do
455 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
456 response.status.should eq 401
458 it '応答メッセージにUnauthorizedを返す' do
459 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
460 response.message.should match(/Unauthorized/)
464 context '検証、保存に失敗した' do
466 Comic.any_instance.stub(:save).and_return(false)
468 it "未保存のコミックを保持している" do
469 post :create, :comic => {}
470 assigns(:comic).should be_a_new(Comic)
473 it 'ステータスコード200 OKを返す' do
474 post :create, :comic => {}
475 response.status.should eq 200
478 post :create, :comic => {}
479 response.should render_template("new")
483 it 'ステータスコード422 unprocessable_entity を返す' do
484 post :create, :comic => {}, :format => :json
485 response.status.should eq 422
487 it '応答メッセージUnprocessable Entityを返す' do
488 post :create, :comic => {}, :format => :json
489 response.message.should match(/Unprocessable/)
495 describe '編集フォーム表示に於いて' do
497 @comic = Factory :normal_comic, :author_id => @user.author.id
499 Comic.stub(:show).and_return(@comic)
501 context 'つつがなく終わるとき' do
502 it 'ステータスコード200 OKを返す' do
503 get :edit, :id => @comic.id
504 response.should be_success
506 it 'コミックモデルに単体取得を問い合わせている' do
507 Comic.should_receive(:show).exactly(1)
\r
508 get :edit, :id => @comic.id
510 it '@comicにデータを用意している' do
511 get :edit, :id => @comic.id
512 assigns(:comic).should eq @comic
515 it 'editテンプレートを描画する' do
516 get :edit, :id => @comic.id
517 response.should render_template("edit")
521 it 'edit.jsテンプレートを描画する' do
522 get :edit, :id => @comic.id, :format => :js
523 response.should render_template("edit")
527 context '作家権限がないとき' do
532 it 'ステータスコード302 Foundを返す' do
533 get :edit, :id => @comic.id
534 response.status.should eq 302
536 it 'サインインページへ遷移する' do
537 get :edit, :id => @comic.id
538 response.body.should redirect_to '/users/sign_in'
542 it 'ステータスコード401 Unauthorizedを返す' do
543 get :edit, :id => @comic.id, :format => :js
544 response.status.should eq 401
546 it '応答メッセージにUnauthorizedを返す' do
547 get :edit, :id => @comic.id, :format => :js
548 response.message.should match(/Unauthorized/)
556 @comic = Factory :normal_comic, :author => @author
559 context '事前チェックしておく' do
560 it 'コミックモデルに単体取得を問い合わせている' do
561 Comic.stub(:show).with(any_args()).and_return @comic
\r
562 Comic.should_receive(:show).exactly(1)
\r
563 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
566 Comic.any_instance.should_receive(:update_attributes).with(any_args)
567 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
569 it '@comicにアレを取得している' do
570 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
571 assigns(:comic).id.should eq(@comic.id)
574 context 'つつがなく終わるとき' do
576 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
\r
577 Comic.find(@comic.id).visible.should eq 0
580 it 'ステータスコード302 Foundを返す' do
581 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
582 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
583 response.status.should eq 302
585 it '更新されたコミックの表示ページへ遷移する' do
586 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
587 response.should redirect_to(@comic)
591 it 'ステータスコード200 OKを返す' do
592 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
593 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
594 response.should be_success
597 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
598 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
599 response.body.should match /./
603 context '作家権限がないとき' do
607 it 'ステータスコード302 Foundを返す' do
608 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
609 response.status.should eq 302
612 it 'サインインページへ遷移する' do
613 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
614 response.body.should redirect_to '/users/sign_in'
618 it '応答メッセージにUnauthorizedを返す' do
619 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
620 response.message.should match(/Unauthorized/)
624 context '検証、保存に失敗したとき' do
626 Comic.any_instance.stub(:update_attributes).and_return(false)
629 it 'ステータスコード200 Okを返す' do
630 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
631 response.status.should eq 200
634 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
635 response.should render_template("edit")
639 it 'ステータスコード422 unprocessable_entity を返す' do
640 Comic.any_instance.stub(:update_attributes).and_return(false)
641 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
642 response.status.should eq 422
644 it '応答メッセージUnprocessable Entityを返す' do
645 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
646 response.message.should match(/Unprocessable/)