OSDN Git Service

merge v04license
[pettanr/pettanr.git] / spec / controllers / stories_controller_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #ストーリー
4 describe StoriesController do
5   before do
6     FactoryGirl.create :admin
7     @sp = FactoryGirl.create :system_picture
8     @lg = FactoryGirl.create :license_group
9     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
10     @user = FactoryGirl.create :user_yas
11     @author = @user.author    #ユーザ作成時に連動して作成される
12     @comic = FactoryGirl.create :comic, :author_id => @user.author.id
13     @panel = FactoryGirl.create :panel, :author_id => @author.id
14   end
15   
16
17   describe '閲覧に於いて' do
18     before do
19       @story = FactoryGirl.create :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
20       Comic.stub(:show).and_return(@comic)
21       sign_in @user
22     end
23     context '事前チェックする' do
24     end
25     context 'つつがなく終わるとき' do
26     end
27     context '作家権限がないとき' do
28     end
29   end
30
31   describe '新規作成フォーム表示に於いて' do
32     before do
33       sign_in @user
34     end
35     context 'つつがなく終わるとき' do
36       it 'ステータスコード200 OKを返す' do
37         get :new
38         response.should be_success 
39       end
40       it '@storyに新規データを用意している' do
41         get :new
42         assigns(:story).should be_a_new(Story)
43       end
44       it 'モデルにデフォルト値補充を依頼している' do
45         Story.any_instance.should_receive(:supply_default).exactly(1)
46         get :new
47       end
48       context 'html形式' do
49         it 'newテンプレートを描画する' do
50           get :new
51           response.should render_template("new")
52         end
53       end
54       context 'js形式' do
55         it 'new.jsテンプレートを描画する' do
56           get :new, :format => :js
57           response.should render_template("new")
58         end
59       end
60     end
61     context '作家権限がないとき' do
62       before do
63         sign_out @user
64       end
65       context 'html形式' do
66         it 'ステータスコード302 Foundを返す' do
67           get :new
68           response.status.should eq 302
69         end
70         it 'サインインページへ遷移する' do
71           get :new
72           response.body.should redirect_to '/users/sign_in'
73         end
74       end
75       context 'js形式' do
76         it 'ステータスコード401 Unauthorizedを返す' do
77           get :new, :format => :js
78           response.status.should eq 401
79         end
80         it '応答メッセージにUnauthorizedを返す' do
81           get :new, :format => :js
82           response.message.should match(/Unauthorized/)
83         end
84       end
85     end
86   end
87   
88   describe '新規作成に於いて' do
89     before do
90       @attr = FactoryGirl.attributes_for(:story, :t => nil, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id)
91       sign_in @user
92     end
93     context 'つつがなく終わるとき' do
94       it 'デフォルト値補充を依頼する' do
95         Story.any_instance.should_receive(:supply_default).exactly(1)
96         post :create, :story => @attr
97       end
98       it 'POSTデータから、カラム値を復元している' do
99         Story.any_instance.stub(:store).and_return(true)
100         Story.any_instance.should_receive(:attributes=).exactly(1)
101         post :create, :story => @attr
102       end
103       it '上書き補充を依頼する' do
104         Story.any_instance.should_receive(:overwrite).exactly(1)
105         post :create, :story => @attr
106       end
107       it 'モデルに保存依頼する' do
108         Story.any_instance.should_receive(:store).exactly(1)
109         post :create, :story => @attr
110       end
111       it "@storyに作成されたコマを保持していて、それがDBにある" do
112         post :create, :story => @attr
113         assigns(:story).should be_a(Story)
114         assigns(:story).should be_persisted
115       end
116       context 'html形式' do
117         it 'ステータスコード302 Foundを返す' do
118           Story.any_instance.stub(:store).and_return(true)
119           post :create, :story => @attr
120           response.status.should eq 302
121         end
122         it 'コミックのストーリー表示へ遷移する' do
123 #          Story.any_instance.stub(:store).and_return(true)
124           post :create, :story => @attr
125           response.should redirect_to(:action => :show, :id => @attr[:comic_id])
126         end
127       end
128       context 'json形式' do
129         it 'ステータスコード200 OKを返す' do
130 #          Story.any_instance.stub(:store).and_return(true)
131           post :create, :story => @attr, :format => :json
132           response.should be_success 
133         end
134         it '作成されたコマをjsonデータで返す' do
135           post :create, :story => @attr, :format => :json
136           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
137         end
138         it 'データがアレになっている' do
139           post :create, :story => @attr, :format => :json
140           json = JSON.parse response.body
141           json["t"].should eq 0
142         end
143       end
144     end
145     context '作家権限がないとき' do
146       before do
147         sign_out @user
148       end
149       context 'html形式' do
150         it 'ステータスコード302 Foundを返す' do
151           post :create, :story => @attr
152           response.status.should eq 302
153         end
154         it 'サインインページへ遷移する' do
155           post :create, :story => @attr
156           response.body.should redirect_to '/users/sign_in'
157         end
158       end
159       context 'json形式' do
160         it 'ステータスコード401 Unauthorizedを返す' do
161           post :create, :story => @attr, :format => :json
162           response.status.should eq 401
163         end
164         it '応答メッセージにUnauthorizedを返す' do
165           post :create, :story => @attr, :format => :json
166           response.message.should match(/Unauthorized/)
167         end
168       end
169     end
170     context '検証、保存に失敗した' do
171       before do
172         Story.any_instance.stub(:store).and_return(false)
173       end
174       it "未保存のコマを保持している" do
175         post :create, :story => @attr
176         assigns(:story).should be_a_new(Story)
177       end
178       context 'html形式' do
179         it 'ステータスコード200 OKを返す' do
180           post :create, :story => @attr
181           response.status.should eq 200
182         end
183         it '新規ページを描画する' do
184           post :create, :story => @attr
185           response.should render_template("new")
186         end
187       end
188       context 'json形式' do
189         it 'ステータスコード422 unprocessable_entity を返す' do
190           post :create, :story => @attr, :format => :json
191           response.status.should eq 422
192         end
193         it '応答メッセージUnprocessable Entityを返す' do
194           post :create, :story => @attr, :format => :json
195           response.message.should match(/Unprocessable/)
196         end
197       end
198     end
199   end
200
201   describe '編集フォーム表示に於いて' do
202     before do
203       @story = FactoryGirl.create :story, :author_id => @author.id
204       sign_in @user
205       Story.stub(:show).and_return(@story)
206     end
207     context 'つつがなく終わるとき' do
208       it 'ステータスコード200 OKを返す' do
209         get :edit, :id => @story.id
210         response.should be_success 
211       end
212       it 'コマモデルに単体取得を問い合わせている' do
213         Story.should_receive(:show).exactly(1)
214         get :edit, :id => @story.id
215       end
216       it '@storyにデータを用意している' do
217         get :edit, :id => @story.id
218         assigns(:story).should eq @story
219       end
220       context 'html形式' do
221         it 'editテンプレートを描画する' do
222           get :edit, :id => @story.id
223           response.should render_template("edit")
224         end
225       end
226       context 'js形式' do
227         it 'edit.jsテンプレートを描画する' do
228           get :edit, :id => @story.id, :format => :js
229           response.should render_template("edit")
230         end
231       end
232     end
233     context '作家権限がないとき' do
234       before do
235         sign_out @user
236       end
237       context 'html形式' do
238         it 'ステータスコード302 Foundを返す' do
239           get :edit, :id => @story.id
240           response.status.should eq 302
241         end
242         it 'サインインページへ遷移する' do
243           get :edit, :id => @story.id
244           response.body.should redirect_to '/users/sign_in'
245         end
246       end
247       context 'js形式' do
248         it 'ステータスコード401 Unauthorizedを返す' do
249           get :edit, :id => @story.id, :format => :js
250           response.status.should eq 401
251         end
252         it '応答メッセージにUnauthorizedを返す' do
253           get :edit, :id => @story.id, :format => :js
254           response.message.should match(/Unauthorized/)
255         end
256       end
257     end
258   end
259
260   describe '更新に於いて' do
261     before do
262       @story = FactoryGirl.create :story, :author_id => @user.author.id
263       @attr = FactoryGirl.attributes_for(:story, :author_id => @author.id)
264       sign_in @user
265     end
266     context 'つつがなく終わるとき' do
267       it 'モデルに編集取得依頼する' do
268         Story.stub(:edit).with(any_args).and_return(@story)
269         Story.should_receive(:edit).exactly(1)
270         put :update, :id => @story.id, :story => @attr
271       end
272       it 'POSTデータから、カラム値を復元している' do
273         Story.any_instance.stub(:store).and_return(true)
274         Story.any_instance.should_receive(:attributes=).exactly(1)
275         put :update, :id => @story.id, :story => @attr
276       end
277       it '上書き補充を依頼する' do
278         Story.any_instance.should_receive(:overwrite).exactly(1)
279         put :update, :id => @story.id, :story => @attr
280       end
281       it 'モデルに保存依頼する' do
282         Story.any_instance.should_receive(:store).exactly(1)
283         put :update, :id => @story.id, :story => @attr
284       end
285       it "@storyに作成されたストーリーを保持していて、それがDBにある" do
286         put :update, :id => @story.id, :story => @attr
287         assigns(:story).should be_a(Story)
288         assigns(:story).should be_persisted
289       end
290       context 'html形式' do
291         it 'ステータスコード302 Foundを返す' do
292           Story.any_instance.stub(:store).and_return(true)
293           put :update, :id => @story.id, :story => @attr
294           response.status.should eq 302
295         end
296         it 'コミックのストーリー表示へ遷移する' do
297 #          Story.any_instance.stub(:store).and_return(true)
298           put :update, :id => @story.id, :story => @attr
299           response.should redirect_to(:action => :show, :id => @attr[:comic_id])
300         end
301       end
302       context 'json形式' do
303         it 'ステータスコード200 OKを返す' do
304 #          Story.any_instance.stub(:store).and_return(true)
305           put :update, :id => @story.id, :story => @attr, :format => :json
306           response.should be_success 
307         end
308       end
309     end
310     context '作家権限がないとき' do
311       before do
312         sign_out @user
313       end
314       context 'html形式' do
315         it 'ステータスコード302 Foundを返す' do
316           put :update, :id => @story.id, :story => @attr
317           response.status.should eq 302
318         end
319         it 'サインインページへ遷移する' do
320           put :update, :id => @story.id, :story => @attr
321           response.body.should redirect_to '/users/sign_in'
322         end
323       end
324       context 'json形式' do
325         it 'ステータスコード401 Unauthorizedを返す' do
326           put :update, :id => @story.id, :story => @attr, :format => :json
327           response.status.should eq 401
328         end
329         it '応答メッセージにUnauthorizedを返す' do
330           put :update, :id => @story.id, :story => @attr, :format => :json
331           response.message.should match(/Unauthorized/)
332         end
333       end
334     end
335     context '検証、保存に失敗した' do
336       before do
337         Story.any_instance.stub(:store).and_return(false)
338       end
339       it "指定のコマを保持している" do
340         put :update, :id => @story.id, :story => @attr
341         assigns(:story).should eq @story
342       end
343       context 'html形式' do
344         it 'ステータスコード200 OKを返す' do
345           put :update, :id => @story.id, :story => @attr
346           response.status.should eq 200
347         end
348         it '編集ページを描画する' do
349           put :update, :id => @story.id, :story => @attr
350           response.should render_template("edit")
351         end
352       end
353       context 'json形式' do
354         it 'ステータスコード422 unprocessable_entity を返す' do
355           put :update, :id => @story.id, :story => @attr, :format => :json
356           response.status.should eq 422
357         end
358         it '応答メッセージUnprocessable Entityを返す' do
359           put :update, :id => @story.id, :story => @attr, :format => :json
360           response.message.should match(/Unprocessable/)
361         end
362       end
363     end
364   end
365
366   describe '削除に於いて' do\r
367     before do\r
368       @story = FactoryGirl.create :story, :author_id => @author.id
369       sign_in @user
370       Story.stub(:edit).and_return(@story)\r
371     end\r
372     context 'つつがなく終わるとき' do\r
373       it 'ストーリーモデルに編集取得を問い合わせている' do\r
374         Story.should_receive(:edit).exactly(1)\r
375         delete :destroy, :id => @story.id\r
376       end\r
377       it '@storyにアレを取得している' do\r
378         delete :destroy, :id => @story.id\r
379         assigns(:story).id.should eq(@story.id)\r
380       end\r
381       it 'そのストーリーを一つのトランザクションで削除する' do\r
382         lambda {\r
383           delete :destroy, :id => @story.id\r
384         }.should change(Story, :count)\r
385       end\r
386       context 'html形式' do\r
387         it 'ステータスコード302 Foundを返す' do\r
388           delete :destroy, :id => @story.id\r
389           response.status.should eq 302\r
390         end\r
391         it 'ストーリー一覧ページへ遷移する' do\r
392           delete :destroy, :id => @story.id\r
393           response.should redirect_to(story_path(@story.comic_id))\r
394         end\r
395       end\r
396       context 'json形式' do\r
397         it 'ステータスコード200 OKを返す' do\r
398           delete :destroy, :id => @story.id, :format => :json\r
399           response.should be_success\r
400         end\r
401       end\r
402     end\r
403     context '作家権限がないとき' do\r
404       before do\r
405         sign_out @user\r
406       end\r
407       context 'html形式' do\r
408         it 'ステータスコード302 Foundを返す' do\r
409           delete :destroy, :id => @story.id\r
410           response.status.should eq 302\r
411         end\r
412         it 'サインインページへ遷移する' do\r
413           delete :destroy, :id => @story.id\r
414           response.body.should redirect_to '/users/sign_in'\r
415         end\r
416       end\r
417       context 'json形式' do\r
418         it 'ステータスコード401 Unauthorizedを返す' do\r
419           delete :destroy, :id => @story.id, :format => :json\r
420           response.status.should eq 401\r
421         end\r
422         it '応答メッセージにUnauthorizedを返す' do\r
423           delete :destroy, :id => @story.id, :format => :json\r
424           response.message.should match(/Unauthorized/)\r
425         end\r
426       end\r
427     end\r
428 =begin\r
429     context '対象ストーリーがないとき' do\r
430     end\r
431     context '他人のストーリーだったとき' do\r
432     end\r
433 =end\r
434   end\r
435   \r
436 end