1 # -*- encoding: utf-8 -*-
\r
4 describe ComicsController do
7 @license = Factory :license
8 @user = Factory :user_yas
\r
9 @author = @user.author #ユーザ作成時に連動して作成される
12 describe '一覧表示に於いて' do
14 @comic = Factory :normal_comic, :author_id => @user.author.id
15 Comic.stub(:list).and_return([@comic, @comic, @comic])
19 it '与えられたpageがセットされている' do
20 get :index, :page => 5
21 assigns(:page).should eq 5
23 it '省略されると@pageに1値が入る' do
25 assigns(:page).should eq 1
27 it '与えられたpage_sizeがセットされている' do
28 get :index, :page_size => 15
29 assigns(:page_size).should eq 15
31 it '省略されると@page_sizeにデフォルト値が入る' do
33 assigns(:page_size).should eq Comic.default_page_size
\r
35 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
36 get :index, :page_size => 1500
37 assigns(:page_size).should eq Comic.max_page_size
39 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
40 get :index, :page_size => 0
41 assigns(:page_size).should eq Comic.default_page_size
44 context 'つつがなく終わるとき' do
45 it 'ステータスコード200 OKを返す' do
47 response.should be_success
49 it 'コミックモデルに一覧を問い合わせている' do
50 Comic.should_receive(:list).exactly(1)
\r
53 it '@comicsにリストを取得している' do
55 assigns(:comics).should have_at_least(3).items
58 it 'indexテンプレートを描画する' do
60 response.should render_template("index")
65 get :index, :format => :json
66 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
68 it 'データがリスト構造になっている' do
69 get :index, :format => :json
70 json = JSON.parse response.body
\r
71 json.should have_at_least(3).items
73 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
74 get :index, :format => :json
75 json = JSON.parse response.body
76 json.first.has_key?("title").should be_true
80 context '作家権限がないとき' do
85 it 'ステータスコード302 Foundを返す' do
87 response.status.should eq 302
91 response.should redirect_to '/users/sign_in'
95 it 'ステータスコード401 Unauthorizedを返す' do
96 get :index, :format => :json
97 response.status.should eq 401
99 it '応答メッセージにUnauthorizedを返す' do
100 get :index, :format => :json
\r
101 response.message.should match(/Unauthorized/)
107 describe '単体表示に於いて' do
109 @comic = Factory :normal_comic, :author_id => @user.author.id
110 Comic.stub(:show).and_return(@comic)
113 context 'つつがなく終わるとき' do
114 it 'ステータスコード200 OKを返す' do
115 get :show, :id => @comic.id
116 response.should be_success
118 it 'コミックモデルに単体取得を問い合わせている' do
119 Comic.should_receive(:show).exactly(1)
\r
122 it '@comicにアレを取得している' do
123 get :show, :id => @comic.id
124 assigns(:comic).id.should eq(@comic.id)
127 it 'showテンプレートを描画する' do
128 get :show, :id => @comic.id
129 response.should render_template("show")
134 get :show, :id => @comic.id, :format => :json
135 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
138 get :show, :id => @comic.id, :format => :json
139 json = JSON.parse response.body
140 json["title"].should match(/normal/)
144 context '作家権限がないとき' do
149 it 'ステータスコード302 Foundを返す' do
150 get :show, :id => @comic.id
151 response.status.should eq 302
153 it 'サインインページへ遷移する' do
154 get :show, :id => @comic.id
155 response.body.should redirect_to '/users/sign_in'
159 it 'ステータスコード401 Unauthorizedを返す' do
160 get :show, :id => @comic.id, :format => :json
161 response.status.should eq 401
163 it '応答メッセージにUnauthorizedを返す' do
164 get :show, :id => @comic.id, :format => :json
165 response.message.should match(/Unauthorized/)
170 context '対象コミックがないとき' do
172 it '例外404 not_foundを返す' do
175 }.should raise_error(ActiveRecord::RecordNotFound)
179 it '例外404 not_foundを返す' do
181 get :show, :id => 0, :format => :json
182 }.should raise_error(ActiveRecord::RecordNotFound)
186 context '非公開コミックを見ようとしたとき' do
188 it '例外403 forbiddenを返す' do
189 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
190 hidden = Factory :hidden_comic, :author_id => @author.id
192 get :show, :id => hidden
193 }.should raise_error(ActiveRecord::Forbidden)
197 it '例外403 forbiddenを返す' do
198 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
199 hidden = Factory :hidden_comic, :author_id => @author.id
201 get :show, :id => hidden, :format => :json
202 }.should raise_error(ActiveRecord::Forbidden)
210 @comic = Factory :normal_comic, :author_id => @user.author.id
211 Comic.stub(:show).and_return(@comic)
214 context '事前チェックする' do
216 Panel.stub(:count).and_return(10)
218 it '与えられたoffsetがセットされている' do
219 get :play, :id => @comic.id, :offset => 7
220 assigns(:offset).should eq 7
222 it '省略されると@offsetに0値が入る' do
223 get :play, :id => @comic.id
224 assigns(:offset).should eq 0
226 it 'コマ数以上が与えられるとコマ数-1が入る' do
227 get :play, :id => @comic.id, :offset => 10
228 assigns(:offset).should eq 9
230 it '負の値が与えられると末尾(コマ数)からさかのぼった値が入る' do
231 get :play, :id => @comic.id, :offset => -3
232 assigns(:offset).should eq 7
234 it 'コマ数以上の負の値が与えられると計算できないので0値が入る' do
235 get :play, :id => @comic.id, :offset => -13
236 assigns(:offset).should eq 0
238 it '与えられたcountがセットされている' do
239 get :play, :id => @comic.id, :count => 18
240 assigns(:panel_count).should eq 18
242 it '省略されると@countにデフォルト値が入る' do
243 get :play, :id => @comic.id
244 assigns(:panel_count).should eq Comic.default_panel_size
\r
246 it '最大を超えると@countにデフォルト最大値が入る' do
247 get :play, :id => @comic.id, :count => 1500
248 assigns(:panel_count).should eq Comic.max_panel_size
250 it '不正な値が入ると@countにデフォルト最大値が入る' do
251 get :play, :id => @comic.id, :page_size => 0
252 assigns(:panel_count).should eq Comic.default_panel_size
255 context 'つつがなく終わるとき' do
256 it 'ステータスコード200 OKを返す' do
257 get :play, :id => @comic.id
258 response.should be_success
260 it 'コミックモデルに単体取得を問い合わせている' do
261 Comic.should_receive(:show).exactly(1)
\r
262 get :play, :id => @comic.id
264 it '@comicにアレを取得している' do
265 get :play, :id => @comic.id
266 assigns(:comic).id.should eq(@comic.id)
269 it 'playテンプレートを描画する' do
270 get :play, :id => @comic.id
271 response.should render_template("play")
276 get :play, :id => @comic.id, :format => :json
277 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
280 get :play, :id => @comic.id, :format => :json
281 json = JSON.parse response.body
282 json["title"].should match(/normal/)
286 context '作家権限がないとき' do
291 it 'ステータスコード302 Foundを返す' do
292 get :play, :id => @comic.id
293 response.status.should eq 302
295 it 'サインインページへ遷移する' do
296 get :play, :id => @comic.id
297 response.body.should redirect_to '/users/sign_in'
301 it 'ステータスコード401 Unauthorizedを返す' do
302 get :play, :id => @comic.id, :format => :json
303 response.status.should eq 401
305 it '応答メッセージにUnauthorizedを返す' do
306 get :play, :id => @comic.id, :format => :json
307 response.message.should match(/Unauthorized/)
313 describe 'コミック数取得に於いて' do
315 Comic.should_receive(:visible_count).and_return(3)
318 context 'つつがなく終わるとき' do
319 it 'ステータスコード200 OKを返す' do
320 get :count, :format => :json
321 response.should be_success
325 get :count, :format => :json
326 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
328 it 'データがHash構造になっていてコミック数が1である' do
329 get :count, :format => :json
330 json = JSON.parse response.body
331 json["count"].should == 3
337 describe '新規作成フォーム表示に於いて' do
341 context 'つつがなく終わるとき' do
342 it 'ステータスコード200 OKを返す' do
344 response.should be_success
346 it '@comicに新規データを用意している' do
348 assigns(:comic).should be_a_new(Comic)
350 it 'コミックモデルにデフォルト値補充を依頼している' do
351 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
355 it 'newテンプレートを描画する' do
357 response.should render_template("new")
361 it 'new.jsテンプレートを描画する' do
362 get :new, :format => :js
363 response.should render_template("new")
367 context '作家権限がないとき' do
372 it 'ステータスコード302 Foundを返す' do
374 response.status.should eq 302
376 it 'サインインページへ遷移する' do
378 response.body.should redirect_to '/users/sign_in'
382 it 'ステータスコード401 Unauthorizedを返す' do
383 get :new, :format => :js
384 response.status.should eq 401
386 it '応答メッセージにUnauthorizedを返す' do
387 get :new, :format => :js
388 response.message.should match(/Unauthorized/)
394 describe '新規作成に於いて' do
398 context 'つつがなく終わるとき' do
400 Comic.any_instance.should_receive(:save).exactly(1)
401 post :create, :comic => Factory.attributes_for(:normal_comic)
403 it "@comicに作成されたコミックを保持していて、それがDBにある" do
404 post :create, :comic => Factory.attributes_for(:normal_comic)
405 assigns(:comic).should be_a(Comic)
406 assigns(:comic).should be_persisted
409 it 'ステータスコード302 Foundを返す' do
410 Comic.any_instance.stub(:save).and_return(true)
411 post :create, :comic => Factory.attributes_for(:normal_comic)
412 response.status.should eq 302
414 it '作成されたコミックの表示ページへ遷移する' do
415 # Comic.any_instance.stub(:save).and_return(true)
416 post :create, :comic => Factory.attributes_for(:normal_comic)
417 response.should redirect_to(Comic.last)
421 it 'ステータスコード200 OKを返す' do
422 # Comic.any_instance.stub(:save).and_return(true)
423 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
424 response.should be_success
426 it '作成されたコミックをjsonデータで返す' do
427 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
428 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
431 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
432 json = JSON.parse response.body
433 json["title"].should match(/normal/)
437 context '作家権限がないとき' do
442 it 'ステータスコード302 Foundを返す' do
443 post :create, :comic => Factory.attributes_for(:normal_comic)
444 response.status.should eq 302
446 it 'サインインページへ遷移する' do
447 post :create, :comic => Factory.attributes_for(:normal_comic)
448 response.body.should redirect_to '/users/sign_in'
452 it 'ステータスコード401 Unauthorizedを返す' do
453 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
454 response.status.should eq 401
456 it '応答メッセージにUnauthorizedを返す' do
457 post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
458 response.message.should match(/Unauthorized/)
462 context '検証、保存に失敗した' do
464 Comic.any_instance.stub(:save).and_return(false)
466 it "未保存のコミックを保持している" do
467 post :create, :comic => {}
468 assigns(:comic).should be_a_new(Comic)
471 it 'ステータスコード200 OKを返す' do
472 post :create, :comic => {}
473 response.status.should eq 200
476 post :create, :comic => {}
477 response.should render_template("new")
481 it 'ステータスコード422 unprocessable_entity を返す' do
482 post :create, :comic => {}, :format => :json
483 response.status.should eq 422
485 it '応答メッセージUnprocessable Entityを返す' do
486 post :create, :comic => {}, :format => :json
487 response.message.should match(/Unprocessable/)
493 describe '編集フォーム表示に於いて' do
495 @comic = Factory :normal_comic, :author_id => @user.author.id
497 Comic.stub(:show).and_return(@comic)
499 context 'つつがなく終わるとき' do
500 it 'ステータスコード200 OKを返す' do
501 get :edit, :id => @comic.id
502 response.should be_success
504 it 'コミックモデルに単体取得を問い合わせている' do
505 Comic.should_receive(:show).exactly(1)
\r
506 get :edit, :id => @comic.id
508 it '@comicにデータを用意している' do
509 get :edit, :id => @comic.id
510 assigns(:comic).should eq @comic
513 it 'editテンプレートを描画する' do
514 get :edit, :id => @comic.id
515 response.should render_template("edit")
519 it 'edit.jsテンプレートを描画する' do
520 get :edit, :id => @comic.id, :format => :js
521 response.should render_template("edit")
525 context '作家権限がないとき' do
530 it 'ステータスコード302 Foundを返す' do
531 get :edit, :id => @comic.id
532 response.status.should eq 302
534 it 'サインインページへ遷移する' do
535 get :edit, :id => @comic.id
536 response.body.should redirect_to '/users/sign_in'
540 it 'ステータスコード401 Unauthorizedを返す' do
541 get :edit, :id => @comic.id, :format => :js
542 response.status.should eq 401
544 it '応答メッセージにUnauthorizedを返す' do
545 get :edit, :id => @comic.id, :format => :js
546 response.message.should match(/Unauthorized/)
554 @comic = Factory :normal_comic, :author => @author
557 context '事前チェックしておく' do
558 it 'コミックモデルに単体取得を問い合わせている' do
559 Comic.stub(:show).with(any_args()).and_return @comic
\r
560 Comic.should_receive(:show).exactly(1)
\r
561 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
564 Comic.any_instance.should_receive(:update_attributes).with(any_args)
565 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
567 it '@comicにアレを取得している' do
568 put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
569 assigns(:comic).id.should eq(@comic.id)
572 context 'つつがなく終わるとき' do
574 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
\r
575 Comic.find(@comic.id).visible.should eq 0
578 it 'ステータスコード302 Foundを返す' do
579 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
580 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
581 response.status.should eq 302
583 it '更新されたコミックの表示ページへ遷移する' do
584 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
585 response.should redirect_to(@comic)
589 it 'ステータスコード200 OKを返す' do
590 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
591 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
592 response.should be_success
595 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
596 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
597 response.body.should match /./
601 context '作家権限がないとき' do
605 it 'ステータスコード302 Foundを返す' do
606 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
607 response.status.should eq 302
610 it 'サインインページへ遷移する' do
611 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
612 response.body.should redirect_to '/users/sign_in'
616 it '応答メッセージにUnauthorizedを返す' do
617 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
618 response.message.should match(/Unauthorized/)
622 context '検証、保存に失敗したとき' do
624 Comic.any_instance.stub(:update_attributes).and_return(false)
627 it 'ステータスコード200 Okを返す' do
628 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
629 response.status.should eq 200
632 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
633 response.should render_template("edit")
637 it 'ステータスコード422 unprocessable_entity を返す' do
638 Comic.any_instance.stub(:update_attributes).and_return(false)
639 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
640 response.status.should eq 422
642 it '応答メッセージUnprocessable Entityを返す' do
643 put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
644 response.message.should match(/Unprocessable/)