1 # -*- encoding: utf-8 -*-
\r
2 require 'spec_helper'
\r
4 describe PanelsController do
\r
6 @admin = FactoryGirl.create :admin
\r
7 @sp = FactoryGirl.create :system_picture
\r
8 @lg = FactoryGirl.create :license_group
\r
9 @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
\r
10 @user = FactoryGirl.create :user_yas
\r
11 @author = FactoryGirl.create :author, :user_id => @user.id
\r
14 describe '一覧表示に於いて' do
\r
16 @panel = FactoryGirl.create :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 'コマモデルに一覧を問い合わせている' do
\r
48 Panel.should_receive(:list).exactly(1)
\r
51 it '@panelsにリストを取得している' do
\r
53 assigns(:panels).should have_at_least(3).items
\r
56 it 'ステータスコード200 OKを返す' do
\r
58 response.should be_success
\r
60 it 'indexテンプレートを描画する' do
\r
62 response.should render_template("index")
\r
66 it 'ステータスコード200 OKを返す' do
\r
67 get :index, :format => :json
\r
68 response.should be_success
\r
71 get :index, :format => :json
\r
72 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
74 it 'コマモデルにコマリストのjson出力を問い合わせている' do
\r
75 Panel.should_receive(:list_as_json_text).exactly(1)
\r
76 get :index, :format => :json
\r
78 it 'データがリスト構造になっている' do
\r
79 get :index, :format => :json
\r
80 json = JSON.parse response.body
\r
81 json.should have_at_least(3).items
\r
83 it 'リストの先頭くらいはコマっぽいものであって欲しい' do
\r
84 get :index, :format => :json
\r
85 json = JSON.parse response.body
\r
86 json.first.has_key?("border").should be_true
\r
90 context '作家権限がないとき' do
\r
95 it 'ステータスコード302 Foundを返す' do
\r
97 response.status.should eq 302
\r
99 it 'サインインページへ遷移する' do
\r
101 response.should redirect_to '/users/sign_in'
\r
104 context 'json形式' do
\r
105 it 'ステータスコード401 Unauthorizedを返す' do
\r
106 get :index, :format => :json
\r
107 response.status.should eq 401
\r
109 it '応答メッセージにUnauthorizedを返す' do
\r
110 get :index, :format => :json
\r
111 response.message.should match(/Unauthorized/)
\r
117 describe '単体表示に於いて' do
\r
119 @panel = FactoryGirl.create :panel, :author_id => @user.author.id
\r
120 Panel.stub(:show).with(@panel.id.to_s, @author).and_return(@panel)
\r
123 context 'つつがなく終わるとき' do
\r
124 it 'コマモデルに単体取得を問い合わせている' do
\r
125 Panel.should_receive(:show).exactly(1)
\r
128 it '@panelにアレを取得している' do
\r
129 get :show, :id => @panel.id
\r
130 assigns(:panel).id.should eq(@panel.id)
\r
132 context 'html形式' do
\r
133 it 'ステータスコード200 OKを返す' do
\r
134 get :show, :id => @panel.id
\r
135 response.should be_success
\r
137 it 'showテンプレートを描画する' do
\r
138 get :show, :id => @panel.id
\r
139 response.should render_template("show")
\r
142 context 'json形式' do
\r
143 it 'ステータスコード200 OKを返す' do
\r
144 get :show, :id => @panel.id, :format => :json
\r
145 response.should be_success
\r
148 get :show, :id => @panel.id, :format => :json
\r
149 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
151 it 'コマモデルにコマのjson出力を問い合わせている' do
\r
152 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
\r
153 get :show, :id => @panel.id, :format => :json
\r
155 it 'データがアレになっている' do
\r
156 get :show, :id => @panel.id, :format => :json
\r
157 json = JSON.parse response.body
\r
158 json["width"].should eq 100
\r
162 context '作家権限がないとき' do
\r
166 context 'html形式' do
\r
167 it 'ステータスコード302 Foundを返す' do
\r
168 get :show, :id => @panel.id
\r
169 response.status.should eq 302
\r
171 it 'サインインページへ遷移する' do
\r
172 get :show, :id => @panel.id
\r
173 response.body.should redirect_to '/users/sign_in'
\r
176 context 'json形式' do
\r
177 it 'ステータスコード401 Unauthorizedを返す' do
\r
178 get :show, :id => @panel.id, :format => :json
\r
179 response.status.should eq 401
\r
181 it '応答メッセージにUnauthorizedを返す' do
\r
182 get :show, :id => @panel.id, :format => :json
\r
183 response.message.should match(/Unauthorized/)
\r
188 context '対象コマがないとき' do
\r
189 context 'html形式' do
\r
190 it '例外404 not_foundを返す' do
\r
192 get :show, :id => 0
\r
193 }.should raise_error(ActiveRecord::RecordNotFound)
\r
196 context 'json形式' do
\r
197 it '例外404 not_foundを返す' do
\r
199 get :show, :id => 0, :format => :json
\r
200 }.should raise_error(ActiveRecord::RecordNotFound)
\r
204 context '非公開コマを見ようとしたとき' do
\r
205 context 'html形式' do
\r
206 it '例外403 forbiddenを返す' do
\r
207 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
208 hidden = FactoryGirl.create :hidden_panel, :author_id => @author.id
\r
210 get :show, :id => hidden
\r
211 }.should raise_error(ActiveRecord::Forbidden)
\r
214 context 'json形式' do
\r
215 it '例外403 forbiddenを返す' do
\r
216 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
217 hidden = FactoryGirl.create :hidden_panel, :author_id => @author.id
\r
219 get :show, :id => hidden, :format => :json
\r
220 }.should raise_error(ActiveRecord::Forbidden)
\r
227 describe 'コマ数取得に於いて' do
\r
229 Panel.should_receive(:visible_count).and_return(3)
\r
232 context 'つつがなく終わるとき' do
\r
233 it 'ステータスコード200 OKを返す' do
\r
234 get :count, :format => :json
\r
235 response.should be_success
\r
237 context 'json形式' do
\r
239 get :count, :format => :json
\r
240 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
242 it 'データがHash構造になっていてコマ数が1である' do
\r
243 get :count, :format => :json
\r
244 json = JSON.parse response.body
\r
245 json["count"].should == 3
\r
251 describe '新規作成フォーム表示に於いて' do
\r
255 context 'つつがなく終わるとき' do
\r
256 it '@panelに新規データを用意している' do
\r
258 assigns(:panel).should be_a_new(Panel)
\r
260 it 'コマモデルにデフォルト値補充を依頼している' do
\r
261 Panel.any_instance.should_receive(:supply_default).exactly(1)
\r
264 context 'html形式' do
\r
265 it 'ステータスコード200 OKを返す' do
\r
267 response.should be_success
\r
269 it 'newテンプレートを描画する' do
\r
271 response.should render_template("new")
\r
275 it 'new.jsテンプレートを描画する' do
\r
276 get :new, :format => :js
\r
277 response.should render_template("new")
\r
280 context 'json形式' do
\r
282 get :new, :format => :json
\r
283 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
285 it 'コマモデルにコマのjson出力を問い合わせている' do
\r
286 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
\r
287 get :new, :format => :json
\r
291 context '作家権限がないとき' do
\r
295 context 'html形式' do
\r
296 it 'ステータスコード302 Foundを返す' do
\r
298 response.status.should eq 302
\r
300 it 'サインインページへ遷移する' do
\r
302 response.body.should redirect_to '/users/sign_in'
\r
306 it 'ステータスコード401 Unauthorizedを返す' do
\r
307 get :new, :format => :js
\r
308 response.status.should eq 401
\r
310 it '応答メッセージにUnauthorizedを返す' do
\r
311 get :new, :format => :js
\r
312 response.message.should match(/Unauthorized/)
\r
318 describe '新規作成に於いて' do
\r
320 @panel = FactoryGirl.build :panel, :author_id => @author.id
\r
321 @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)
\r
324 context '事前チェックする' do
\r
326 Panel.stub(:count).and_return(10)
\r
328 it 'panelがパラメータにあれば、展開する' do
\r
329 post :create, :panel => @attr
\r
330 assigns(:prm)['border'].to_i.should eq @panel.border
\r
332 it 'jsonがパラメータにあれば、展開する' do
\r
333 post :create, :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json
\r
334 assigns(:prm)['border'].to_i.should eq 4
\r
336 it 'panel・json両パラメータがあれば、panelを優先して展開する' do
\r
338 :panel => FactoryGirl.attributes_for(:panel),
\r
339 :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json
\r
341 assigns(:prm)['border'].to_i.should eq @panel.border
\r
343 it 'コマモデルにデフォルト値補充を依頼している' do
\r
344 Panel.any_instance.should_receive(:supply_default).exactly(1)
\r
345 post :create, :panel => @attr
\r
348 Panel.any_instance.should_receive(:store).exactly(1)
\r
349 post :create, :panel => @attr
\r
352 context 'つつがなく終わるとき' do
\r
353 it "@panelに作成されたコマを保持していて、それがDBにある" do
\r
354 post :create, :panel => @attr
\r
355 assigns(:panel).should be_a(Panel)
\r
356 assigns(:panel).should be_persisted
\r
358 context 'html形式' do
\r
359 it 'ステータスコード302 Foundを返す' do
\r
360 Panel.any_instance.stub(:store).and_return(true)
\r
361 post :create, :panel => @attr
\r
362 response.status.should eq 302
\r
364 it '作成されたコマの表示ページへ遷移する' do
\r
365 # Panel.any_instance.stub(:store).and_return(true)
\r
366 post :create, :panel => @attr
\r
367 response.should redirect_to(Panel.last)
\r
370 context 'json形式' do
\r
371 it 'ステータスコード200 OKを返す' do
\r
372 # Panel.any_instance.stub(:store).and_return(true)
\r
373 post :create, :panel => @attr, :format => :json
\r
374 response.should be_success
\r
376 it '作成されたコマをjsonデータで返す' do
\r
377 post :create, :panel => @attr, :format => :json
\r
378 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
380 it 'コマモデルにコマのjson出力を問い合わせている' do
\r
381 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
\r
382 post :create, :panel => @attr, :format => :json
\r
384 it 'データがアレになっている' do
\r
385 post :create, :panel => @attr, :format => :json
\r
386 json = JSON.parse response.body
\r
387 json["width"].should eq @panel.width
\r
391 context '作家権限がないとき' do
\r
395 context 'html形式' do
\r
396 it 'ステータスコード302 Foundを返す' do
\r
397 post :create, :panel => @attr
\r
398 response.status.should eq 302
\r
400 it 'サインインページへ遷移する' do
\r
401 post :create, :panel => @attr
\r
402 response.body.should redirect_to '/users/sign_in'
\r
405 context 'json形式' do
\r
406 it 'ステータスコード401 Unauthorizedを返す' do
\r
407 post :create, :panel => @attr, :format => :json
\r
408 response.status.should eq 401
\r
410 it '応答メッセージにUnauthorizedを返す' do
\r
411 post :create, :panel => @attr, :format => :json
\r
412 response.message.should match(/Unauthorized/)
\r
416 context '検証、保存に失敗した' do
\r
418 Panel.any_instance.stub(:store).and_return(false)
\r
420 it "未保存のコマを保持している" do
\r
421 post :create, :panel => @attr
\r
422 assigns(:panel).should be_a_new(Panel)
\r
424 context 'html形式' do
\r
425 it 'ステータスコード200 OKを返す' do
\r
426 post :create, :panel => @attr
\r
427 response.status.should eq 200
\r
430 post :create, :panel => @attr
\r
431 response.should render_template("new")
\r
434 context 'json形式' do
\r
435 it 'ステータスコード422 unprocessable_entity を返す' do
\r
436 post :create, :panel => @attr, :format => :json
\r
437 response.status.should eq 422
\r
439 it '応答メッセージUnprocessable Entityを返す' do
\r
440 post :create, :panel => @attr, :format => :json
\r
441 response.message.should match(/Unprocessable/)
\r
447 describe '編集フォーム表示に於いて' do
\r
449 @panel = FactoryGirl.create :panel, :author_id => @author.id
\r
451 Panel.stub(:show).and_return(@panel)
\r
453 context 'つつがなく終わるとき' do
\r
454 it 'コマモデルに編集取得を問い合わせている' do
\r
455 Panel.should_receive(:edit).exactly(1)
\r
456 get :edit, :id => @panel.id
\r
458 it '@panelにデータを用意している' do
\r
459 get :edit, :id => @panel.id
\r
460 assigns(:panel).should eq @panel
\r
462 context 'html形式' do
\r
463 it 'ステータスコード200 OKを返す' do
\r
464 get :edit, :id => @panel.id
\r
465 response.should be_success
\r
467 it 'editテンプレートを描画する' do
\r
468 get :edit, :id => @panel.id
\r
469 response.should render_template("edit")
\r
473 it 'ステータスコード200 OKを返す' do
\r
474 get :edit, :id => @panel.id, :format => :js
\r
475 response.should be_success
\r
477 it 'edit.jsテンプレートを描画する' do
\r
478 get :edit, :id => @panel.id, :format => :js
\r
479 response.should render_template("edit")
\r
483 context '作家権限がないとき' do
\r
487 context 'html形式' do
\r
488 it 'ステータスコード302 Foundを返す' do
\r
489 get :edit, :id => @panel.id
\r
490 response.status.should eq 302
\r
492 it 'サインインページへ遷移する' do
\r
493 get :edit, :id => @panel.id
\r
494 response.body.should redirect_to '/users/sign_in'
\r
498 it 'ステータスコード401 Unauthorizedを返す' do
\r
499 get :edit, :id => @panel.id, :format => :js
\r
500 response.status.should eq 401
\r
502 it '応答メッセージにUnauthorizedを返す' do
\r
503 get :edit, :id => @panel.id, :format => :js
\r
504 response.message.should match(/Unauthorized/)
\r
510 describe '更新に於いて' do
\r
512 @panel = FactoryGirl.create :panel, :author_id => @user.author.id
\r
513 @attr = FactoryGirl.attributes_for(:panel, :author_id => @author.id)
\r
516 context '事前チェックする' do
\r
519 Panel.stub(:count).and_return(10)
\r
521 it 'panelがパラメータにあれば、展開する' do
\r
522 put :update, :id => @panel.id, :panel => @attr
\r
523 assigns(:prm)['border'].to_i.should eq @panel.border
\r
525 it 'jsonがパラメータにあれば、展開する' do
\r
526 put :update, :id => @panel.id, :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json
\r
527 assigns(:prm)['border'].to_i.should eq 4
\r
529 it 'panel・json両パラメータがあれば、panelを優先して展開する' do
\r
532 :panel => FactoryGirl.attributes_for(:panel),
\r
533 :json => FactoryGirl.attributes_for(:panel, :border => 4).to_json
\r
535 assigns(:prm)['border'].to_i.should eq @panel.border
\r
538 context 'つつがなく終わるとき' do
\r
539 it 'モデルに編集取得依頼する' do
\r
540 Panel.stub(:edit).with(any_args).and_return(@panel)
\r
541 Panel.should_receive(:edit).exactly(1)
\r
542 put :update, :id => @panel.id, :panel => @attr
\r
545 Panel.any_instance.should_receive(:store).exactly(1)
\r
546 put :update, :id => @panel.id, :panel => @attr
\r
548 it "@panelに作成されたコマを保持していて、それがDBにある" do
\r
549 put :update, :id => @panel.id, :panel => @attr
\r
550 assigns(:panel).should be_a(Panel)
\r
551 assigns(:panel).should be_persisted
\r
553 context 'html形式' do
\r
554 it 'ステータスコード302 Foundを返す' do
\r
555 Panel.any_instance.stub(:store).and_return(true)
\r
556 put :update, :id => @panel.id, :panel => @attr
\r
557 response.status.should eq 302
\r
559 it '作成されたコマの表示ページへ遷移する' do
\r
560 # Panel.any_instance.stub(:store).and_return(true)
\r
561 put :update, :id => @panel.id, :panel => @attr
\r
562 response.should redirect_to(Panel.last)
\r
565 context 'json形式' do
\r
566 it 'ステータスコード200 OKを返す' do
\r
567 # Panel.any_instance.stub(:store).and_return(true)
\r
568 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
569 response.should be_success
\r
571 it 'ページ本体は特に返さない' do
\r
572 Panel.any_instance.stub(:save).with(any_args()).and_return(true)
\r
573 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
574 response.body.should match /./
\r
578 context '作家権限がないとき' do
\r
582 context 'html形式' do
\r
583 it 'ステータスコード302 Foundを返す' do
\r
584 put :update, :id => @panel.id, :panel => @attr
\r
585 response.status.should eq 302
\r
587 it 'サインインページへ遷移する' do
\r
588 put :update, :id => @panel.id, :panel => @attr
\r
589 response.body.should redirect_to '/users/sign_in'
\r
592 context 'json形式' do
\r
593 it 'ステータスコード401 Unauthorizedを返す' do
\r
594 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
595 response.status.should eq 401
\r
597 it '応答メッセージにUnauthorizedを返す' do
\r
598 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
599 response.message.should match(/Unauthorized/)
\r
603 context '検証、保存に失敗した' do
\r
605 Panel.any_instance.stub(:store).and_return(false)
\r
607 it "指定のコマを保持している" do
\r
608 put :update, :id => @panel.id, :panel => @attr
\r
609 assigns(:panel).should eq @panel
\r
611 context 'html形式' do
\r
612 it 'ステータスコード200 OKを返す' do
\r
613 put :update, :id => @panel.id, :panel => @attr
\r
614 response.status.should eq 200
\r
617 put :update, :id => @panel.id, :panel => @attr
\r
618 response.should render_template("edit")
\r
621 context 'json形式' do
\r
622 it 'ステータスコード422 unprocessable_entity を返す' do
\r
623 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
624 response.status.should eq 422
\r
626 it '応答メッセージUnprocessable Entityを返す' do
\r
627 put :update, :id => @panel.id, :panel => @attr, :format => :json
\r
628 response.message.should match(/Unprocessable/)
\r
634 describe '削除に於いて' do
\r
636 @panel = FactoryGirl.create :panel, :author_id => @user.author.id
\r
637 Panel.stub(:edit).and_return(@panel)
\r
640 context 'つつがなく終わるとき' do
\r
641 it 'コマモデルに編集取得を問い合わせている' do
\r
642 Panel.should_receive(:edit).exactly(1)
\r
643 delete :destroy, :id => @panel.id
\r
645 it '@panelにアレを取得している' do
\r
646 delete :destroy, :id => @panel.id
\r
647 assigns(:panel).id.should eq(@panel.id)
\r
651 delete :destroy, :id => @panel.id
\r
652 }.should change(Panel, :count)
\r
654 context 'html形式' do
\r
655 it 'ステータスコード302 Foundを返す' do
\r
656 delete :destroy, :id => @panel.id
\r
657 response.status.should eq 302
\r
659 it 'マイコマ一覧ページへ遷移する' do
\r
660 delete :destroy, :id => @panel.id
\r
661 response.should redirect_to('/home/panel')
\r
664 context 'json形式' do
\r
665 it 'ステータスコード200 OKを返す' do
\r
666 delete :destroy, :id => @panel.id, :format => :json
\r
667 response.should be_success
\r
671 context '作家権限がないとき' do
\r
675 context 'html形式' do
\r
676 it 'ステータスコード302 Foundを返す' do
\r
677 delete :destroy, :id => @panel.id
\r
678 response.status.should eq 302
\r
680 it 'サインインページへ遷移する' do
\r
681 delete :destroy, :id => @panel.id
\r
682 response.body.should redirect_to '/users/sign_in'
\r
685 context 'json形式' do
\r
686 it 'ステータスコード401 Unauthorizedを返す' do
\r
687 delete :destroy, :id => @panel.id, :format => :json
\r
688 response.status.should eq 401
\r
690 it '応答メッセージにUnauthorizedを返す' do
\r
691 delete :destroy, :id => @panel.id, :format => :json
\r
692 response.message.should match(/Unauthorized/)
\r
696 context '削除に失敗したとき' do
\r
698 Panel.any_instance.stub(:destroy_with_elements).and_return(false)
\r
700 context 'html形式' do
\r
701 it 'ステータスコード302 Foundを返す' do
\r
702 delete :destroy, :id => @panel.id
\r
703 response.status.should eq 302
\r
705 it 'そのコマの詳細ページへ遷移する' do
\r
706 delete :destroy, :id => @panel.id
\r
707 response.should redirect_to(panel_path(@panel))
\r
710 context 'json形式' do
\r
711 it 'ステータスコード422 unprocessable_entity を返す' do
\r
712 delete :destroy, :id => @panel.id, :format => :json
\r
713 response.status.should eq 422
\r
715 it '応答メッセージUnprocessable Entityを返す' do
\r
716 delete :destroy, :id => @panel.id, :format => :json
\r
717 response.message.should match(/Unprocessable/)
\r
722 context '対象コマがないとき' do
\r
724 context '他人のコマだったとき' do
\r