1 # -*- encoding: utf-8 -*-
\r
2 require 'spec_helper'
\r
5 describe ComicsController do
\r
7 FactoryGirl.create :admin
\r
8 @sp = FactoryGirl.create :system_picture
\r
9 @lg = FactoryGirl.create :license_group
\r
10 @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
\r
11 @user = FactoryGirl.create :user_yas
\r
12 @author = @user.author #ユーザ作成時に連動して作成される
\r
15 describe '一覧表示に於いて' do
\r
17 @comic = FactoryGirl.create :comic, :author_id => @user.author.id
\r
18 Comic.stub(:list).and_return([@comic, @comic, @comic])
\r
21 context '事前チェックする' do
\r
22 it '与えられたpageがセットされている' do
\r
23 get :index, :page => 5
\r
24 assigns(:page).should eq 5
\r
26 it '省略されると@pageに1値が入る' do
\r
28 assigns(:page).should eq 1
\r
30 it '与えられたpage_sizeがセットされている' do
\r
31 get :index, :page_size => 15
\r
32 assigns(:page_size).should eq 15
\r
34 it '省略されると@page_sizeにデフォルト値が入る' do
\r
36 assigns(:page_size).should eq Comic.default_page_size
\r
38 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
\r
39 get :index, :page_size => 1500
\r
40 assigns(:page_size).should eq Comic.max_page_size
\r
42 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
\r
43 get :index, :page_size => 0
\r
44 assigns(:page_size).should eq Comic.default_page_size
\r
47 context 'つつがなく終わるとき' do
\r
48 it 'ステータスコード200 OKを返す' do
\r
50 response.should be_success
\r
52 it 'コミックモデルに一覧を問い合わせている' do
\r
53 Comic.should_receive(:list).exactly(1)
\r
56 it '@comicsにリストを取得している' do
\r
58 assigns(:comics).should have_at_least(3).items
\r
61 it 'indexテンプレートを描画する' do
\r
63 response.should render_template("index")
\r
68 get :index, :format => :json
\r
69 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
71 it 'コミックモデルにjson一覧出力オプションを問い合わせている' do
72 Comic.should_receive(:list_json_opt).exactly(1)
73 get :index, :format => :json
75 it 'データがリスト構造になっている' do
\r
76 get :index, :format => :json
\r
77 json = JSON.parse response.body
\r
78 json.should have_at_least(3).items
\r
80 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
\r
81 get :index, :format => :json
\r
82 json = JSON.parse response.body
\r
83 json.first.has_key?("title").should be_true
\r
84 json.first.has_key?("visible").should be_true
\r
88 context '作家権限がないとき' do
\r
93 it 'ステータスコード302 Foundを返す' do
\r
95 response.status.should eq 302
\r
97 it 'サインインページへ遷移する' do
\r
99 response.should redirect_to '/users/sign_in'
\r
102 context 'json形式' do
\r
103 it 'ステータスコード401 Unauthorizedを返す' do
\r
104 get :index, :format => :json
\r
105 response.status.should eq 401
\r
107 it '応答メッセージにUnauthorizedを返す' do
\r
108 get :index, :format => :json
\r
109 response.message.should match(/Unauthorized/)
\r
115 describe '単体表示に於いて' do
\r
117 @comic = FactoryGirl.create :comic, :author_id => @user.author.id, :title => 'normal'
\r
118 Comic.stub(:show).and_return(@comic)
\r
121 context 'つつがなく終わるとき' do
\r
122 it 'ステータスコード200 OKを返す' do
\r
123 get :show, :id => @comic.id
\r
124 response.should be_success
\r
126 it 'コミックモデルに単体取得を問い合わせている' do
\r
127 Comic.should_receive(:show).exactly(1)
\r
130 it '@comicにアレを取得している' do
\r
131 get :show, :id => @comic.id
\r
132 assigns(:comic).id.should eq(@comic.id)
\r
134 context 'html形式' do
\r
135 it 'showテンプレートを描画する' do
\r
136 get :show, :id => @comic.id
\r
137 response.should render_template("show")
\r
140 context 'json形式' do
\r
142 get :show, :id => @comic.id, :format => :json
\r
143 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
145 it 'コミックモデルにjson単体出力オプションを問い合わせている' do
146 Comic.should_receive(:show_json_opt).exactly(1)
147 get :show, :id => @comic.id, :format => :json
149 it 'データがアレになっている' do
\r
150 get :show, :id => @comic.id, :format => :json
\r
151 json = JSON.parse response.body
\r
152 json["title"].should match(/normal/)
\r
153 json["visible"].should_not be_nil
\r
157 context '作家権限がないとき' do
\r
161 context 'html形式' do
\r
162 it 'ステータスコード302 Foundを返す' do
\r
163 get :show, :id => @comic.id
\r
164 response.status.should eq 302
\r
166 it 'サインインページへ遷移する' do
\r
167 get :show, :id => @comic.id
\r
168 response.body.should redirect_to '/users/sign_in'
\r
171 context 'json形式' do
\r
172 it 'ステータスコード401 Unauthorizedを返す' do
\r
173 get :show, :id => @comic.id, :format => :json
\r
174 response.status.should eq 401
\r
176 it '応答メッセージにUnauthorizedを返す' do
\r
177 get :show, :id => @comic.id, :format => :json
\r
178 response.message.should match(/Unauthorized/)
\r
183 context '対象コミックがないとき' do
\r
184 context 'html形式' do
\r
185 it '例外404 not_foundを返す' do
\r
187 get :show, :id => 0
\r
188 }.should raise_error(ActiveRecord::RecordNotFound)
\r
191 context 'json形式' do
\r
192 it '例外404 not_foundを返す' do
\r
194 get :show, :id => 0, :format => :json
\r
195 }.should raise_error(ActiveRecord::RecordNotFound)
\r
199 context '非公開コミックを見ようとしたとき' do
\r
200 context 'html形式' do
\r
201 it '例外403 forbiddenを返す' do
\r
202 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
203 hidden = FactoryGirl.create :hidden_comic, :author_id => @author.id
\r
205 get :show, :id => hidden
\r
206 }.should raise_error(ActiveRecord::Forbidden)
\r
209 context 'json形式' do
\r
210 it '例外403 forbiddenを返す' do
\r
211 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
212 hidden = FactoryGirl.create :hidden_comic, :author_id => @author.id
\r
214 get :show, :id => hidden, :format => :json
\r
215 }.should raise_error(ActiveRecord::Forbidden)
\r
221 describe 'コミック数取得に於いて' do
\r
223 Comic.should_receive(:visible_count).and_return(3)
\r
226 context 'つつがなく終わるとき' do
\r
227 it 'ステータスコード200 OKを返す' do
\r
228 get :count, :format => :json
\r
229 response.should be_success
\r
231 context 'json形式' do
\r
233 get :count, :format => :json
\r
234 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
236 it 'データがHash構造になっていてコミック数が1である' do
\r
237 get :count, :format => :json
\r
238 json = JSON.parse response.body
\r
239 json["count"].should == 3
\r
245 describe '新規作成フォーム表示に於いて' do
\r
249 context 'つつがなく終わるとき' do
\r
250 it 'ステータスコード200 OKを返す' do
\r
252 response.should be_success
\r
254 it '@comicに新規データを用意している' do
\r
256 assigns(:comic).should be_a_new(Comic)
\r
258 it 'コミックモデルにデフォルト値補充を依頼している' do
\r
259 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
262 context 'html形式' do
\r
263 it 'newテンプレートを描画する' do
\r
265 response.should render_template("new")
\r
269 it 'new.jsテンプレートを描画する' do
\r
270 get :new, :format => :js
\r
271 response.should render_template("new")
\r
276 get :new, :format => :json
277 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
279 it 'コミックモデルにjson単体出力オプションを問い合わせている' do
280 Comic.should_receive(:show_json_opt).exactly(1)
281 get :new, :format => :json
285 context '作家権限がないとき' do
\r
289 context 'html形式' do
\r
290 it 'ステータスコード302 Foundを返す' do
\r
292 response.status.should eq 302
\r
294 it 'サインインページへ遷移する' do
\r
296 response.body.should redirect_to '/users/sign_in'
\r
300 it 'ステータスコード401 Unauthorizedを返す' do
\r
301 get :new, :format => :js
\r
302 response.status.should eq 401
\r
304 it '応答メッセージにUnauthorizedを返す' do
\r
305 get :new, :format => :js
\r
306 response.message.should match(/Unauthorized/)
\r
312 describe '新規作成に於いて' do
\r
315 @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'normal')
\r
317 context '事前チェックしておく' do
\r
318 it 'コミックモデルにデフォルト値補充を依頼している' do
\r
319 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
320 post :create, :artist => @attr
\r
322 it 'コミックモデルにカラム値復元を依頼している' do
\r
323 Comic.any_instance.should_receive(:attributes=).exactly(1)
\r
324 post :create, :artist => @attr
\r
326 it 'コミックモデルに上書き補充を依頼している' do
\r
327 Comic.any_instance.should_receive(:overwrite).exactly(1)
\r
328 post :create, :artist => @attr
\r
331 Comic.any_instance.should_receive(:save).exactly(1)
\r
332 post :create, :artist => @attr
\r
335 context 'つつがなく終わるとき' do
\r
336 it "@comicに作成されたコミックを保持していて、それがDBにある" do
\r
337 post :create, :comic => @attr
\r
338 assigns(:comic).should be_a(Comic)
\r
339 assigns(:comic).should be_persisted
\r
341 context 'html形式' do
\r
342 it 'ステータスコード302 Foundを返す' do
\r
343 Comic.any_instance.stub(:save).and_return(true)
\r
344 post :create, :comic => @attr
\r
345 response.status.should eq 302
\r
347 it '作成されたコミックの表示ページへ遷移する' do
\r
348 # Comic.any_instance.stub(:save).and_return(true)
\r
349 post :create, :comic => @attr
\r
350 response.should redirect_to(Comic.last)
\r
353 context 'json形式' do
\r
354 it 'ステータスコード200 OKを返す' do
\r
355 # Comic.any_instance.stub(:save).and_return(true)
\r
356 post :create, :comic => @attr, :format => :json
\r
357 response.should be_success
\r
359 it '作成されたコミックをjsonデータで返す' do
\r
360 post :create, :comic => @attr, :format => :json
\r
361 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
363 it 'データがアレになっている' do
\r
364 post :create, :comic => @attr, :format => :json
\r
365 json = JSON.parse response.body
\r
366 json["title"].should match(/normal/)
\r
367 json["visible"].should_not be_nil
\r
371 context '作家権限がないとき' do
\r
375 context 'html形式' do
\r
376 it 'ステータスコード302 Foundを返す' do
\r
377 post :create, :comic => @attr
\r
378 response.status.should eq 302
\r
380 it 'サインインページへ遷移する' do
\r
381 post :create, :comic => @attr
\r
382 response.body.should redirect_to '/users/sign_in'
\r
385 context 'json形式' do
\r
386 it 'ステータスコード401 Unauthorizedを返す' do
\r
387 post :create, :comic => @attr, :format => :json
\r
388 response.status.should eq 401
\r
390 it '応答メッセージにUnauthorizedを返す' do
\r
391 post :create, :comic => @attr, :format => :json
\r
392 response.message.should match(/Unauthorized/)
\r
396 context '検証、保存に失敗した' do
\r
398 Comic.any_instance.stub(:save).and_return(false)
\r
400 it "未保存のコミックを保持している" do
\r
401 post :create, :comic => @attr
\r
402 assigns(:comic).should be_a_new(Comic)
\r
404 context 'html形式' do
\r
405 it 'ステータスコード200 OKを返す' do
\r
406 post :create, :comic => @attr
\r
407 response.status.should eq 200
\r
410 post :create, :comic => @attr
\r
411 response.should render_template("new")
\r
414 context 'json形式' do
\r
415 it 'ステータスコード422 unprocessable_entity を返す' do
\r
416 post :create, :comic => @attr, :format => :json
\r
417 response.status.should eq 422
\r
419 it '応答メッセージUnprocessable Entityを返す' do
\r
420 post :create, :comic => @attr, :format => :json
\r
421 response.message.should match(/Unprocessable/)
\r
427 describe '編集フォーム表示に於いて' do
\r
429 @comic = FactoryGirl.create :comic, :author_id => @user.author.id
\r
431 Comic.stub(:edit).and_return(@comic)
\r
433 context 'つつがなく終わるとき' do
\r
434 it 'ステータスコード200 OKを返す' do
\r
435 get :edit, :id => @comic.id
\r
436 response.should be_success
\r
438 it 'コミックモデルに編集取得を問い合わせている' do
\r
439 Comic.should_receive(:edit).exactly(1)
\r
440 get :edit, :id => @comic.id
\r
442 it '@comicにデータを用意している' do
\r
443 get :edit, :id => @comic.id
\r
444 assigns(:comic).should eq @comic
\r
446 context 'html形式' do
\r
447 it 'editテンプレートを描画する' do
\r
448 get :edit, :id => @comic.id
\r
449 response.should render_template("edit")
\r
453 it 'edit.jsテンプレートを描画する' do
\r
454 get :edit, :id => @comic.id, :format => :js
\r
455 response.should render_template("edit")
\r
459 context '作家権限がないとき' do
\r
463 context 'html形式' do
\r
464 it 'ステータスコード302 Foundを返す' do
\r
465 get :edit, :id => @comic.id
\r
466 response.status.should eq 302
\r
468 it 'サインインページへ遷移する' do
\r
469 get :edit, :id => @comic.id
\r
470 response.body.should redirect_to '/users/sign_in'
\r
474 it 'ステータスコード401 Unauthorizedを返す' do
\r
475 get :edit, :id => @comic.id, :format => :js
\r
476 response.status.should eq 401
\r
478 it '応答メッセージにUnauthorizedを返す' do
\r
479 get :edit, :id => @comic.id, :format => :js
\r
480 response.message.should match(/Unauthorized/)
\r
486 describe '更新に於いて' do
\r
488 @comic = FactoryGirl.create :comic, :author => @author
\r
489 @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'updated title', :visible => 0)
\r
492 context '事前チェックしておく' do
\r
493 it 'コミックモデルに編集取得を問い合わせている' do
\r
494 Comic.stub(:edit).with(any_args()).and_return @comic
\r
495 Comic.should_receive(:edit).exactly(1)
\r
496 put :update, :id => @comic.id, :comic => @attr
\r
498 it 'コミックモデルにカラム値復元を依頼している' do
\r
499 Comic.any_instance.should_receive(:attributes=).exactly(1)
\r
500 put :update, :id => @comic.id, :comic => @attr
\r
502 it 'コミックモデルに上書き補充を依頼している' do
\r
503 Comic.any_instance.should_receive(:overwrite).exactly(1)
\r
504 put :update, :id => @comic.id, :comic => @attr
\r
506 it 'モデルに更新を依頼する' do
\r
507 Comic.any_instance.stub(:save).with(any_args).and_return true
\r
508 Comic.any_instance.should_receive(:save).exactly(1)
\r
509 put :update, :id => @comic.id, :comic => @attr
\r
511 it '@comicにアレを取得している' do
\r
512 put :update, :id => @comic.id, :comic => @attr
\r
513 assigns(:comic).id.should eq(@comic.id)
\r
516 context 'つつがなく終わるとき' do
\r
518 put :update, :id => @comic.id, :comic => @attr
\r
519 Comic.find(@comic.id).visible.should eq 0
\r
521 context 'html形式' do
\r
522 it 'ステータスコード302 Foundを返す' do
\r
523 Comic.any_instance.stub(:save).with(any_args()).and_return(true)
\r
524 put :update, :id => @comic.id, :comic => @attr
\r
525 response.status.should eq 302
\r
527 it '更新されたコミックの表示ページへ遷移する' do
\r
528 put :update, :id => @comic.id, :comic => @attr
\r
529 response.should redirect_to(@comic)
\r
532 context 'json形式' do
\r
533 it 'ステータスコード200 OKを返す' do
\r
534 Comic.any_instance.stub(:save).with(any_args()).and_return(true)
\r
535 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
536 response.should be_success
\r
538 it 'ページ本体は特に返さない' do
\r
539 Comic.any_instance.stub(:save).with(any_args()).and_return(true)
\r
540 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
541 response.body.should match /./
\r
545 context '作家権限がないとき' do
\r
549 it 'ステータスコード302 Foundを返す' do
\r
550 put :update, :id => @comic.id, :comic => @attr
\r
551 response.status.should eq 302
\r
553 context 'html形式' do
\r
554 it 'サインインページへ遷移する' do
\r
555 put :update, :id => @comic.id, :comic => @attr
\r
556 response.body.should redirect_to '/users/sign_in'
\r
559 context 'json形式' do
\r
560 it '応答メッセージにUnauthorizedを返す' do
\r
561 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
562 response.message.should match(/Unauthorized/)
\r
566 context '検証、保存に失敗したとき' do
\r
568 Comic.any_instance.stub(:save).and_return(false)
\r
570 context 'html形式' do
\r
571 it 'ステータスコード200 Okを返す' do
\r
572 put :update, :id => @comic.id, :comic => @attr
\r
573 response.status.should eq 200
\r
576 put :update, :id => @comic.id, :comic => @attr
\r
577 response.should render_template("edit")
\r
580 context 'json形式' do
\r
581 it 'ステータスコード422 unprocessable_entity を返す' do
\r
582 Comic.any_instance.stub(:save).and_return(false)
\r
583 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
584 response.status.should eq 422
\r
586 it '応答メッセージUnprocessable Entityを返す' do
\r
587 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
588 response.message.should match(/Unprocessable/)
\r