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 #ユーザ作成時に連動して作成される
\r
14 describe '一覧表示に於いて' do
\r
16 @comic = Factory :comic, :author_id => @user.author.id
\r
17 Comic.stub(:list).and_return([@comic, @comic, @comic])
\r
20 context '事前チェックする' do
\r
21 it '与えられたpageがセットされている' do
\r
22 get :index, :page => 5
\r
23 assigns(:page).should eq 5
\r
25 it '省略されると@pageに1値が入る' do
\r
27 assigns(:page).should eq 1
\r
29 it '与えられたpage_sizeがセットされている' do
\r
30 get :index, :page_size => 15
\r
31 assigns(:page_size).should eq 15
\r
33 it '省略されると@page_sizeにデフォルト値が入る' do
\r
35 assigns(:page_size).should eq Comic.default_page_size
\r
37 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
\r
38 get :index, :page_size => 1500
\r
39 assigns(:page_size).should eq Comic.max_page_size
\r
41 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
\r
42 get :index, :page_size => 0
\r
43 assigns(:page_size).should eq Comic.default_page_size
\r
46 context 'つつがなく終わるとき' do
\r
47 it 'ステータスコード200 OKを返す' do
\r
49 response.should be_success
\r
51 it 'コミックモデルに一覧を問い合わせている' do
\r
52 Comic.should_receive(:list).exactly(1)
\r
55 it '@comicsにリストを取得している' do
\r
57 assigns(:comics).should have_at_least(3).items
\r
60 it 'indexテンプレートを描画する' do
\r
62 response.should render_template("index")
\r
67 get :index, :format => :json
\r
68 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
70 it 'データがリスト構造になっている' do
\r
71 get :index, :format => :json
\r
72 json = JSON.parse response.body
\r
73 json.should have_at_least(3).items
\r
75 it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
\r
76 get :index, :format => :json
\r
77 json = JSON.parse response.body
\r
78 json.first.has_key?("title").should be_true
\r
82 context '作家権限がないとき' do
\r
87 it 'ステータスコード302 Foundを返す' do
\r
89 response.status.should eq 302
\r
91 it 'サインインページへ遷移する' do
\r
93 response.should redirect_to '/users/sign_in'
\r
97 it 'ステータスコード401 Unauthorizedを返す' do
\r
98 get :index, :format => :json
\r
99 response.status.should eq 401
\r
101 it '応答メッセージにUnauthorizedを返す' do
\r
102 get :index, :format => :json
\r
103 response.message.should match(/Unauthorized/)
\r
109 describe '単体表示に於いて' do
\r
111 @comic = Factory :comic, :author_id => @user.author.id, :title => 'normal'
\r
112 Comic.stub(:show).and_return(@comic)
\r
115 context 'つつがなく終わるとき' do
\r
116 it 'ステータスコード200 OKを返す' do
\r
117 get :show, :id => @comic.id
\r
118 response.should be_success
\r
120 it 'コミックモデルに単体取得を問い合わせている' do
\r
121 Comic.should_receive(:show).exactly(1)
\r
124 it '@comicにアレを取得している' do
\r
125 get :show, :id => @comic.id
\r
126 assigns(:comic).id.should eq(@comic.id)
\r
128 context 'html形式' do
\r
129 it 'showテンプレートを描画する' do
\r
130 get :show, :id => @comic.id
\r
131 response.should render_template("show")
\r
134 context 'json形式' do
\r
136 get :show, :id => @comic.id, :format => :json
\r
137 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
139 it 'データがアレになっている' do
\r
140 get :show, :id => @comic.id, :format => :json
\r
141 json = JSON.parse response.body
\r
142 json["title"].should match(/normal/)
\r
146 context '作家権限がないとき' do
\r
150 context 'html形式' do
\r
151 it 'ステータスコード302 Foundを返す' do
\r
152 get :show, :id => @comic.id
\r
153 response.status.should eq 302
\r
155 it 'サインインページへ遷移する' do
\r
156 get :show, :id => @comic.id
\r
157 response.body.should redirect_to '/users/sign_in'
\r
160 context 'json形式' do
\r
161 it 'ステータスコード401 Unauthorizedを返す' do
\r
162 get :show, :id => @comic.id, :format => :json
\r
163 response.status.should eq 401
\r
165 it '応答メッセージにUnauthorizedを返す' do
\r
166 get :show, :id => @comic.id, :format => :json
\r
167 response.message.should match(/Unauthorized/)
\r
172 context '対象コミックがないとき' do
\r
173 context 'html形式' do
\r
174 it '例外404 not_foundを返す' do
\r
176 get :show, :id => 0
\r
177 }.should raise_error(ActiveRecord::RecordNotFound)
\r
180 context 'json形式' do
\r
181 it '例外404 not_foundを返す' do
\r
183 get :show, :id => 0, :format => :json
\r
184 }.should raise_error(ActiveRecord::RecordNotFound)
\r
188 context '非公開コミックを見ようとしたとき' do
\r
189 context 'html形式' do
\r
190 it '例外403 forbiddenを返す' do
\r
191 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
192 hidden = Factory :hidden_comic, :author_id => @author.id
\r
194 get :show, :id => hidden
\r
195 }.should raise_error(ActiveRecord::Forbidden)
\r
198 context 'json形式' do
\r
199 it '例外403 forbiddenを返す' do
\r
200 Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
201 hidden = Factory :hidden_comic, :author_id => @author.id
\r
203 get :show, :id => hidden, :format => :json
\r
204 }.should raise_error(ActiveRecord::Forbidden)
\r
210 describe 'コミック数取得に於いて' do
\r
212 Comic.should_receive(:visible_count).and_return(3)
\r
215 context 'つつがなく終わるとき' do
\r
216 it 'ステータスコード200 OKを返す' do
\r
217 get :count, :format => :json
\r
218 response.should be_success
\r
220 context 'json形式' do
\r
222 get :count, :format => :json
\r
223 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
225 it 'データがHash構造になっていてコミック数が1である' do
\r
226 get :count, :format => :json
\r
227 json = JSON.parse response.body
\r
228 json["count"].should == 3
\r
234 describe '新規作成フォーム表示に於いて' do
\r
238 context 'つつがなく終わるとき' do
\r
239 it 'ステータスコード200 OKを返す' do
\r
241 response.should be_success
\r
243 it '@comicに新規データを用意している' do
\r
245 assigns(:comic).should be_a_new(Comic)
\r
247 it 'コミックモデルにデフォルト値補充を依頼している' do
\r
248 Comic.any_instance.should_receive(:supply_default).exactly(1)
\r
251 context 'html形式' do
\r
252 it 'newテンプレートを描画する' do
\r
254 response.should render_template("new")
\r
258 it 'new.jsテンプレートを描画する' do
\r
259 get :new, :format => :js
\r
260 response.should render_template("new")
\r
264 context '作家権限がないとき' do
\r
268 context 'html形式' do
\r
269 it 'ステータスコード302 Foundを返す' do
\r
271 response.status.should eq 302
\r
273 it 'サインインページへ遷移する' do
\r
275 response.body.should redirect_to '/users/sign_in'
\r
279 it 'ステータスコード401 Unauthorizedを返す' do
\r
280 get :new, :format => :js
\r
281 response.status.should eq 401
\r
283 it '応答メッセージにUnauthorizedを返す' do
\r
284 get :new, :format => :js
\r
285 response.message.should match(/Unauthorized/)
\r
291 describe '新規作成に於いて' do
\r
294 @attr = Factory.attributes_for(:comic, :author_id => @author.id, :title => 'normal')
\r
296 context 'つつがなく終わるとき' do
\r
298 Comic.any_instance.should_receive(:save).exactly(1)
\r
299 post :create, :comic => @attr
\r
301 it "@comicに作成されたコミックを保持していて、それがDBにある" do
\r
302 post :create, :comic => @attr
\r
303 assigns(:comic).should be_a(Comic)
\r
304 assigns(:comic).should be_persisted
\r
306 context 'html形式' do
\r
307 it 'ステータスコード302 Foundを返す' do
\r
308 Comic.any_instance.stub(:save).and_return(true)
\r
309 post :create, :comic => @attr
\r
310 response.status.should eq 302
\r
312 it '作成されたコミックの表示ページへ遷移する' do
\r
313 # Comic.any_instance.stub(:save).and_return(true)
\r
314 post :create, :comic => @attr
\r
315 response.should redirect_to(Comic.last)
\r
318 context 'json形式' do
\r
319 it 'ステータスコード200 OKを返す' do
\r
320 # Comic.any_instance.stub(:save).and_return(true)
\r
321 post :create, :comic => @attr, :format => :json
\r
322 response.should be_success
\r
324 it '作成されたコミックをjsonデータで返す' do
\r
325 post :create, :comic => @attr, :format => :json
\r
326 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
328 it 'データがアレになっている' do
\r
329 post :create, :comic => @attr, :format => :json
\r
330 json = JSON.parse response.body
\r
331 json["title"].should match(/normal/)
\r
335 context '作家権限がないとき' do
\r
339 context 'html形式' do
\r
340 it 'ステータスコード302 Foundを返す' do
\r
341 post :create, :comic => @attr
\r
342 response.status.should eq 302
\r
344 it 'サインインページへ遷移する' do
\r
345 post :create, :comic => @attr
\r
346 response.body.should redirect_to '/users/sign_in'
\r
349 context 'json形式' do
\r
350 it 'ステータスコード401 Unauthorizedを返す' do
\r
351 post :create, :comic => @attr, :format => :json
\r
352 response.status.should eq 401
\r
354 it '応答メッセージにUnauthorizedを返す' do
\r
355 post :create, :comic => @attr, :format => :json
\r
356 response.message.should match(/Unauthorized/)
\r
360 context '検証、保存に失敗した' do
\r
362 Comic.any_instance.stub(:save).and_return(false)
\r
364 it "未保存のコミックを保持している" do
\r
365 post :create, :comic => {}
\r
366 assigns(:comic).should be_a_new(Comic)
\r
368 context 'html形式' do
\r
369 it 'ステータスコード200 OKを返す' do
\r
370 post :create, :comic => {}
\r
371 response.status.should eq 200
\r
374 post :create, :comic => {}
\r
375 response.should render_template("new")
\r
378 context 'json形式' do
\r
379 it 'ステータスコード422 unprocessable_entity を返す' do
\r
380 post :create, :comic => {}, :format => :json
\r
381 response.status.should eq 422
\r
383 it '応答メッセージUnprocessable Entityを返す' do
\r
384 post :create, :comic => {}, :format => :json
\r
385 response.message.should match(/Unprocessable/)
\r
391 describe '編集フォーム表示に於いて' do
\r
393 @comic = Factory :comic, :author_id => @user.author.id
\r
395 Comic.stub(:show).and_return(@comic)
\r
397 context 'つつがなく終わるとき' do
\r
398 it 'ステータスコード200 OKを返す' do
\r
399 get :edit, :id => @comic.id
\r
400 response.should be_success
\r
402 it 'コミックモデルに単体取得を問い合わせている' do
\r
403 Comic.should_receive(:show).exactly(1)
\r
404 get :edit, :id => @comic.id
\r
406 it '@comicにデータを用意している' do
\r
407 get :edit, :id => @comic.id
\r
408 assigns(:comic).should eq @comic
\r
410 context 'html形式' do
\r
411 it 'editテンプレートを描画する' do
\r
412 get :edit, :id => @comic.id
\r
413 response.should render_template("edit")
\r
417 it 'edit.jsテンプレートを描画する' do
\r
418 get :edit, :id => @comic.id, :format => :js
\r
419 response.should render_template("edit")
\r
423 context '作家権限がないとき' do
\r
427 context 'html形式' do
\r
428 it 'ステータスコード302 Foundを返す' do
\r
429 get :edit, :id => @comic.id
\r
430 response.status.should eq 302
\r
432 it 'サインインページへ遷移する' do
\r
433 get :edit, :id => @comic.id
\r
434 response.body.should redirect_to '/users/sign_in'
\r
438 it 'ステータスコード401 Unauthorizedを返す' do
\r
439 get :edit, :id => @comic.id, :format => :js
\r
440 response.status.should eq 401
\r
442 it '応答メッセージにUnauthorizedを返す' do
\r
443 get :edit, :id => @comic.id, :format => :js
\r
444 response.message.should match(/Unauthorized/)
\r
450 describe '更新に於いて' do
\r
452 @comic = Factory :comic, :author => @author
\r
453 @attr = Factory.attributes_for(:comic, :author_id => @author.id, :title => 'updated title', :visible => 0)
\r
456 context '事前チェックしておく' do
\r
457 it 'コミックモデルに単体取得を問い合わせている' do
\r
458 Comic.stub(:show).with(any_args()).and_return @comic
\r
459 Comic.should_receive(:show).exactly(1)
\r
460 put :update, :id => @comic.id, :comic => @attr
\r
462 it 'モデルに更新を依頼する' do
\r
463 Comic.any_instance.should_receive(:update_attributes).with(any_args)
\r
464 put :update, :id => @comic.id, :comic => @attr
\r
466 it '@comicにアレを取得している' do
\r
467 put :update, :id => @comic.id, :comic => @attr
\r
468 assigns(:comic).id.should eq(@comic.id)
\r
471 context 'つつがなく終わるとき' do
\r
473 put :update, :id => @comic.id, :comic => @attr
\r
474 Comic.find(@comic.id).visible.should eq 0
\r
476 context 'html形式' do
\r
477 it 'ステータスコード302 Foundを返す' do
\r
478 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
\r
479 put :update, :id => @comic.id, :comic => @attr
\r
480 response.status.should eq 302
\r
482 it '更新されたコミックの表示ページへ遷移する' do
\r
483 put :update, :id => @comic.id, :comic => @attr
\r
484 response.should redirect_to(@comic)
\r
487 context 'json形式' do
\r
488 it 'ステータスコード200 OKを返す' do
\r
489 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
\r
490 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
491 response.should be_success
\r
493 it 'ページ本体は特に返さない' do
\r
494 Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
\r
495 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
496 response.body.should match /./
\r
500 context '作家権限がないとき' do
\r
504 it 'ステータスコード302 Foundを返す' do
\r
505 put :update, :id => @comic.id, :comic => @attr
\r
506 response.status.should eq 302
\r
508 context 'html形式' do
\r
509 it 'サインインページへ遷移する' do
\r
510 put :update, :id => @comic.id, :comic => @attr
\r
511 response.body.should redirect_to '/users/sign_in'
\r
514 context 'json形式' do
\r
515 it '応答メッセージにUnauthorizedを返す' do
\r
516 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
517 response.message.should match(/Unauthorized/)
\r
521 context '検証、保存に失敗したとき' do
\r
523 Comic.any_instance.stub(:update_attributes).and_return(false)
\r
525 context 'html形式' do
\r
526 it 'ステータスコード200 Okを返す' do
\r
527 put :update, :id => @comic.id, :comic => @attr
\r
528 response.status.should eq 200
\r
531 put :update, :id => @comic.id, :comic => @attr
\r
532 response.should render_template("edit")
\r
535 context 'json形式' do
\r
536 it 'ステータスコード422 unprocessable_entity を返す' do
\r
537 Comic.any_instance.stub(:update_attributes).and_return(false)
\r
538 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
539 response.status.should eq 422
\r
541 it '応答メッセージUnprocessable Entityを返す' do
\r
542 put :update, :id => @comic.id, :comic => @attr, :format => :json
\r
543 response.message.should match(/Unprocessable/)
\r