OSDN Git Service

add test
[pettanr/pettanr.git] / spec / controllers / panels_controller_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 require 'spec_helper'\r
3 \r
4 describe PanelsController do\r
5   before do\r
6     Factory :admin\r
7     @user = Factory :user_yas\r
8     @author = @user.author    #ユーザ作成時に連動して作成される\r
9   end\r
10   \r
11   describe '一覧表示に於いて' do\r
12     before do\r
13       @panel = Factory :panel, :author_id => @user.author.id\r
14       Panel.stub(:list).and_return([@panel, @panel, @panel])\r
15       sign_in @user\r
16     end\r
17     context '事前チェックする' do\r
18       it '与えられたpageがセットされている' do\r
19         get :index, :page => 5\r
20         assigns(:page).should eq 5\r
21       end\r
22       it '省略されると@pageに1値が入る' do\r
23         get :index\r
24         assigns(:page).should eq 1\r
25       end\r
26       it '与えられたpage_sizeがセットされている' do\r
27         get :index, :page_size => 15\r
28         assigns(:page_size).should eq 15\r
29       end\r
30       it '省略されると@page_sizeにデフォルト値が入る' do\r
31         get :index\r
32         assigns(:page_size).should eq Panel.default_page_size\r
33       end\r
34       it '最大を超えると@page_sizeにデフォルト最大値が入る' do\r
35         get :index, :page_size => 1500\r
36         assigns(:page_size).should eq Panel.max_page_size\r
37       end\r
38       it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do\r
39         get :index, :page_size => 0\r
40         assigns(:page_size).should eq Panel.default_page_size\r
41       end\r
42     end\r
43     context 'つつがなく終わるとき' do\r
44       it 'ステータスコード200 OKを返す' do\r
45         get :index\r
46         response.should be_success \r
47       end\r
48       it 'コマモデルに一覧を問い合わせている' do\r
49         Panel.should_receive(:list).exactly(1)\r
50         get :index\r
51       end\r
52       it '@panelsにリストを取得している' do\r
53         get :index\r
54         assigns(:panels).should have_at_least(3).items\r
55       end\r
56       context 'html形式' do\r
57         it 'indexテンプレートを描画する' do\r
58           get :index\r
59           response.should render_template("index")\r
60         end\r
61       end\r
62       context 'json形式' do\r
63         it 'jsonデータを返す' do\r
64           get :index, :format => :json\r
65           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
66         end\r
67         it 'データがリスト構造になっている' do\r
68           get :index, :format => :json\r
69           json = JSON.parse response.body\r
70           json.should have_at_least(3).items\r
71         end\r
72         it 'リストの先頭くらいはコマっぽいものであって欲しい' do\r
73           get :index, :format => :json\r
74           json = JSON.parse response.body\r
75           json.first.has_key?("comic_id").should be_true\r
76         end\r
77       end\r
78     end\r
79     context '作家権限がないとき' do\r
80       before do\r
81         sign_out @user\r
82       end\r
83       context 'html形式' do\r
84         it 'ステータスコード302 Foundを返す' do\r
85           get :index\r
86           response.status.should eq 302\r
87         end\r
88         it 'サインインページへ遷移する' do\r
89           get :index\r
90           response.should redirect_to '/users/sign_in'\r
91         end\r
92       end\r
93       context 'json形式' do\r
94         it 'ステータスコード401 Unauthorizedを返す' do\r
95           get :index, :format => :json\r
96           response.status.should eq 401\r
97         end\r
98         it '応答メッセージにUnauthorizedを返す' do\r
99           get :index, :format => :json\r
100           response.message.should match(/Unauthorized/)\r
101         end\r
102       end\r
103     end\r
104   end\r
105   \r
106   describe '単体表示に於いて' do\r
107     before do\r
108       @panel = Factory :panel, :author_id => @user.author.id\r
109       Panel.stub(:show).and_return(@panel)\r
110       sign_in @user\r
111     end\r
112     context 'つつがなく終わるとき' do\r
113       it 'ステータスコード200 OKを返す' do\r
114         get :show, :id => @panel.id\r
115         response.should be_success\r
116       end\r
117       it 'コマモデルに単体取得を問い合わせている' do\r
118         Panel.should_receive(:show).exactly(1)\r
119         get :show\r
120       end\r
121       it '@panelにアレを取得している' do\r
122         get :show, :id => @panel.id\r
123         assigns(:panel).id.should eq(@panel.id)\r
124       end\r
125       context 'html形式' do\r
126         it 'showテンプレートを描画する' do\r
127           get :show, :id => @panel.id\r
128           response.should render_template("show")\r
129         end\r
130       end\r
131       context 'json形式' do\r
132         it 'jsonデータを返す' do\r
133           get :show, :id => @panel.id, :format => :json\r
134           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
135         end\r
136         it 'データがアレになっている' do\r
137           get :show, :id => @panel.id, :format => :json\r
138           json = JSON.parse response.body\r
139           json["width"].should match(/438/)\r
140         end\r
141       end\r
142     end\r
143     context '作家権限がないとき' do\r
144       before do\r
145         sign_out @user\r
146       end\r
147       context 'html形式' do\r
148         it 'ステータスコード302 Foundを返す' do\r
149           get :show, :id => @panel.id\r
150           response.status.should eq 302\r
151         end\r
152         it 'サインインページへ遷移する' do\r
153           get :show, :id => @panel.id\r
154           response.body.should redirect_to '/users/sign_in'\r
155         end\r
156       end\r
157       context 'json形式' do\r
158         it 'ステータスコード401 Unauthorizedを返す' do\r
159           get :show, :id => @panel.id, :format => :json\r
160           response.status.should eq 401\r
161         end\r
162         it '応答メッセージにUnauthorizedを返す' do\r
163           get :show, :id => @panel.id, :format => :json\r
164           response.message.should match(/Unauthorized/)\r
165         end\r
166       end\r
167     end\r
168 =begin\r
169     context '対象コマがないとき' do\r
170       context 'html形式' do\r
171         it '例外404 not_foundを返す' do\r
172           lambda{\r
173             get :show, :id => 0\r
174           }.should raise_error(ActiveRecord::RecordNotFound)\r
175         end\r
176       end\r
177       context 'json形式' do\r
178         it '例外404 not_foundを返す' do\r
179           lambda{ \r
180             get :show, :id => 0, :format => :json\r
181           }.should raise_error(ActiveRecord::RecordNotFound)\r
182         end\r
183       end\r
184     end\r
185     context '非公開コマを見ようとしたとき' do\r
186       context 'html形式' do\r
187         it '例外403 forbiddenを返す' do\r
188           Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
189           hidden = Factory :hidden_panel, :author_id => @author.id\r
190           lambda{\r
191             get :show, :id => hidden\r
192           }.should raise_error(ActiveRecord::Forbidden)\r
193         end\r
194       end\r
195       context 'json形式' do\r
196         it '例外403 forbiddenを返す' do\r
197           Panel.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
198           hidden = Factory :hidden_panel, :author_id => @author.id\r
199           lambda{\r
200             get :show, :id => hidden, :format => :json\r
201           }.should raise_error(ActiveRecord::Forbidden)\r
202         end\r
203       end\r
204     end\r
205 =end\r
206   end\r
207   \r
208   describe 'コマ数取得に於いて' do\r
209     before do\r
210       Panel.should_receive(:visible_count).and_return(3)\r
211 #      sign_in @user\r
212     end\r
213     context 'つつがなく終わるとき' do\r
214       it 'ステータスコード200 OKを返す' do\r
215         get :count, :format => :json\r
216         response.should be_success \r
217       end\r
218       context 'json形式' do\r
219         it 'jsonデータを返す' do\r
220           get :count, :format => :json\r
221           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
222         end\r
223         it 'データがHash構造になっていてコマ数が1である' do\r
224           get :count, :format => :json\r
225           json = JSON.parse response.body\r
226           json["count"].should == 3\r
227         end\r
228       end\r
229     end\r
230   end\r
231   \r
232   describe '新規作成フォーム表示に於いて' do\r
233     before do\r
234       sign_in @user\r
235     end\r
236     context 'つつがなく終わるとき' do\r
237       it 'ステータスコード200 OKを返す' do\r
238         get :new\r
239         response.should be_success \r
240       end\r
241       it '@panelに新規データを用意している' do\r
242         get :new\r
243         assigns(:panel).should be_a_new(Panel)\r
244       end\r
245       it 'コマモデルにデフォルト値補充を依頼している' do\r
246         Panel.any_instance.should_receive(:supply_default).exactly(1)\r
247         get :new\r
248       end\r
249       context 'html形式' do\r
250         it 'newテンプレートを描画する' do\r
251           get :new\r
252           response.should render_template("new")\r
253         end\r
254       end\r
255       context 'js形式' do\r
256         it 'new.jsテンプレートを描画する' do\r
257           get :new, :format => :js\r
258           response.should render_template("new")\r
259         end\r
260       end\r
261     end\r
262     context '作家権限がないとき' do\r
263       before do\r
264         sign_out @user\r
265       end\r
266       context 'html形式' do\r
267         it 'ステータスコード302 Foundを返す' do\r
268           get :new\r
269           response.status.should eq 302\r
270         end\r
271         it 'サインインページへ遷移する' do\r
272           get :new\r
273           response.body.should redirect_to '/users/sign_in'\r
274         end\r
275       end\r
276       context 'js形式' do\r
277         it 'ステータスコード401 Unauthorizedを返す' do\r
278           get :new, :format => :js\r
279           response.status.should eq 401\r
280         end\r
281         it '応答メッセージにUnauthorizedを返す' do\r
282           get :new, :format => :js\r
283           response.message.should match(/Unauthorized/)\r
284         end\r
285       end\r
286     end\r
287   end\r
288   \r
289   describe '新規作成に於いて' do\r
290     before do\r
291       @panel = Factory :normal_panel, :author_id => @user.author.id\r
292       sign_in @user\r
293     end\r
294     context '事前チェックする' do\r
295       before do\r
296         controller\r
297         Panel.stub(:count).and_return(10)\r
298       end\r
299       it 'panelがパラメータにあれば、展開する' do\r
300         post :create, :panel => Factory.attributes_for(:panel, :panel_id => @panel.id)\r
301         assigns(:prm)['border'].to_i.should eq 1\r
302       end\r
303       it 'jsonがパラメータにあれば、展開する' do\r
304         post :create, :json => Factory.attributes_for(:panel, :panel_id => @panel.id, :border => 4).to_s\r
305         assigns(:prm)['border'].to_i.should eq 4\r
306       end\r
307       it 'panel・json両パラメータがあれば、panelを優先して展開する' do\r
308         post :create, {\r
309           :panel => Factory.attributes_for(:panel, :panel_id => @panel.id), \r
310           :json => Factory.attributes_for(:panel, :panel_id => @panel.id, :border => 4).to_s\r
311         }\r
312         assigns(:prm)['border'].to_i.should eq 1\r
313       end\r
314     end\r
315     context 'つつがなく終わるとき' do\r
316       it 'モデルに保存依頼する' do\r
317         Panel.any_instance.should_receive(:save).exactly(1)\r
318         post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
319       end\r
320       it "@panelに作成されたコマを保持していて、それがDBにある" do\r
321         post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
322         assigns(:panel).should be_a(Panel)\r
323         assigns(:panel).should be_persisted\r
324       end\r
325       context 'html形式' do\r
326         it 'ステータスコード302 Foundを返す' do\r
327           Panel.any_instance.stub(:save).and_return(true)\r
328           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
329           response.status.should eq 302\r
330         end\r
331         it '作成されたコマの表示ページへ遷移する' do\r
332 #          Panel.any_instance.stub(:save).and_return(true)\r
333           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
334           response.should redirect_to(Panel.last)\r
335         end\r
336       end\r
337       context 'json形式' do\r
338         it 'ステータスコード200 OKを返す' do\r
339 #          Panel.any_instance.stub(:save).and_return(true)\r
340           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
341           response.should be_success \r
342         end\r
343         it '作成されたコマをjsonデータで返す' do\r
344           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
345           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
346         end\r
347         it 'データがアレになっている' do\r
348           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
349           json = JSON.parse response.body\r
350           json["title"].should match(/normal/)\r
351         end\r
352       end\r
353     end\r
354     context '作家権限がないとき' do\r
355       before do\r
356         sign_out @user\r
357       end\r
358       context 'html形式' do\r
359         it 'ステータスコード302 Foundを返す' do\r
360           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
361           response.status.should eq 302\r
362         end\r
363         it 'サインインページへ遷移する' do\r
364           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
365           response.body.should redirect_to '/users/sign_in'\r
366         end\r
367       end\r
368       context 'json形式' do\r
369         it 'ステータスコード401 Unauthorizedを返す' do\r
370           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
371           response.status.should eq 401\r
372         end\r
373         it '応答メッセージにUnauthorizedを返す' do\r
374           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
375           response.message.should match(/Unauthorized/)\r
376         end\r
377       end\r
378     end\r
379     context '検証、保存に失敗した' do\r
380       before do\r
381         Panel.any_instance.stub(:save).and_return(false)\r
382       end\r
383       it "未保存のコマを保持している" do\r
384         post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
385         assigns(:panel).should be_a_new(Panel)\r
386       end\r
387       context 'html形式' do\r
388         it 'ステータスコード200 OKを返す' do\r
389           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
390           response.status.should eq 200\r
391         end\r
392         it '新規ページを描画する' do\r
393           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
394           response.should render_template("new")\r
395         end\r
396       end\r
397       context 'json形式' do\r
398         it 'ステータスコード422 unprocessable_entity を返す' do\r
399           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
400           response.status.should eq 422\r
401         end\r
402         it '応答メッセージUnprocessable Entityを返す' do\r
403           post :create, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
404           response.message.should match(/Unprocessable/)\r
405         end\r
406       end\r
407     end\r
408   end\r
409 \r
410   describe '編集フォーム表示に於いて' do\r
411     before do\r
412       @panel = Factory :panel, :author_id => @author.id\r
413       sign_in @user\r
414       Panel.stub(:show).and_return(@panel)\r
415     end\r
416     context 'つつがなく終わるとき' do\r
417       it 'ステータスコード200 OKを返す' do\r
418         get :edit, :id => @panel.id\r
419         response.should be_success \r
420       end\r
421       it 'コマモデルに単体取得を問い合わせている' do\r
422         Panel.should_receive(:show).exactly(1)\r
423         get :edit, :id => @panel.id\r
424       end\r
425       it '@panelにデータを用意している' do\r
426         get :edit, :id => @panel.id\r
427         assigns(:panel).should eq @panel\r
428       end\r
429       context 'html形式' do\r
430         it 'editテンプレートを描画する' do\r
431           get :edit, :id => @panel.id\r
432           response.should render_template("edit")\r
433         end\r
434       end\r
435       context 'js形式' do\r
436         it 'edit.jsテンプレートを描画する' do\r
437           get :edit, :id => @panel.id, :format => :js\r
438           response.should render_template("edit")\r
439         end\r
440       end\r
441     end\r
442     context '作家権限がないとき' do\r
443       before do\r
444         sign_out @user\r
445       end\r
446       context 'html形式' do\r
447         it 'ステータスコード302 Foundを返す' do\r
448           get :edit, :id => @panel.id\r
449           response.status.should eq 302\r
450         end\r
451         it 'サインインページへ遷移する' do\r
452           get :edit, :id => @panel.id\r
453           response.body.should redirect_to '/users/sign_in'\r
454         end\r
455       end\r
456       context 'js形式' do\r
457         it 'ステータスコード401 Unauthorizedを返す' do\r
458           get :edit, :id => @panel.id, :format => :js\r
459           response.status.should eq 401\r
460         end\r
461         it '応答メッセージにUnauthorizedを返す' do\r
462           get :edit, :id => @panel.id, :format => :js\r
463           response.message.should match(/Unauthorized/)\r
464         end\r
465       end\r
466     end\r
467   end\r
468 \r
469   describe '更新に於いて' do\r
470     before do\r
471       @panel = Factory :panel, :author => @author.id\r
472       sign_in @user\r
473     end\r
474     context '事前チェックしておく' do\r
475       it 'コマモデルに単体取得を問い合わせている' do\r
476         Panel.stub(:show).with(any_args()).and_return @panel\r
477         Panel.should_receive(:show).exactly(1)\r
478         put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
479       end\r
480       it 'モデルに更新を依頼する' do\r
481         Panel.any_instance.should_receive(:update_attributes).with(any_args)\r
482         put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
483       end\r
484       it '@panelにアレを取得している' do\r
485         put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
486         assigns(:panel).id.should eq(@panel.id)\r
487       end\r
488     end\r
489     context 'つつがなく終わるとき' do\r
490       it '更新される' do\r
491         put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
492         Panel.find(@panel.id).visible.should eq 0\r
493       end\r
494       context 'html形式' do\r
495         it 'ステータスコード302 Foundを返す' do\r
496           Panel.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
497           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
498           response.status.should eq 302\r
499         end\r
500         it '更新されたコマの表示ページへ遷移する' do\r
501           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
502           response.should redirect_to(@panel)\r
503         end\r
504       end\r
505       context 'json形式' do\r
506         it 'ステータスコード200 OKを返す' do\r
507           Panel.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
508           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
509           response.should be_success \r
510         end\r
511         it 'ページ本体は特に返さない' do\r
512           Panel.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
513           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
514           response.body.should match /./\r
515         end\r
516       end\r
517     end\r
518     context '作家権限がないとき' do\r
519       before do\r
520         sign_out @user\r
521       end\r
522       it 'ステータスコード302 Foundを返す' do\r
523         put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
524         response.status.should eq 302\r
525       end\r
526       context 'html形式' do\r
527         it 'サインインページへ遷移する' do\r
528           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
529           response.body.should redirect_to '/users/sign_in'\r
530         end\r
531       end\r
532       context 'json形式' do\r
533         it '応答メッセージにUnauthorizedを返す' do\r
534           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
535           response.message.should match(/Unauthorized/)\r
536         end\r
537       end\r
538     end\r
539     context '検証、保存に失敗したとき' do\r
540       before do\r
541         Panel.any_instance.stub(:update_attributes).and_return(false)\r
542       end\r
543       context 'html形式' do\r
544         it 'ステータスコード200 Okを返す' do\r
545           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
546           response.status.should eq 200\r
547         end\r
548         it '編集ページを描画する' do\r
549           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id)\r
550           response.should render_template("edit")\r
551         end\r
552       end\r
553       context 'json形式' do\r
554         it 'ステータスコード422 unprocessable_entity を返す' do\r
555           Panel.any_instance.stub(:update_attributes).and_return(false)\r
556           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
557           response.status.should eq 422\r
558         end\r
559         it '応答メッセージUnprocessable Entityを返す' do\r
560           put :update, :id => @panel.id, :panel => Factory.attributes_for(:panel, :author => @author.id), :format => :json\r
561           response.message.should match(/Unprocessable/)\r
562         end\r
563       end\r
564     end\r
565   end\r
566   \r
567 end\r