OSDN Git Service

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