1 # -*- encoding: utf-8 -*-
\r
2 require 'spec_helper'
\r
4 describe PanelsController do
\r
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 @panel = Factory :panel, :author_id => @author.id
\r
17 Panel.stub(:list).and_return([@panel, @panel, @panel])
\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 Panel.default_page_size
\r
37 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
\r
38 get :index, :page_size => 1500
\r
39 assigns(:page_size).should eq Panel.max_page_size
\r
41 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
\r
42 get :index, :page_size => 0
\r
43 assigns(:page_size).should eq Panel.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 Panel.should_receive(:list).exactly(1)
\r
55 it '@panelsにリストを取得している' do
\r
57 assigns(:panels).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?("border").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 @panel = Factory :panel, :author_id => @user.author.id
\r
112 Panel.stub(:show).and_return(@panel)
\r
115 context 'つつがなく終わるとき' do
\r
116 it 'ステータスコード200 OKを返す' do
\r
117 get :show, :id => @panel.id
\r
118 response.should be_success
\r
120 it 'コマモデルに単体取得を問い合わせている' do
\r
121 Panel.should_receive(:show).exactly(1)
\r
124 it '@panelにアレを取得している' do
\r
125 get :show, :id => @panel.id
\r
126 assigns(:panel).id.should eq(@panel.id)
\r
128 context 'html形式' do
\r
129 it 'showテンプレートを描画する' do
\r
130 get :show, :id => @panel.id
\r
131 response.should render_template("show")
\r
134 context 'json形式' do
\r
136 get :show, :id => @panel.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 => @panel.id, :format => :json
\r
141 json = JSON.parse response.body
\r
142 json["width"].should eq 100
\r
146 context '作家権限がないとき' do
\r
150 context 'html形式' do
\r
151 it 'ステータスコード302 Foundを返す' do
\r
152 get :show, :id => @panel.id
\r
153 response.status.should eq 302
\r
155 it 'サインインページへ遷移する' do
\r
156 get :show, :id => @panel.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 => @panel.id, :format => :json
\r
163 response.status.should eq 401
\r
165 it '応答メッセージにUnauthorizedを返す' do
\r
166 get :show, :id => @panel.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 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
192 hidden = Factory :hidden_panel, :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 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
201 hidden = Factory :hidden_panel, :author_id => @author.id
\r
203 get :show, :id => hidden, :format => :json
\r
204 }.should raise_error(ActiveRecord::Forbidden)
\r
211 describe 'コマ数取得に於いて' do
\r
213 Panel.should_receive(:visible_count).and_return(3)
\r
216 context 'つつがなく終わるとき' do
\r
217 it 'ステータスコード200 OKを返す' do
\r
218 get :count, :format => :json
\r
219 response.should be_success
\r
221 context 'json形式' do
\r
223 get :count, :format => :json
\r
224 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
226 it 'データがHash構造になっていてコマ数が1である' do
\r
227 get :count, :format => :json
\r
228 json = JSON.parse response.body
\r
229 json["count"].should == 3
\r
235 describe '新規作成フォーム表示に於いて' do
\r
239 context 'つつがなく終わるとき' do
\r
240 it 'ステータスコード200 OKを返す' do
\r
242 response.should be_success
\r
244 it '@panelに新規データを用意している' do
\r
246 assigns(:panel).should be_a_new(Panel)
\r
248 it 'コマモデルにデフォルト値補充を依頼している' do
\r
249 Panel.any_instance.should_receive(:supply_default).exactly(1)
\r
252 context 'html形式' do
\r
253 it 'newテンプレートを描画する' do
\r
255 response.should render_template("new")
\r
259 it 'new.jsテンプレートを描画する' do
\r
260 get :new, :format => :js
\r
261 response.should render_template("new")
\r
265 context '作家権限がないとき' do
\r
269 context 'html形式' do
\r
270 it 'ステータスコード302 Foundを返す' do
\r
272 response.status.should eq 302
\r
274 it 'サインインページへ遷移する' do
\r
276 response.body.should redirect_to '/users/sign_in'
\r
280 it 'ステータスコード401 Unauthorizedを返す' do
\r
281 get :new, :format => :js
\r
282 response.status.should eq 401
\r
284 it '応答メッセージにUnauthorizedを返す' do
\r
285 get :new, :format => :js
\r
286 response.message.should match(/Unauthorized/)
\r
292 describe '新規作成に於いて' do
\r
294 @panel = Factory :panel, :author_id => @user.author.id
\r
295 @attr = Factory.attributes_for(:panel, :author_id => @author.id)
\r
298 context '事前チェックする' do
\r
301 Panel.stub(:count).and_return(10)
\r
303 it 'panelがパラメータにあれば、展開する' do
\r
304 post :create, :panel => @attr
\r
305 assigns(:prm)['border'].to_i.should eq @panel.border
\r
307 it 'jsonがパラメータにあれば、展開する' do
\r
308 post :create, :json => Factory.attributes_for(:panel, :border => 4).to_json
\r
309 assigns(:prm)['border'].to_i.should eq 4
\r
311 it 'panel・json両パラメータがあれば、panelを優先して展開する' do
\r
313 :panel => Factory.attributes_for(:panel),
\r
314 :json => Factory.attributes_for(:panel, :border => 4).to_json
\r
316 assigns(:prm)['border'].to_i.should eq @panel.border
\r
319 context 'つつがなく終わるとき' do
\r
320 it 'コマモデルにデフォルト値補充を依頼している' do
\r
321 Panel.any_instance.should_receive(:supply_default).exactly(1)
\r
322 post :create, :panel => @attr
\r
324 it 'コマモデルに上書き補充を依頼している' do
\r
325 Panel.any_instance.should_receive(:overwrite).exactly(1)
\r
326 post :create, :panel => @attr
\r
329 Panel.any_instance.should_receive(:store).exactly(1)
\r
330 post :create, :panel => @attr
\r
332 it "@panelに作成されたコマを保持していて、それがDBにある" do
\r
333 post :create, :panel => @attr
\r
334 assigns(:panel).should be_a(Panel)
\r
335 assigns(:panel).should be_persisted
\r
337 context 'html形式' do
\r
338 it 'ステータスコード302 Foundを返す' do
\r
339 Panel.any_instance.stub(:store).and_return(true)
\r
340 post :create, :panel => @attr
\r
341 response.status.should eq 302
\r
343 it '作成されたコマの表示ページへ遷移する' do
\r
344 # Panel.any_instance.stub(:store).and_return(true)
\r
345 post :create, :panel => @attr
\r
346 response.should redirect_to(Panel.last)
\r
349 context 'json形式' do
\r
350 it 'ステータスコード200 OKを返す' do
\r
351 # Panel.any_instance.stub(:store).and_return(true)
\r
352 post :create, :panel => @attr, :format => :json
\r
353 response.should be_success
\r
355 it '作成されたコマをjsonデータで返す' do
\r
356 post :create, :panel => @attr, :format => :json
\r
357 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
359 it 'データがアレになっている' do
\r
360 post :create, :panel => @attr, :format => :json
\r
361 json = JSON.parse response.body
\r
362 json["width"].should eq @panel.width
\r
366 context '作家権限がないとき' do
\r
370 context 'html形式' do
\r
371 it 'ステータスコード302 Foundを返す' do
\r
372 post :create, :panel => @attr
\r
373 response.status.should eq 302
\r
375 it 'サインインページへ遷移する' do
\r
376 post :create, :panel => @attr
\r
377 response.body.should redirect_to '/users/sign_in'
\r
380 context 'json形式' do
\r
381 it 'ステータスコード401 Unauthorizedを返す' do
\r
382 post :create, :panel => @attr, :format => :json
\r
383 response.status.should eq 401
\r
385 it '応答メッセージにUnauthorizedを返す' do
\r
386 post :create, :panel => @attr, :format => :json
\r
387 response.message.should match(/Unauthorized/)
\r
391 context '検証、保存に失敗した' do
\r
393 Panel.any_instance.stub(:store).and_return(false)
\r
395 it "未保存のコマを保持している" do
\r
396 post :create, :panel => @attr
\r
397 assigns(:panel).should be_a_new(Panel)
\r
399 context 'html形式' do
\r
400 it 'ステータスコード200 OKを返す' do
\r
401 post :create, :panel => @attr
\r
402 response.status.should eq 200
\r
405 post :create, :panel => @attr
\r
406 response.should render_template("new")
\r
409 context 'json形式' do
\r
410 it 'ステータスコード422 unprocessable_entity を返す' do
\r
411 post :create, :panel => @attr, :format => :json
\r
412 response.status.should eq 422
\r
414 it '応答メッセージUnprocessable Entityを返す' do
\r
415 post :create, :panel => @attr, :format => :json
\r
416 response.message.should match(/Unprocessable/)
\r
422 describe '編集フォーム表示に於いて' do
\r
424 @panel = Factory :panel, :author_id => @author.id
\r
426 Panel.stub(:show).and_return(@panel)
\r
428 context 'つつがなく終わるとき' do
\r
429 it 'ステータスコード200 OKを返す' do
\r
430 get :edit, :id => @panel.id
\r
431 response.should be_success
\r
433 it 'コマモデルに単体取得を問い合わせている' do
\r
434 Panel.should_receive(:show).exactly(1)
\r
435 get :edit, :id => @panel.id
\r
437 it '@panelにデータを用意している' do
\r
438 get :edit, :id => @panel.id
\r
439 assigns(:panel).should eq @panel
\r
441 context 'html形式' do
\r
442 it 'editテンプレートを描画する' do
\r
443 get :edit, :id => @panel.id
\r
444 response.should render_template("edit")
\r
448 it 'edit.jsテンプレートを描画する' do
\r
449 get :edit, :id => @panel.id, :format => :js
\r
450 response.should render_template("edit")
\r
454 context '作家権限がないとき' do
\r
458 context 'html形式' do
\r
459 it 'ステータスコード302 Foundを返す' do
\r
460 get :edit, :id => @panel.id
\r
461 response.status.should eq 302
\r
463 it 'サインインページへ遷移する' do
\r
464 get :edit, :id => @panel.id
\r
465 response.body.should redirect_to '/users/sign_in'
\r
469 it 'ステータスコード401 Unauthorizedを返す' do
\r
470 get :edit, :id => @panel.id, :format => :js
\r
471 response.status.should eq 401
\r
473 it '応答メッセージにUnauthorizedを返す' do
\r
474 get :edit, :id => @panel.id, :format => :js
\r
475 response.message.should match(/Unauthorized/)
\r
481 describe '更新に於いて' do
\r
483 @panel = Factory :panel, :author_id => @user.author.id
\r
484 @attr = Factory.attributes_for(:panel, :author_id => @author.id)
\r
487 context '事前チェックする' do
\r
490 Panel.stub(:count).and_return(10)
\r
492 it 'panelがパラメータにあれば、展開する' do
\r
493 put :update, :id => @panel.id, :panel => @attr
\r
494 assigns(:prm)['border'].to_i.should eq @panel.border
\r
496 it 'jsonがパラメータにあれば、展開する' do
\r
497 put :update, :id => @panel.id, :json => Factory.attributes_for(:panel, :border => 4).to_json
\r
498 assigns(:prm)['border'].to_i.should eq 4
\r
500 it 'panel・json両パラメータがあれば、panelを優先して展開する' do
\r
503 :panel => Factory.attributes_for(:panel),
\r
504 :json => Factory.attributes_for(:panel, :border => 4).to_json
\r
506 assigns(:prm)['border'].to_i.should eq @panel.border
\r
509 context 'つつがなく終わるとき' do
\r
510 it 'モデルに編集取得依頼する' do
\r
511 Panel.stub(:edit).with(any_args).and_return(@panel)
\r
512 Panel.should_receive(:edit).exactly(1)
\r
513 put :update, :id => @panel.id, :panel => @attr
\r
515 it 'コマモデルに上書き補充を依頼している' do
\r
516 Panel.any_instance.should_receive(:overwrite).exactly(1)
\r
517 put :update, :id => @panel.id, :panel => @attr
\r
520 Panel.any_instance.should_receive(:store).exactly(1)
\r
521 put :update, :id => @panel.id, :panel => @attr
\r
523 it "@panelに作成されたコマを保持していて、それがDBにある" do
\r
524 put :update, :id => @panel.id, :panel => @attr
\r
525 assigns(:panel).should be_a(Panel)
\r
526 assigns(:panel).should be_persisted
\r
528 context 'html形式' do
\r
529 it 'ステータスコード302 Foundを返す' do
\r
530 Panel.any_instance.stub(:store).and_return(true)
\r
531 put :update, :id => @panel.id, :panel => @attr
\r
532 response.status.should eq 302
\r
534 it '作成されたコマの表示ページへ遷移する' do
\r
535 # Panel.any_instance.stub(:store).and_return(true)
\r
536 put :update, :id => @panel.id, :panel => @attr
\r
537 response.should redirect_to(Panel.last)
\r
540 context 'json形式' do
\r
541 it 'ステータスコード200 OKを返す' do
\r
542 # Panel.any_instance.stub(:store).and_return(true)
\r
543 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
544 response.should be_success
\r
548 context '作家権限がないとき' do
\r
552 context 'html形式' do
\r
553 it 'ステータスコード302 Foundを返す' do
\r
554 put :update, :id => @panel.id, :panel => @attr
\r
555 response.status.should eq 302
\r
557 it 'サインインページへ遷移する' do
\r
558 put :update, :id => @panel.id, :panel => @attr
\r
559 response.body.should redirect_to '/users/sign_in'
\r
562 context 'json形式' do
\r
563 it 'ステータスコード401 Unauthorizedを返す' do
\r
564 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
565 response.status.should eq 401
\r
567 it '応答メッセージにUnauthorizedを返す' do
\r
568 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
569 response.message.should match(/Unauthorized/)
\r
573 context '検証、保存に失敗した' do
\r
575 Panel.any_instance.stub(:store).and_return(false)
\r
577 it "指定のコマを保持している" do
\r
578 put :update, :id => @panel.id, :panel => @attr
\r
579 assigns(:panel).should eq @panel
\r
581 context 'html形式' do
\r
582 it 'ステータスコード200 OKを返す' do
\r
583 put :update, :id => @panel.id, :panel => @attr
\r
584 response.status.should eq 200
\r
587 put :update, :id => @panel.id, :panel => @attr
\r
588 response.should render_template("edit")
\r
591 context 'json形式' do
\r
592 it 'ステータスコード422 unprocessable_entity を返す' do
\r
593 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
594 response.status.should eq 422
\r
596 it '応答メッセージUnprocessable Entityを返す' do
\r
597 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
598 response.message.should match(/Unprocessable/)
\r
604 describe '削除に於いて' do
\r
606 @panel = Factory :panel, :author_id => @user.author.id
\r
607 Panel.stub(:edit).and_return(@panel)
\r
610 context 'つつがなく終わるとき' do
\r
611 it 'コマモデルに編集取得を問い合わせている' do
\r
612 Panel.should_receive(:edit).exactly(1)
\r
613 delete :destroy, :id => @panel.id
\r
615 it '@panelにアレを取得している' do
\r
616 delete :destroy, :id => @panel.id
\r
617 assigns(:panel).id.should eq(@panel.id)
\r
619 it 'そのコマを一つのトランザクションで削除する' do
\r
621 delete :destroy, :id => @panel.id
\r
622 }.should change(Panel, :count)
\r
624 context 'html形式' do
\r
625 it 'ステータスコード302 Foundを返す' do
\r
626 delete :destroy, :id => @panel.id
\r
627 response.status.should eq 302
\r
629 it 'コマ一覧ページへ遷移する' do
\r
630 delete :destroy, :id => @panel.id
\r
631 response.should redirect_to(panels_url)
\r
634 context 'json形式' do
\r
635 it 'ステータスコード200 OKを返す' do
\r
636 delete :destroy, :id => @panel.id, :format => :json
\r
637 response.should be_success
\r
641 context '作家権限がないとき' do
\r
645 context 'html形式' do
\r
646 it 'ステータスコード302 Foundを返す' do
\r
647 delete :destroy, :id => @panel.id
\r
648 response.status.should eq 302
\r
650 it 'サインインページへ遷移する' do
\r
651 delete :destroy, :id => @panel.id
\r
652 response.body.should redirect_to '/users/sign_in'
\r
655 context 'json形式' do
\r
656 it 'ステータスコード401 Unauthorizedを返す' do
\r
657 delete :destroy, :id => @panel.id, :format => :json
\r
658 response.status.should eq 401
\r
660 it '応答メッセージにUnauthorizedを返す' do
\r
661 delete :destroy, :id => @panel.id, :format => :json
\r
662 response.message.should match(/Unauthorized/)
\r
667 context '対象コマがないとき' do
\r
669 context '他人のコマだったとき' do
\r