1 # -*- encoding: utf-8 -*-
\r
2 require 'spec_helper'
\r
4 describe PanelsController do
\r
6 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 = @user.author #ユーザ作成時に連動して作成される
\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
75 Panel.should_receive(:list_as_json_text).exactly(1)
76 get :index, :format => :json
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
152 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
153 get :show, :id => @panel.id, :format => :json
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
282 get :new, :format => :json
283 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
285 it 'コマモデルにコマのjson出力を問い合わせている' do
286 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
287 get :new, :format => :json
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
381 Panel.any_instance.should_receive(:panel_elements_as_json).exactly(1)
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
649 it 'そのコマを一つのトランザクションで削除する' do
\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(panels_url)
\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
697 context '対象コマがないとき' do
\r
699 context '他人のコマだったとき' do
\r