OSDN Git Service

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