OSDN Git Service

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