OSDN Git Service

Merge branch 'v05' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v05client
[pettanr/pettanr.git] / spec / controllers / comics_controller_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 require 'spec_helper'\r
3 #コミック\r
4 describe ComicsController do\r
5   before 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
12   end\r
13   \r
14 if MagicNumber['run_mode'] == 1\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\r
72           Comic.should_receive(:list_json_opt).exactly(1)\r
73           get :index, :format => :json\r
74         end\r
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     context 'ユーザ権限はないが管理者権限があるとき' do\r
114       before do\r
115         sign_out @user\r
116         sign_in @admin\r
117       end\r
118       it 'ステータスコード200 OKを返す' do\r
119         get :index\r
120         response.should be_success \r
121       end\r
122     end\r
123     context 'ユーザだが作家登録していないとき' do\r
124       before do\r
125         @author.destroy\r
126       end\r
127       context 'html形式' do\r
128         it 'ステータスコード200 OKを返す' do\r
129           get :index\r
130           response.should be_success \r
131         end\r
132       end\r
133     end\r
134   end\r
135   \r
136   describe '単体表示に於いて' do\r
137     before do\r
138       @comic = FactoryGirl.create :comic, :author_id => @user.author.id, :title => 'normal'\r
139       Comic.stub(:show).and_return(@comic)\r
140       sign_in @user\r
141     end\r
142     context 'つつがなく終わるとき' do\r
143       it 'ステータスコード200 OKを返す' do\r
144         get :show, :id => @comic.id\r
145         response.should be_success\r
146       end\r
147       it 'コミックモデルに単体取得を問い合わせている' do\r
148         Comic.should_receive(:show).exactly(1)\r
149         get :show\r
150       end\r
151       it '@comicにアレを取得している' do\r
152         get :show, :id => @comic.id\r
153         assigns(:comic).id.should eq(@comic.id)\r
154       end\r
155       context 'html形式' do\r
156         it 'showテンプレートを描画する' do\r
157           get :show, :id => @comic.id\r
158           response.should render_template("show")\r
159         end\r
160       end\r
161       context 'json形式' do\r
162         it 'jsonデータを返す' do\r
163           get :show, :id => @comic.id, :format => :json\r
164           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
165         end\r
166         it 'コミックモデルにjson単体出力オプションを問い合わせている' do\r
167           Comic.should_receive(:show_json_opt).exactly(1)\r
168           get :show, :id => @comic.id, :format => :json\r
169         end\r
170         it 'データがアレになっている' do\r
171           get :show, :id => @comic.id, :format => :json\r
172           json = JSON.parse response.body\r
173           json["title"].should match(/normal/)\r
174           json["visible"].should_not be_nil\r
175         end\r
176       end\r
177     end\r
178     context 'ユーザ権限がないとき' do\r
179       before do\r
180         sign_out @user\r
181       end\r
182       context 'html形式' do\r
183         it 'ステータスコード302 Foundを返す' do\r
184           get :show, :id => @comic.id\r
185           response.status.should eq 302\r
186         end\r
187         it 'サインインページへ遷移する' do\r
188           get :show, :id => @comic.id\r
189           response.body.should redirect_to '/users/sign_in'\r
190         end\r
191       end\r
192       context 'json形式' do\r
193         it 'ステータスコード401 Unauthorizedを返す' do\r
194           get :show, :id => @comic.id, :format => :json\r
195           response.status.should eq 401\r
196         end\r
197         it '応答メッセージにUnauthorizedを返す' do\r
198           get :show, :id => @comic.id, :format => :json\r
199           response.message.should match(/Unauthorized/)\r
200         end\r
201       end\r
202     end\r
203     context 'ユーザ権限はないが管理者権限があるとき' do\r
204       before do\r
205         sign_out @user\r
206         sign_in @admin\r
207       end\r
208       it 'ステータスコード200 OKを返す' do\r
209         get :show, :id => @comic.id\r
210         response.should be_success \r
211       end\r
212     end\r
213     context 'ユーザだが作家登録していないとき' do\r
214       before do\r
215         @author.destroy\r
216       end\r
217       context 'html形式' do\r
218         it 'ステータスコード200 OKを返す' do\r
219           get :show, :id => @comic.id\r
220           response.should be_success\r
221         end\r
222       end\r
223     end\r
224 =begin\r
225     context '対象コミックがないとき' do\r
226       context 'html形式' do\r
227         it '例外404 not_foundを返す' do\r
228           lambda{\r
229             get :show, :id => 0\r
230           }.should raise_error(ActiveRecord::RecordNotFound)\r
231         end\r
232       end\r
233       context 'json形式' do\r
234         it '例外404 not_foundを返す' do\r
235           lambda{ \r
236             get :show, :id => 0, :format => :json\r
237           }.should raise_error(ActiveRecord::RecordNotFound)\r
238         end\r
239       end\r
240     end\r
241     context '非公開コミックを見ようとしたとき' do\r
242       context 'html形式' do\r
243         it '例外403 forbiddenを返す' do\r
244           Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
245           hidden = FactoryGirl.create :hidden_comic, :author_id => @author.id\r
246           lambda{\r
247             get :show, :id => hidden\r
248           }.should raise_error(ActiveRecord::Forbidden)\r
249         end\r
250       end\r
251       context 'json形式' do\r
252         it '例外403 forbiddenを返す' do\r
253           Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
254           hidden = FactoryGirl.create :hidden_comic, :author_id => @author.id\r
255           lambda{\r
256             get :show, :id => hidden, :format => :json\r
257           }.should raise_error(ActiveRecord::Forbidden)\r
258         end\r
259       end\r
260     end\r
261 =end\r
262   end\r
263   describe 'コミック数取得に於いて' do\r
264     before do\r
265       Comic.should_receive(:visible_count).and_return(3)\r
266 #      sign_in @user\r
267     end\r
268     context 'つつがなく終わるとき' do\r
269       it 'ステータスコード200 OKを返す' do\r
270         get :count, :format => :json\r
271         response.should be_success \r
272       end\r
273       context 'json形式' do\r
274         it 'jsonデータを返す' do\r
275           get :count, :format => :json\r
276           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
277         end\r
278         it 'データがHash構造になっていてコミック数が1である' do\r
279           get :count, :format => :json\r
280           json = JSON.parse response.body\r
281           json["count"].should == 3\r
282         end\r
283       end\r
284     end\r
285   end\r
286 \r
287   describe '新規作成フォーム表示に於いて' do\r
288     before do\r
289       sign_in @user\r
290     end\r
291     context 'つつがなく終わるとき' do\r
292       it 'ステータスコード200 OKを返す' do\r
293         get :new\r
294         response.should be_success \r
295       end\r
296       it '@comicに新規データを用意している' do\r
297         get :new\r
298         assigns(:comic).should be_a_new(Comic)\r
299       end\r
300       it 'コミックモデルにデフォルト値補充を依頼している' do\r
301         Comic.any_instance.should_receive(:supply_default).exactly(1)\r
302         get :new\r
303       end\r
304       context 'html形式' do\r
305         it 'newテンプレートを描画する' do\r
306           get :new\r
307           response.should render_template("new")\r
308         end\r
309       end\r
310       context 'js形式' do\r
311         it 'new.jsテンプレートを描画する' do\r
312           get :new, :format => :js\r
313           response.should render_template("new")\r
314         end\r
315       end\r
316       context 'json形式' do\r
317         it 'jsonデータを返す' do\r
318           get :new, :format => :json\r
319           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
320         end\r
321         it 'コミックモデルにjson単体出力オプションを問い合わせている' do\r
322           Comic.should_receive(:show_json_opt).exactly(1)\r
323           get :new, :format => :json\r
324         end\r
325       end\r
326     end\r
327     context 'ユーザ権限がないとき' do\r
328       before do\r
329         sign_out @user\r
330       end\r
331       context 'html形式' do\r
332         it 'ステータスコード302 Foundを返す' do\r
333           get :new\r
334           response.status.should eq 302\r
335         end\r
336         it 'サインインページへ遷移する' do\r
337           get :new\r
338           response.body.should redirect_to '/users/sign_in'\r
339         end\r
340       end\r
341       context 'js形式' do\r
342         it 'ステータスコード401 Unauthorizedを返す' do\r
343           get :new, :format => :js\r
344           response.status.should eq 401\r
345         end\r
346         it '応答メッセージにUnauthorizedを返す' do\r
347           get :new, :format => :js\r
348           response.message.should match(/Unauthorized/)\r
349         end\r
350       end\r
351       context 'json形式' do\r
352         it 'ステータスコード401 Unauthorizedを返す' do\r
353           get :new, :format => :json\r
354           response.status.should eq 401\r
355         end\r
356         it '応答メッセージにUnauthorizedを返す' do\r
357           get :new, :format => :json\r
358           response.message.should match(/Unauthorized/)\r
359         end\r
360       end\r
361     end\r
362     context 'ユーザ権限はないが管理者権限があるとき' do\r
363       before do\r
364         sign_out @user\r
365         sign_in @admin\r
366       end\r
367       context 'html形式' do\r
368         it 'ステータスコード302 Foundを返す' do\r
369           get :new\r
370           response.status.should eq 302\r
371         end\r
372         it 'サインインページへ遷移する' do\r
373           get :new\r
374           response.body.should redirect_to '/users/sign_in'\r
375         end\r
376       end\r
377     end\r
378     context 'ユーザだが作家登録していないとき' do\r
379       before do\r
380         @author.destroy\r
381       end\r
382       context 'html形式' do\r
383         it 'ステータスコード302 Foundを返す' do\r
384           get :new, @attr\r
385           response.status.should eq 302\r
386         end\r
387         it '作家登録ページへ遷移する' do\r
388           get :new, @attr\r
389           response.body.should redirect_to new_author_path\r
390         end\r
391       end\r
392     end\r
393   end\r
394 \r
395   describe '新規作成に於いて' do\r
396     before do\r
397       sign_in @user\r
398       @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'normal')\r
399     end\r
400     context '事前チェックしておく' do\r
401       it 'コミックモデルにデフォルト値補充を依頼している' do\r
402         Comic.any_instance.should_receive(:supply_default).exactly(1)\r
403         post :create, :comic => @attr\r
404       end\r
405       it 'コミックモデルにカラム値復元を依頼している' do\r
406         Comic.any_instance.should_receive(:attributes=).exactly(1)\r
407         post :create, :comic => @attr\r
408       end\r
409       it 'コミックモデルに上書き補充を依頼している' do\r
410         Comic.any_instance.should_receive(:overwrite).exactly(1)\r
411         post :create, :comic => @attr\r
412       end\r
413       it 'モデルに保存依頼する' do\r
414         Comic.any_instance.should_receive(:save).exactly(1)\r
415         post :create, :comic => @attr\r
416       end\r
417     end\r
418     context 'つつがなく終わるとき' do\r
419       it "@comicに作成されたコミックを保持していて、それがDBにある" do\r
420         post :create, :comic => @attr\r
421         assigns(:comic).should be_a(Comic)\r
422         assigns(:comic).should be_persisted\r
423       end\r
424       context 'html形式' do\r
425         it 'ステータスコード302 Foundを返す' do\r
426           Comic.any_instance.stub(:save).and_return(true)\r
427           post :create, :comic => @attr\r
428           response.status.should eq 302\r
429         end\r
430         it '作成されたコミックの表示ページへ遷移する' do\r
431 #          Comic.any_instance.stub(:save).and_return(true)\r
432           post :create, :comic => @attr\r
433           response.should redirect_to(Comic.last)\r
434         end\r
435       end\r
436       context 'json形式' do\r
437         it 'ステータスコード200 OKを返す' do\r
438 #          Comic.any_instance.stub(:save).and_return(true)\r
439           post :create, :comic => @attr, :format => :json\r
440           response.should be_success \r
441         end\r
442         it '作成されたコミックをjsonデータで返す' do\r
443           post :create, :comic => @attr, :format => :json\r
444           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
445         end\r
446         it 'データがアレになっている' do\r
447           post :create, :comic => @attr, :format => :json\r
448           json = JSON.parse response.body\r
449           json["title"].should match(/normal/)\r
450           json["visible"].should_not be_nil\r
451         end\r
452       end\r
453     end\r
454     context 'ユーザ権限がないとき' do\r
455       before do\r
456         sign_out @user\r
457       end\r
458       context 'html形式' do\r
459         it 'ステータスコード302 Foundを返す' do\r
460           post :create, :comic => @attr\r
461           response.status.should eq 302\r
462         end\r
463         it 'サインインページへ遷移する' do\r
464           post :create, :comic => @attr\r
465           response.body.should redirect_to '/users/sign_in'\r
466         end\r
467       end\r
468       context 'json形式' do\r
469         it 'ステータスコード401 Unauthorizedを返す' do\r
470           post :create, :comic => @attr, :format => :json\r
471           response.status.should eq 401\r
472         end\r
473         it '応答メッセージにUnauthorizedを返す' do\r
474           post :create, :comic => @attr, :format => :json\r
475           response.message.should match(/Unauthorized/)\r
476         end\r
477       end\r
478     end\r
479     context 'ユーザ権限はないが管理者権限があるとき' do\r
480       before do\r
481         sign_out @user\r
482         sign_in @admin\r
483       end\r
484       context 'html形式' do\r
485         it 'ステータスコード302 Foundを返す' do\r
486           post :create, :comic => @attr\r
487           response.status.should eq 302\r
488         end\r
489         it 'サインインページへ遷移する' do\r
490           post :create, :comic => @attr\r
491           response.body.should redirect_to '/users/sign_in'\r
492         end\r
493       end\r
494     end\r
495     context 'ユーザだが作家登録していないとき' do\r
496       before do\r
497         @author.destroy\r
498       end\r
499       context 'html形式' do\r
500         it 'ステータスコード302 Foundを返す' do\r
501           post :create, :comic => @attr\r
502           response.status.should eq 302\r
503         end\r
504         it '作家登録ページへ遷移する' do\r
505           post :create, :comic => @attr\r
506           response.body.should redirect_to new_author_path\r
507         end\r
508       end\r
509     end\r
510     context '検証、保存に失敗した' do\r
511       before do\r
512         Comic.any_instance.stub(:save).and_return(false)\r
513       end\r
514       it "未保存のコミックを保持している" do\r
515         post :create, :comic => @attr\r
516         assigns(:comic).should be_a_new(Comic)\r
517       end\r
518       context 'html形式' do\r
519         it 'ステータスコード200 OKを返す' do\r
520           post :create, :comic => @attr\r
521           response.status.should eq 200\r
522         end\r
523         it '新規ページを描画する' do\r
524           post :create, :comic => @attr\r
525           response.should render_template("new")\r
526         end\r
527       end\r
528       context 'json形式' do\r
529         it 'ステータスコード422 unprocessable_entity を返す' do\r
530           post :create, :comic => @attr, :format => :json\r
531           response.status.should eq 422\r
532         end\r
533         it '応答メッセージUnprocessable Entityを返す' do\r
534           post :create, :comic => @attr, :format => :json\r
535           response.message.should match(/Unprocessable/)\r
536         end\r
537       end\r
538     end\r
539   end\r
540 \r
541   describe '編集フォーム表示に於いて' do\r
542     before do\r
543       @comic = FactoryGirl.create :comic, :author_id => @user.author.id\r
544       sign_in @user\r
545       Comic.stub(:edit).and_return(@comic)\r
546     end\r
547     context 'つつがなく終わるとき' do\r
548       it 'ステータスコード200 OKを返す' do\r
549         get :edit, :id => @comic.id\r
550         response.should be_success \r
551       end\r
552       it 'コミックモデルに編集取得を問い合わせている' do\r
553         Comic.should_receive(:edit).exactly(1)\r
554         get :edit, :id => @comic.id\r
555       end\r
556       it '@comicにデータを用意している' do\r
557         get :edit, :id => @comic.id\r
558         assigns(:comic).should eq @comic\r
559       end\r
560       context 'html形式' do\r
561         it 'editテンプレートを描画する' do\r
562           get :edit, :id => @comic.id\r
563           response.should render_template("edit")\r
564         end\r
565       end\r
566       context 'js形式' do\r
567         it 'edit.jsテンプレートを描画する' do\r
568           get :edit, :id => @comic.id, :format => :js\r
569           response.should render_template("edit")\r
570         end\r
571       end\r
572     end\r
573     context 'ユーザ権限がないとき' do\r
574       before do\r
575         sign_out @user\r
576       end\r
577       context 'html形式' do\r
578         it 'ステータスコード302 Foundを返す' do\r
579           get :edit, :id => @comic.id\r
580           response.status.should eq 302\r
581         end\r
582         it 'サインインページへ遷移する' do\r
583           get :edit, :id => @comic.id\r
584           response.body.should redirect_to '/users/sign_in'\r
585         end\r
586       end\r
587       context 'js形式' do\r
588         it 'ステータスコード401 Unauthorizedを返す' do\r
589           get :edit, :id => @comic.id, :format => :js\r
590           response.status.should eq 401\r
591         end\r
592         it '応答メッセージにUnauthorizedを返す' do\r
593           get :edit, :id => @comic.id, :format => :js\r
594           response.message.should match(/Unauthorized/)\r
595         end\r
596       end\r
597     end\r
598     context 'ユーザ権限はないが管理者権限があるとき' do\r
599       before do\r
600         sign_out @user\r
601         sign_in @admin\r
602       end\r
603       context 'html形式' do\r
604         it 'ステータスコード302 Foundを返す' do\r
605           get :edit, :id => @comic.id\r
606           response.status.should eq 302\r
607         end\r
608         it 'サインインページへ遷移する' do\r
609           get :edit, :id => @comic.id\r
610           response.body.should redirect_to '/users/sign_in'\r
611         end\r
612       end\r
613     end\r
614     context 'ユーザだが作家登録していないとき' do\r
615       before do\r
616         @author.destroy\r
617       end\r
618       context 'html形式' do\r
619         it 'ステータスコード302 Foundを返す' do\r
620           get :edit, :id => @comic.id\r
621           response.status.should eq 302\r
622         end\r
623         it '作家登録ページへ遷移する' do\r
624           get :edit, :id => @comic.id\r
625           response.body.should redirect_to new_author_path\r
626         end\r
627       end\r
628     end\r
629   end\r
630 \r
631   describe '更新に於いて' do\r
632     before do\r
633       @comic = FactoryGirl.create :comic, :author => @author\r
634       @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'updated title', :visible => 0)\r
635       sign_in @user\r
636     end\r
637     context '事前チェックしておく' do\r
638       it 'コミックモデルに編集取得を問い合わせている' do\r
639         Comic.stub(:edit).with(any_args()).and_return @comic\r
640         Comic.should_receive(:edit).exactly(1)\r
641         put :update, :id => @comic.id, :comic => @attr\r
642       end\r
643       it 'コミックモデルにカラム値復元を依頼している' do\r
644         Comic.any_instance.should_receive(:attributes=).exactly(1)\r
645         put :update, :id => @comic.id, :comic => @attr\r
646       end\r
647       it 'コミックモデルに上書き補充を依頼している' do\r
648         Comic.any_instance.should_receive(:overwrite).exactly(1)\r
649         put :update, :id => @comic.id, :comic => @attr\r
650       end\r
651       it 'モデルに更新を依頼する' do\r
652         Comic.any_instance.stub(:save).with(any_args).and_return true\r
653         Comic.any_instance.should_receive(:save).exactly(1)\r
654         put :update, :id => @comic.id, :comic => @attr\r
655       end\r
656       it '@comicにアレを取得している' do\r
657         put :update, :id => @comic.id, :comic => @attr\r
658         assigns(:comic).id.should eq(@comic.id)\r
659       end\r
660     end\r
661     context 'つつがなく終わるとき' do\r
662       it '更新される' do\r
663         put :update, :id => @comic.id, :comic => @attr\r
664         Comic.find(@comic.id).visible.should eq 0\r
665       end\r
666       context 'html形式' do\r
667         it 'ステータスコード302 Foundを返す' do\r
668           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
669           put :update, :id => @comic.id, :comic => @attr\r
670           response.status.should eq 302\r
671         end\r
672         it '更新されたコミックの表示ページへ遷移する' do\r
673           put :update, :id => @comic.id, :comic => @attr\r
674           response.should redirect_to(@comic)\r
675         end\r
676       end\r
677       context 'json形式' do\r
678         it 'ステータスコード200 OKを返す' do\r
679           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
680           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
681           response.should be_success \r
682         end\r
683         it 'ページ本体は特に返さない' do\r
684           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
685           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
686           response.body.should match /./\r
687         end\r
688       end\r
689     end\r
690     context 'ユーザ権限がないとき' do\r
691       before do\r
692         sign_out @user\r
693       end\r
694       context 'html形式' do\r
695         it 'ステータスコード302 Foundを返す' do\r
696           put :update, :id => @comic.id, :comic => @attr\r
697           response.status.should eq 302\r
698         end\r
699         it 'サインインページへ遷移する' do\r
700           put :update, :id => @comic.id, :comic => @attr\r
701           response.body.should redirect_to '/users/sign_in'\r
702         end\r
703       end\r
704       context 'json形式' do\r
705         it '応答メッセージにUnauthorizedを返す' do\r
706           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
707           response.message.should match(/Unauthorized/)\r
708         end\r
709       end\r
710     end\r
711     context 'ユーザ権限はないが管理者権限があるとき' do\r
712       before do\r
713         sign_out @user\r
714         sign_in @admin\r
715       end\r
716       context 'html形式' do\r
717         it 'ステータスコード302 Foundを返す' do\r
718           put :update, :id => @comic.id, :comic => @attr\r
719           response.status.should eq 302\r
720         end\r
721         it 'サインインページへ遷移する' do\r
722           put :update, :id => @comic.id, :comic => @attr\r
723           response.body.should redirect_to '/users/sign_in'\r
724         end\r
725       end\r
726     end\r
727     context 'ユーザだが作家登録していないとき' do\r
728       before do\r
729         @author.destroy\r
730       end\r
731       context 'html形式' do\r
732         it 'ステータスコード302 Foundを返す' do\r
733           put :update, :id => @comic.id, :comic => @attr\r
734           response.status.should eq 302\r
735         end\r
736         it '作家登録ページへ遷移する' do\r
737           put :update, :id => @comic.id, :comic => @attr\r
738           response.body.should redirect_to new_author_path\r
739         end\r
740       end\r
741     end\r
742     context '検証、保存に失敗したとき' do\r
743       before do\r
744         Comic.any_instance.stub(:save).and_return(false)\r
745       end\r
746       context 'html形式' do\r
747         it 'ステータスコード200 Okを返す' do\r
748           put :update, :id => @comic.id, :comic => @attr\r
749           response.status.should eq 200\r
750         end\r
751         it '編集ページを描画する' do\r
752           put :update, :id => @comic.id, :comic => @attr\r
753           response.should render_template("edit")\r
754         end\r
755       end\r
756       context 'json形式' do\r
757         it 'ステータスコード422 unprocessable_entity を返す' do\r
758           Comic.any_instance.stub(:save).and_return(false)\r
759           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
760           response.status.should eq 422\r
761         end\r
762         it '応答メッセージUnprocessable Entityを返す' do\r
763           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
764           response.message.should match(/Unprocessable/)\r
765         end\r
766       end\r
767     end\r
768   end\r
769 \r
770   describe '削除に於いて' do\r
771     before do\r
772       @comic = FactoryGirl.create :comic, :author => @author\r
773       sign_in @user\r
774     end\r
775     context '事前チェックしておく' do\r
776       before do\r
777         Comic.stub(:edit).with(any_args()).and_return @comic\r
778         Comic.any_instance.stub(:destroy_with_story).with(any_args()).and_return(true)\r
779       end\r
780       it 'コミックモデルに編集取得を問い合わせている' do\r
781         Comic.should_receive(:edit).exactly(1)\r
782         delete :destroy, :id => @comic.id\r
783       end\r
784       it 'モデルに削除を依頼する' do\r
785         Comic.any_instance.should_receive(:destroy_with_story).exactly(1)\r
786         delete :destroy, :id => @comic.id\r
787       end\r
788       it '@comicにアレを取得している' do\r
789         delete :destroy, :id => @comic.id\r
790         assigns(:comic).id.should eq(@comic.id)\r
791       end\r
792     end\r
793     context 'つつがなく終わるとき' do\r
794       it '削除される' do\r
795         lambda {\r
796           delete :destroy, :id => @comic.id\r
797         }.should change Comic, :count\r
798       end\r
799       context 'html形式' do\r
800         before do\r
801           Comic.any_instance.stub(:destroy_with_story).with(any_args()).and_return(true)\r
802         end\r
803         it 'ステータスコード302 Foundを返す' do\r
804           delete :destroy, :id => @comic.id\r
805           response.status.should eq 302\r
806         end\r
807         it 'マイコミックの一覧ページへ遷移する' do\r
808           delete :destroy, :id => @comic.id\r
809           response.should redirect_to('/home/comic')\r
810         end\r
811       end\r
812       context 'json形式' do\r
813         before do\r
814           Comic.any_instance.stub(:destroy_with_story).with(any_args()).and_return(true)\r
815         end\r
816         it 'ステータスコード200 OKを返す' do\r
817           delete :destroy, :id => @comic.id, :format => :json\r
818           response.should be_success \r
819         end\r
820         it 'ページ本体は特に返さない' do\r
821           delete :destroy, :id => @comic.id, :format => :json\r
822           response.body.should match /./\r
823         end\r
824       end\r
825     end\r
826     context 'ユーザ権限がないとき' do\r
827       before do\r
828         sign_out @user\r
829       end\r
830       context 'html形式' do\r
831         it 'ステータスコード302 Foundを返す' do\r
832           delete :destroy, :id => @comic.id\r
833           response.status.should eq 302\r
834         end\r
835         it 'サインインページへ遷移する' do\r
836           delete :destroy, :id => @comic.id\r
837           response.body.should redirect_to '/users/sign_in'\r
838         end\r
839       end\r
840       context 'json形式' do\r
841         it '応答メッセージにUnauthorizedを返す' do\r
842           delete :destroy, :id => @comic.id, :format => :json\r
843           response.message.should match(/Unauthorized/)\r
844         end\r
845       end\r
846     end\r
847     context 'ユーザ権限はないが管理者権限があるとき' do\r
848       before do\r
849         sign_out @user\r
850         sign_in @admin\r
851       end\r
852       context 'html形式' do\r
853         it 'ステータスコード302 Foundを返す' do\r
854           delete :destroy, :id => @comic.id\r
855           response.status.should eq 302\r
856         end\r
857         it 'サインインページへ遷移する' do\r
858           delete :destroy, :id => @comic.id\r
859           response.body.should redirect_to '/users/sign_in'\r
860         end\r
861       end\r
862     end\r
863     context 'ユーザだが作家登録していないとき' do\r
864       before do\r
865         @author.destroy\r
866       end\r
867       context 'html形式' do\r
868         it 'ステータスコード302 Foundを返す' do\r
869           delete :destroy, :id => @comic.id\r
870           response.status.should eq 302\r
871         end\r
872         it '作家登録ページへ遷移する' do\r
873           delete :destroy, :id => @comic.id\r
874           response.body.should redirect_to new_author_path\r
875         end\r
876       end\r
877     end\r
878     context '削除に失敗したとき' do\r
879       before do\r
880         Comic.any_instance.stub(:destroy_with_story).and_return(false)\r
881       end\r
882       context 'html形式' do\r
883         it 'ステータスコード302 Foundを返す' do\r
884           delete :destroy, :id => @comic.id\r
885           response.status.should eq 302\r
886         end\r
887         it 'そのコミックの詳細ページへ遷移する' do\r
888           delete :destroy, :id => @comic.id\r
889           response.should redirect_to(comic_path(@comic))\r
890         end\r
891       end\r
892       context 'json形式' do\r
893         it 'ステータスコード422 unprocessable_entity を返す' do\r
894           delete :destroy, :id => @comic.id, :format => :json\r
895           response.status.should eq 422\r
896         end\r
897         it '応答メッセージUnprocessable Entityを返す' do\r
898           delete :destroy, :id => @comic.id, :format => :json\r
899           response.message.should match(/Unprocessable/)\r
900         end\r
901       end\r
902     end\r
903   end\r
904 \r
905 else\r
906   describe '一覧表示に於いて' do\r
907     before do\r
908       @comic = FactoryGirl.create :comic, :author_id => @user.author.id\r
909       Comic.stub(:list).and_return([@comic, @comic, @comic])\r
910       sign_in @user\r
911     end\r
912     context 'つつがなく終わるとき' do\r
913       it 'ステータスコード200 OKを返す' do\r
914         get :index\r
915         response.should be_success \r
916       end\r
917       context 'html形式' do\r
918         it 'indexテンプレートを描画する' do\r
919           get :index\r
920           response.should render_template("index")\r
921         end\r
922       end\r
923       context 'json形式' do\r
924         it 'jsonデータを返す' do\r
925           get :index, :format => :json\r
926           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
927         end\r
928       end\r
929     end\r
930     context 'ユーザ権限がないとき' do\r
931       before do\r
932         sign_out @user\r
933       end\r
934       it 'ステータスコード200 OKを返す' do\r
935         get :index\r
936         response.should be_success \r
937       end\r
938       context 'html形式' do\r
939         it 'indexテンプレートを描画する' do\r
940           get :index\r
941           response.should render_template("index")\r
942         end\r
943       end\r
944       context 'json形式' do\r
945         it 'jsonデータを返す' do\r
946           get :index, :format => :json\r
947           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
948         end\r
949       end\r
950     end\r
951   end\r
952   \r
953   describe '単体表示に於いて' do\r
954     before do\r
955       @comic = FactoryGirl.create :comic, :author_id => @user.author.id, :title => 'normal'\r
956       Comic.stub(:show).and_return(@comic)\r
957       sign_in @user\r
958     end\r
959     context 'つつがなく終わるとき' do\r
960       it 'ステータスコード200 OKを返す' do\r
961         get :show, :id => @comic.id\r
962         response.should be_success\r
963       end\r
964       context 'html形式' do\r
965         it 'showテンプレートを描画する' do\r
966           get :show, :id => @comic.id\r
967           response.should render_template("show")\r
968         end\r
969       end\r
970       context 'json形式' do\r
971         it 'jsonデータを返す' do\r
972           get :show, :id => @comic.id, :format => :json\r
973           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
974         end\r
975       end\r
976     end\r
977     context 'ユーザ権限がないとき' do\r
978       before do\r
979         sign_out @user\r
980       end\r
981       it 'ステータスコード200 OKを返す' do\r
982         get :show, :id => @comic.id\r
983         response.should be_success\r
984       end\r
985       context 'html形式' do\r
986         it 'showテンプレートを描画する' do\r
987           get :show, :id => @comic.id\r
988           response.should render_template("show")\r
989         end\r
990       end\r
991       context 'json形式' do\r
992         it 'jsonデータを返す' do\r
993           get :show, :id => @comic.id, :format => :json\r
994           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
995         end\r
996       end\r
997     end\r
998   end\r
999   describe 'コミック数取得に於いて' do\r
1000     before do\r
1001       Comic.should_receive(:visible_count).and_return(3)\r
1002       sign_out @user\r
1003     end\r
1004     context 'つつがなく終わるとき' do\r
1005       it 'ステータスコード200 OKを返す' do\r
1006         get :count, :format => :json\r
1007         response.should be_success \r
1008       end\r
1009       context 'json形式' do\r
1010         it 'jsonデータを返す' do\r
1011           get :count, :format => :json\r
1012           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1013         end\r
1014       end\r
1015     end\r
1016   end\r
1017 \r
1018   describe '新規作成フォーム表示に於いて' do\r
1019     before do\r
1020       sign_in @user\r
1021     end\r
1022     context 'つつがなく終わるとき' do\r
1023       it 'ステータスコード200 OKを返す' do\r
1024         get :new\r
1025         response.should be_success \r
1026       end\r
1027       context 'html形式' do\r
1028         it 'newテンプレートを描画する' do\r
1029           get :new\r
1030           response.should render_template("new")\r
1031         end\r
1032       end\r
1033       context 'js形式' do\r
1034         it 'new.jsテンプレートを描画する' do\r
1035           get :new, :format => :js\r
1036           response.should render_template("new")\r
1037         end\r
1038       end\r
1039       context 'json形式' do\r
1040         it 'jsonデータを返す' do\r
1041           get :new, :format => :json\r
1042           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1043         end\r
1044       end\r
1045     end\r
1046     context 'ユーザ権限がないとき' do\r
1047       before do\r
1048         sign_out @user\r
1049       end\r
1050       context 'html形式' do\r
1051         it 'ステータスコード302 Foundを返す' do\r
1052           get :new\r
1053           response.status.should eq 302\r
1054         end\r
1055         it 'サインインページへ遷移する' do\r
1056           get :new\r
1057           response.body.should redirect_to '/users/sign_in'\r
1058         end\r
1059       end\r
1060       context 'js形式' do\r
1061         it 'ステータスコード401 Unauthorizedを返す' do\r
1062           get :new, :format => :js\r
1063           response.status.should eq 401\r
1064         end\r
1065         it '応答メッセージにUnauthorizedを返す' do\r
1066           get :new, :format => :js\r
1067           response.message.should match(/Unauthorized/)\r
1068         end\r
1069       end\r
1070       context 'json形式' do\r
1071         it 'ステータスコード401 Unauthorizedを返す' do\r
1072           get :new, :format => :json\r
1073           response.status.should eq 401\r
1074         end\r
1075         it '応答メッセージにUnauthorizedを返す' do\r
1076           get :new, :format => :json\r
1077           response.message.should match(/Unauthorized/)\r
1078         end\r
1079       end\r
1080     end\r
1081   end\r
1082 \r
1083   describe '新規作成に於いて' do\r
1084     before do\r
1085       sign_in @user\r
1086       @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'normal')\r
1087     end\r
1088     context 'つつがなく終わるとき' do\r
1089       context 'html形式' do\r
1090         it 'ステータスコード302 Foundを返す' do\r
1091           Comic.any_instance.stub(:save).and_return(true)\r
1092           post :create, :comic => @attr\r
1093           response.status.should eq 302\r
1094         end\r
1095         it '作成されたコミックの表示ページへ遷移する' do\r
1096 #          Comic.any_instance.stub(:save).and_return(true)\r
1097           post :create, :comic => @attr\r
1098           response.should redirect_to(Comic.last)\r
1099         end\r
1100       end\r
1101       context 'json形式' do\r
1102         it 'ステータスコード200 OKを返す' do\r
1103 #          Comic.any_instance.stub(:save).and_return(true)\r
1104           post :create, :comic => @attr, :format => :json\r
1105           response.should be_success \r
1106         end\r
1107         it '作成されたコミックをjsonデータで返す' do\r
1108           post :create, :comic => @attr, :format => :json\r
1109           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
1110         end\r
1111       end\r
1112     end\r
1113     context 'ユーザ権限がないとき' do\r
1114       before do\r
1115         sign_out @user\r
1116       end\r
1117       context 'html形式' do\r
1118         it 'ステータスコード302 Foundを返す' do\r
1119           post :create, :comic => @attr\r
1120           response.status.should eq 302\r
1121         end\r
1122         it 'サインインページへ遷移する' do\r
1123           post :create, :comic => @attr\r
1124           response.body.should redirect_to '/users/sign_in'\r
1125         end\r
1126       end\r
1127       context 'json形式' do\r
1128         it 'ステータスコード401 Unauthorizedを返す' do\r
1129           post :create, :comic => @attr, :format => :json\r
1130           response.status.should eq 401\r
1131         end\r
1132         it '応答メッセージにUnauthorizedを返す' do\r
1133           post :create, :comic => @attr, :format => :json\r
1134           response.message.should match(/Unauthorized/)\r
1135         end\r
1136       end\r
1137     end\r
1138   end\r
1139 \r
1140   describe '編集フォーム表示に於いて' do\r
1141     before do\r
1142       @comic = FactoryGirl.create :comic, :author_id => @user.author.id\r
1143       sign_in @user\r
1144       Comic.stub(:edit).and_return(@comic)\r
1145     end\r
1146     context 'つつがなく終わるとき' do\r
1147       it 'ステータスコード200 OKを返す' do\r
1148         get :edit, :id => @comic.id\r
1149         response.should be_success \r
1150       end\r
1151       context 'html形式' do\r
1152         it 'editテンプレートを描画する' do\r
1153           get :edit, :id => @comic.id\r
1154           response.should render_template("edit")\r
1155         end\r
1156       end\r
1157       context 'js形式' do\r
1158         it 'edit.jsテンプレートを描画する' do\r
1159           get :edit, :id => @comic.id, :format => :js\r
1160           response.should render_template("edit")\r
1161         end\r
1162       end\r
1163     end\r
1164     context 'ユーザ権限がないとき' do\r
1165       before do\r
1166         sign_out @user\r
1167       end\r
1168       context 'html形式' do\r
1169         it 'ステータスコード302 Foundを返す' do\r
1170           get :edit, :id => @comic.id\r
1171           response.status.should eq 302\r
1172         end\r
1173         it 'サインインページへ遷移する' do\r
1174           get :edit, :id => @comic.id\r
1175           response.body.should redirect_to '/users/sign_in'\r
1176         end\r
1177       end\r
1178       context 'js形式' do\r
1179         it 'ステータスコード401 Unauthorizedを返す' do\r
1180           get :edit, :id => @comic.id, :format => :js\r
1181           response.status.should eq 401\r
1182         end\r
1183         it '応答メッセージにUnauthorizedを返す' do\r
1184           get :edit, :id => @comic.id, :format => :js\r
1185           response.message.should match(/Unauthorized/)\r
1186         end\r
1187       end\r
1188     end\r
1189   end\r
1190 \r
1191   describe '更新に於いて' do\r
1192     before do\r
1193       @comic = FactoryGirl.create :comic, :author => @author\r
1194       @attr = FactoryGirl.attributes_for(:comic, :author_id => @author.id, :title => 'updated title', :visible => 0)\r
1195       sign_in @user\r
1196     end\r
1197     context 'つつがなく終わるとき' do\r
1198       context 'html形式' do\r
1199         it 'ステータスコード302 Foundを返す' do\r
1200           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
1201           put :update, :id => @comic.id, :comic => @attr\r
1202           response.status.should eq 302\r
1203         end\r
1204         it '更新されたコミックの表示ページへ遷移する' do\r
1205           put :update, :id => @comic.id, :comic => @attr\r
1206           response.should redirect_to(@comic)\r
1207         end\r
1208       end\r
1209       context 'json形式' do\r
1210         it 'ステータスコード200 OKを返す' do\r
1211           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
1212           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
1213           response.should be_success \r
1214         end\r
1215         it 'ページ本体は特に返さない' do\r
1216           Comic.any_instance.stub(:save).with(any_args()).and_return(true)\r
1217           put :update, :id => @comic.id, :comic => @attr, :format => :json\r
1218           response.body.should match /./\r
1219         end\r
1220       end\r
1221     end\r
1222     context 'ユーザ権限がないとき' do\r
1223       before do\r
1224         sign_out @user\r
1225       end\r
1226       it 'ステータスコード302 Foundを返す' do\r
1227         put :update, :id => @comic.id, :comic => @attr\r
1228         response.status.should eq 302\r
1229       end\r
1230       context 'html形式' do\r
1231         it 'サインインページへ遷移する' do\r
1232           put :update, :id => @comic.id, :comic => @attr\r
1233           response.body.should redirect_to '/users/sign_in'\r
1234         end\r
1235       end\r
1236     end\r
1237   end\r
1238 \r
1239   describe '削除に於いて' do\r
1240     before do\r
1241       @comic = FactoryGirl.create :comic, :author => @author\r
1242       sign_in @user\r
1243     end\r
1244     context 'つつがなく終わるとき' do\r
1245       context 'html形式' do\r
1246         before do\r
1247           Comic.any_instance.stub(:destroy_with_story).with(any_args()).and_return(true)\r
1248         end\r
1249         it 'ステータスコード302 Foundを返す' do\r
1250           delete :destroy, :id => @comic.id\r
1251           response.status.should eq 302\r
1252         end\r
1253         it 'マイコミックの一覧ページへ遷移する' do\r
1254           delete :destroy, :id => @comic.id\r
1255           response.should redirect_to('/home/comic')\r
1256         end\r
1257       end\r
1258       context 'json形式' do\r
1259         before do\r
1260           Comic.any_instance.stub(:destroy_with_story).with(any_args()).and_return(true)\r
1261         end\r
1262         it 'ステータスコード200 OKを返す' do\r
1263           delete :destroy, :id => @comic.id, :format => :json\r
1264           response.should be_success \r
1265         end\r
1266         it 'ページ本体は特に返さない' do\r
1267           delete :destroy, :id => @comic.id, :format => :json\r
1268           response.body.should match /./\r
1269         end\r
1270       end\r
1271     end\r
1272     context 'ユーザ権限がないとき' do\r
1273       before do\r
1274         sign_out @user\r
1275       end\r
1276       it 'ステータスコード302 Foundを返す' do\r
1277         delete :destroy, :id => @comic.id\r
1278         response.status.should eq 302\r
1279       end\r
1280       context 'html形式' do\r
1281         it 'サインインページへ遷移する' do\r
1282           delete :destroy, :id => @comic.id\r
1283           response.body.should redirect_to '/users/sign_in'\r
1284         end\r
1285       end\r
1286       context 'json形式' do\r
1287         it '応答メッセージにUnauthorizedを返す' do\r
1288           delete :destroy, :id => @comic.id, :format => :json\r
1289           response.message.should match(/Unauthorized/)\r
1290         end\r
1291       end\r
1292     end\r
1293   end\r
1294 \r
1295 end\r
1296 \r
1297 end\r