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
12 @comic = Factory :comic, :author_id => @author.id
\r
15 describe '一覧表示に於いて' do
\r
17 @panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
\r
18 Panel.stub(:list).and_return([@panel, @panel, @panel])
\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 Panel.default_page_size
\r
38 it '最大を超えると@page_sizeにデフォルト最大値が入る' do
\r
39 get :index, :page_size => 1500
\r
40 assigns(:page_size).should eq Panel.max_page_size
\r
42 it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
\r
43 get :index, :page_size => 0
\r
44 assigns(:page_size).should eq Panel.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 Panel.should_receive(:list).exactly(1)
\r
56 it '@panelsにリストを取得している' do
\r
58 assigns(:panels).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 'データがリスト構造になっている' do
\r
72 get :index, :format => :json
\r
73 json = JSON.parse response.body
\r
74 json.should have_at_least(3).items
\r
76 it 'リストの先頭くらいはコマっぽいものであって欲しい' do
\r
77 get :index, :format => :json
\r
78 json = JSON.parse response.body
\r
79 json.first.has_key?("comic_id").should be_true
\r
83 context '作家権限がないとき' do
\r
88 it 'ステータスコード302 Foundを返す' do
\r
90 response.status.should eq 302
\r
92 it 'サインインページへ遷移する' do
\r
94 response.should redirect_to '/users/sign_in'
\r
98 it 'ステータスコード401 Unauthorizedを返す' do
\r
99 get :index, :format => :json
\r
100 response.status.should eq 401
\r
102 it '応答メッセージにUnauthorizedを返す' do
\r
103 get :index, :format => :json
\r
104 response.message.should match(/Unauthorized/)
\r
110 describe '単体表示に於いて' do
\r
112 @panel = Factory :panel, :author_id => @user.author.id, :comic_id => @comic.id
\r
113 Panel.stub(:show).and_return(@panel)
\r
116 context 'つつがなく終わるとき' do
\r
117 it 'ステータスコード200 OKを返す' do
\r
118 get :show, :id => @panel.id
\r
119 response.should be_success
\r
121 it 'コマモデルに単体取得を問い合わせている' do
\r
122 Panel.should_receive(:show).exactly(1)
\r
125 it '@panelにアレを取得している' do
\r
126 get :show, :id => @panel.id
\r
127 assigns(:panel).id.should eq(@panel.id)
\r
129 context 'html形式' do
\r
130 it 'showテンプレートを描画する' do
\r
131 get :show, :id => @panel.id
\r
132 response.should render_template("show")
\r
135 context 'json形式' do
\r
137 get :show, :id => @panel.id, :format => :json
\r
138 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
140 it 'データがアレになっている' do
\r
141 get :show, :id => @panel.id, :format => :json
\r
142 json = JSON.parse response.body
\r
143 json["width"].should eq 100
\r
147 context '作家権限がないとき' do
\r
151 context 'html形式' do
\r
152 it 'ステータスコード302 Foundを返す' do
\r
153 get :show, :id => @panel.id
\r
154 response.status.should eq 302
\r
156 it 'サインインページへ遷移する' do
\r
157 get :show, :id => @panel.id
\r
158 response.body.should redirect_to '/users/sign_in'
\r
161 context 'json形式' do
\r
162 it 'ステータスコード401 Unauthorizedを返す' do
\r
163 get :show, :id => @panel.id, :format => :json
\r
164 response.status.should eq 401
\r
166 it '応答メッセージにUnauthorizedを返す' do
\r
167 get :show, :id => @panel.id, :format => :json
\r
168 response.message.should match(/Unauthorized/)
\r
173 context '対象コマがないとき' do
\r
174 context 'html形式' do
\r
175 it '例外404 not_foundを返す' do
\r
177 get :show, :id => 0
\r
178 }.should raise_error(ActiveRecord::RecordNotFound)
\r
181 context 'json形式' do
\r
182 it '例外404 not_foundを返す' do
\r
184 get :show, :id => 0, :format => :json
\r
185 }.should raise_error(ActiveRecord::RecordNotFound)
\r
189 context '非公開コマを見ようとしたとき' do
\r
190 context 'html形式' do
\r
191 it '例外403 forbiddenを返す' do
\r
192 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
193 hidden = Factory :hidden_panel, :author_id => @author.id
\r
195 get :show, :id => hidden
\r
196 }.should raise_error(ActiveRecord::Forbidden)
\r
199 context 'json形式' do
\r
200 it '例外403 forbiddenを返す' do
\r
201 Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)
\r
202 hidden = Factory :hidden_panel, :author_id => @author.id
\r
204 get :show, :id => hidden, :format => :json
\r
205 }.should raise_error(ActiveRecord::Forbidden)
\r
212 describe 'コマ数取得に於いて' do
\r
214 Panel.should_receive(:visible_count).and_return(3)
\r
217 context 'つつがなく終わるとき' do
\r
218 it 'ステータスコード200 OKを返す' do
\r
219 get :count, :format => :json
\r
220 response.should be_success
\r
222 context 'json形式' do
\r
224 get :count, :format => :json
\r
225 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
227 it 'データがHash構造になっていてコマ数が1である' do
\r
228 get :count, :format => :json
\r
229 json = JSON.parse response.body
\r
230 json["count"].should == 3
\r
236 describe '新規作成フォーム表示に於いて' do
\r
240 context 'つつがなく終わるとき' do
\r
241 it 'ステータスコード200 OKを返す' do
\r
243 response.should be_success
\r
245 it '@panelに新規データを用意している' do
\r
247 assigns(:panel).should be_a_new(Panel)
\r
249 it 'コマモデルにデフォルト値補充を依頼している' do
\r
250 Panel.any_instance.should_receive(:supply_default).exactly(1)
\r
253 context 'html形式' do
\r
254 it 'newテンプレートを描画する' do
\r
256 response.should render_template("new")
\r
260 it 'new.jsテンプレートを描画する' do
\r
261 get :new, :format => :js
\r
262 response.should render_template("new")
\r
266 context '作家権限がないとき' do
\r
270 context 'html形式' do
\r
271 it 'ステータスコード302 Foundを返す' do
\r
273 response.status.should eq 302
\r
275 it 'サインインページへ遷移する' do
\r
277 response.body.should redirect_to '/users/sign_in'
\r
281 it 'ステータスコード401 Unauthorizedを返す' do
\r
282 get :new, :format => :js
\r
283 response.status.should eq 401
\r
285 it '応答メッセージにUnauthorizedを返す' do
\r
286 get :new, :format => :js
\r
287 response.message.should match(/Unauthorized/)
\r
293 describe '新規作成に於いて' do
\r
295 @panel = Factory :panel, :author_id => @user.author.id, :comic_id => @comic.id
\r
298 context '事前チェックする' do
\r
301 Panel.stub(:count).and_return(10)
\r
303 it 'panelがパラメータにあれば、展開する' do
\r
304 post :create, :panel => Factory.attributes_for(:panel, :comic_id => @comic.id)
\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, :comic_id => @comic.id, :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, :comic_id => @comic.id),
\r
314 :json => Factory.attributes_for(:panel, :comic_id => @comic.id, :border => 4).to_json
\r
316 assigns(:prm)['border'].to_i.should eq @panel.border
\r
319 context 'つつがなく終わるとき' do
\r
321 Panel.any_instance.should_receive(:store).exactly(1)
\r
322 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
324 it "@panelに作成されたコマを保持していて、それがDBにある" do
\r
325 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
326 assigns(:panel).should be_a(Panel)
\r
327 assigns(:panel).should be_persisted
\r
329 context 'html形式' do
\r
330 it 'ステータスコード302 Foundを返す' do
\r
331 Panel.any_instance.stub(:store).and_return(true)
\r
332 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
333 response.status.should eq 302
\r
335 it '作成されたコマの表示ページへ遷移する' do
\r
336 # Panel.any_instance.stub(:store).and_return(true)
\r
337 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
338 response.should redirect_to(Panel.last)
\r
341 context 'json形式' do
\r
342 it 'ステータスコード200 OKを返す' do
\r
343 # Panel.any_instance.stub(:store).and_return(true)
\r
344 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
345 response.should be_success
\r
347 it '作成されたコマをjsonデータで返す' do
\r
348 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
349 lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
\r
351 it 'データがアレになっている' do
\r
352 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
353 json = JSON.parse response.body
\r
354 json["width"].should eq @panel.width
\r
358 context '作家権限がないとき' do
\r
362 context 'html形式' do
\r
363 it 'ステータスコード302 Foundを返す' do
\r
364 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
365 response.status.should eq 302
\r
367 it 'サインインページへ遷移する' do
\r
368 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
369 response.body.should redirect_to '/users/sign_in'
\r
372 context 'json形式' do
\r
373 it 'ステータスコード401 Unauthorizedを返す' do
\r
374 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
375 response.status.should eq 401
\r
377 it '応答メッセージにUnauthorizedを返す' do
\r
378 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
379 response.message.should match(/Unauthorized/)
\r
383 context '検証、保存に失敗した' do
\r
385 Panel.any_instance.stub(:save).and_return(false)
\r
387 it "未保存のコマを保持している" do
\r
388 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
389 assigns(:panel).should be_a_new(Panel)
\r
391 context 'html形式' do
\r
392 it 'ステータスコード200 OKを返す' do
\r
393 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
394 response.status.should eq 200
\r
397 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id)
\r
398 response.should render_template("new")
\r
401 context 'json形式' do
\r
402 it 'ステータスコード422 unprocessable_entity を返す' do
\r
403 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
404 response.status.should eq 422
\r
406 it '応答メッセージUnprocessable Entityを返す' do
\r
407 post :create, :panel => Factory.attributes_for(:panel, :author_id => @author.id), :format => :json
\r
408 response.message.should match(/Unprocessable/)
\r
414 describe '編集フォーム表示に於いて' do
\r
416 @panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
\r
418 Panel.stub(:show).and_return(@panel)
\r
420 context 'つつがなく終わるとき' do
\r
421 it 'ステータスコード200 OKを返す' do
\r
422 get :edit, :id => @panel.id
\r
423 response.should be_success
\r
425 it 'コマモデルに単体取得を問い合わせている' do
\r
426 Panel.should_receive(:show).exactly(1)
\r
427 get :edit, :id => @panel.id
\r
429 it '@panelにデータを用意している' do
\r
430 get :edit, :id => @panel.id
\r
431 assigns(:panel).should eq @panel
\r
433 context 'html形式' do
\r
434 it 'editテンプレートを描画する' do
\r
435 get :edit, :id => @panel.id
\r
436 response.should render_template("edit")
\r
440 it 'edit.jsテンプレートを描画する' do
\r
441 get :edit, :id => @panel.id, :format => :js
\r
442 response.should render_template("edit")
\r
446 context '作家権限がないとき' do
\r
450 context 'html形式' do
\r
451 it 'ステータスコード302 Foundを返す' do
\r
452 get :edit, :id => @panel.id
\r
453 response.status.should eq 302
\r
455 it 'サインインページへ遷移する' do
\r
456 get :edit, :id => @panel.id
\r
457 response.body.should redirect_to '/users/sign_in'
\r
461 it 'ステータスコード401 Unauthorizedを返す' do
\r
462 get :edit, :id => @panel.id, :format => :js
\r
463 response.status.should eq 401
\r
465 it '応答メッセージにUnauthorizedを返す' do
\r
466 get :edit, :id => @panel.id, :format => :js
\r
467 response.message.should match(/Unauthorized/)
\r