OSDN Git Service

fix: any
[pettanr/pettanr.git] / spec / controllers / demander_statuses_controller_spec.rb
1 # -*- encoding: utf-8 -*-
2 #貸与状況
3 require 'spec_helper'
4
5 describe DemanderStatusesController do
6   before do
7     @admin = FactoryGirl.create :admin
8     @sp = FactoryGirl.create :system_picture
9     @lg = FactoryGirl.create :license_group
10     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
11     @user = FactoryGirl.create :user_yas
12     @author = @user.author    #ユーザ作成時に連動して作成される
13     @demand_user = FactoryGirl.create :demand_user
14   end
15   
16   describe '一覧表示に於いて' do
17     before do
18       @ds = FactoryGirl.create :demander_status
19       @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id
20       DemanderStatus.stub(:list).and_return([@ds, @ds, @ds])
21       DemanderStatus.stub(:requested_list).and_return([@ds, @ds])
22       sign_in @admin
23     end
24     context '事前チェックする' do
25       it '与えられたpageがセットされている' do
26         get :index, :page => 5
27         assigns(:page).should eq 5
28       end
29       it '省略されると@pageに1値が入る' do
30         get :index
31         assigns(:page).should eq 1
32       end
33       it '与えられたpage_sizeがセットされている' do
34         get :index, :page_size => 15
35         assigns(:page_size).should eq 15
36       end
37       it '省略されると@page_sizeにデフォルト値が入る' do
38         get :index
39         assigns(:page_size).should eq DemanderStatus.default_page_size
40       end
41       it '最大を超えると@page_sizeにデフォルト最大値が入る' do
42         get :index, :page_size => 1500
43         assigns(:page_size).should eq DemanderStatus.max_page_size
44       end
45       it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
46         get :index, :page_size => 0
47         assigns(:page_size).should eq DemanderStatus.default_page_size
48       end
49     end
50     context 'つつがなく終わるとき' do
51       it 'ステータスコード200 OKを返す' do
52         get :index
53         response.should be_success 
54       end
55       it '@hideが空になっている' do
56         get :index
57         assigns(:hide).should be_blank
58       end
59       it '貸与状況モデルに全一覧取得を問い合わせている' do
60         DemanderStatus.should_receive(:list).exactly(1)
61         get :index
62       end
63       it '@demander_statusesにリストを取得している' do
64         get :index
65         assigns(:demander_statuses).should have_at_least(3).items
66       end
67       context 'html形式' do
68         it 'indexテンプレートを描画する' do
69           get :index
70           response.should render_template("index")
71         end
72       end
73       context 'json形式' do
74         it 'jsonデータを返す' do
75           get :index, :format => :json
76           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
77         end
78         it '貸与状況モデルにjson一覧出力オプションを問い合わせている' do
79           DemanderStatus.should_receive(:list_json_opt).exactly(1)
80           get :index, :format => :json
81         end
82         it 'データがリスト構造になっている' do
83           get :index, :format => :json
84           json = JSON.parse response.body
85           json.should have_at_least(3).items
86         end
87         it 'リストの先頭くらいは貸与状況っぽいものであって欲しい' do
88           get :index, :format => :json
89           json = JSON.parse response.body
90           json.first.has_key?("token").should be_true
91           json.first.has_key?("receive_hour1").should be_true
92           json.first.has_key?("receive_hour2").should be_true
93           json.first.has_key?("requested_at").should be_true
94         end
95       end
96     end
97     context '除外フラグが除外のとき' do
98       it '@hideが設定されている' do
99         get :index, :hide => 1
100         assigns(:hide).should_not be_blank
101       end
102       it '貸与状況モデルに申請中一覧取得を問い合わせている' do
103         DemanderStatus.should_receive(:requested_list).exactly(1)
104         get :index, :hide => 1
105       end
106       it '@demander_statusesにリストを取得している' do
107         get :index, :hide => 1
108         assigns(:demander_statuses).should have_at_least(2).items
109       end
110     end
111     context '管理者権限がないとき' do
112       before do
113         sign_out @admin
114       end
115       context 'html形式' do
116         it 'ステータスコード302 Foundを返す' do
117           get :index
118           response.status.should eq 302
119         end
120         it 'サインインページへ遷移する' do
121           get :index
122           response.should redirect_to '/admins/sign_in'
123         end
124       end
125       context 'json形式' do
126         it 'ステータスコード401 Unauthorizedを返す' do
127           get :index, :format => :json
128           response.status.should eq 401
129         end
130         it '応答メッセージにUnauthorizedを返す' do
131           get :index, :format => :json
132           response.message.should match(/Unauthorized/)
133         end
134       end
135     end
136   end
137   
138   describe '単体表示に於いて' do
139     before do
140       @ds = FactoryGirl.create :demander_status
141       @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id
142       DemanderStatus.stub(:show).and_return(@ds)
143       sign_in @admin
144     end
145     context 'つつがなく終わるとき' do
146       it 'ステータスコード200 OKを返す' do
147         get :show, :id => @ds.id
148         response.should be_success
149       end
150       it '貸与状況モデルに単体取得を問い合わせている' do
151         DemanderStatus.should_receive(:show).exactly(1)
152         get :show
153       end
154       it '@demander_statusにアレを取得している' do
155         get :show, :id => @ds.id
156         assigns(:demander_status).should eq(@ds)
157       end
158       context 'html形式' do
159         it 'showテンプレートを描画する' do
160           get :show, :id => @ds.id
161           response.should render_template("show")
162         end
163       end
164       context 'json形式' do
165         it 'jsonデータを返す' do
166           get :show, :id => @ds.id, :format => :json
167           lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
168         end
169         it '貸与状況モデルにjson単体出力オプションを問い合わせている' do
170           DemanderStatus.should_receive(:show_json_opt).exactly(1)
171           get :show, :id => @ds.id, :format => :json
172         end
173         it 'データがアレになっている' do
174           get :show, :id => @ds.id, :format => :json
175           json = JSON.parse response.body
176           json.has_key?("token").should be_true
177           json.has_key?("receive_hour1").should be_true
178           json.has_key?("receive_hour2").should be_true
179           json.has_key?("requested_at").should be_true
180         end
181       end
182     end
183     context '管理者権限がないとき' do
184       before do
185         sign_out @admin
186       end
187       context 'html形式' do
188         it 'ステータスコード302 Foundを返す' do
189           get :show, :id => @ds.id
190           response.status.should eq 302
191         end
192         it 'サインインページへ遷移する' do
193           get :show, :id => @ds.id
194           response.body.should redirect_to '/admins/sign_in'
195         end
196       end
197       context 'json形式' do
198         it 'ステータスコード401 Unauthorizedを返す' do
199           get :show, :id => @ds.id, :format => :json
200           response.status.should eq 401
201         end
202         it '応答メッセージにUnauthorizedを返す' do
203           get :show, :id => @ds.id, :format => :json
204           response.message.should match(/Unauthorized/)
205         end
206       end
207     end
208   end
209   
210   describe '編集フォーム表示に於いて' do
211     before do
212       @ds = FactoryGirl.create :demander_status
213       @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id
214       sign_in @admin
215       DemanderStatus.stub(:edit).with(@ds.id.to_s, @admin).and_return(@ds)
216     end
217     context 'つつがなく終わるとき' do
218       it 'ステータスコード200 OKを返す' do
219         get :edit, :id => @ds.id
220         response.should be_success 
221       end
222       it '貸与状況モデルに編集取得を問い合わせている' do
223         DemanderStatus.should_receive(:edit).exactly(1)
224         get :edit, :id => @ds.id
225       end
226       it '@demander_statusにデータを用意している' do
227         get :edit, :id => @ds.id
228         assigns(:demander_status).should eq @ds
229       end
230       context 'html形式' do
231         it 'editテンプレートを描画する' do
232           get :edit, :id => @ds.id
233           response.should render_template("edit")
234         end
235       end
236     end
237     context '管理者権限がないとき' do
238       before do
239         sign_out @admin
240       end
241       context 'html形式' do
242         it 'ステータスコード302 Foundを返す' do
243           get :edit, :id => @ds.id
244           response.status.should eq 302
245         end
246         it 'サインインページへ遷移する' do
247           get :edit, :id => @ds.id
248           response.body.should redirect_to '/admins/sign_in'
249         end
250       end
251     end
252   end
253
254   describe '更新に於いて' do
255     before do
256       @ds = FactoryGirl.create :demander_status, :requested_at => Time.now
257       @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id
258       @attr = {:receive_hour1 => 12, :receive_hour2 => 22}
259       sign_in @admin
260     end
261     context '事前チェックしておく' do
262       it '貸与状況モデルに編集取得を問い合わせている' do
263         DemanderStatus.stub(:edit).with(any_args()).and_return @ds
264         DemanderStatus.should_receive(:edit).exactly(1)
265         put :update, :id => @ds.id, :demander_status => @attr
266       end
267       it '貸与状況モデルに貸与承認を依頼している' do
268         DemanderStatus.any_instance.stub(:approve).with(any_args).and_return true
269         DemanderStatus.any_instance.should_receive(:approve).with('12', '22').exactly(1)
270         put :update, :id => @ds.id, :demander_status => @attr
271       end
272       it '@demander_statusにアレを取得している' do
273         put :update, :id => @ds.id, :demander_status => @attr
274         assigns(:demander_status).id.should eq(@ds.id)
275       end
276     end
277     context 'つつがなく終わるとき' do
278       it '更新される' do
279         put :update, :id => @ds.id, :demander_status => @attr
280         DemanderStatus.find(@ds.id).receive_hour1.should eq 12
281         DemanderStatus.find(@ds.id).receive_hour2.should eq 22
282       end
283       context 'html形式' do
284         before do
285         end
286         it 'ステータスコード302 Foundを返す' do
287           put :update, :id => @ds.id, :demander_status => @attr
288           response.status.should eq 302
289         end
290         it '更新された貸与状況の表示ページへ遷移する' do
291           put :update, :id => @ds.id, :demander_status => @attr
292           response.should redirect_to(@ds)
293         end
294         it '一時的メッセージに処理成功を設定する' do
295           put :update, :id => @ds.id, :demander_status => @attr
296           flash[:notice].should eq I18n.t('demander_statuses.flash.notice.approved')
297         end
298       end
299       context 'json形式' do
300         before do
301           DemanderStatus.any_instance.stub(:approve).with(any_args()).and_return(true)
302         end
303         it 'ステータスコード200 OKを返す' do
304           put :update, :id => @ds.id, :demander_status => @attr, :format => :json
305           response.should be_success 
306         end
307         it 'ページ本体は特に返さない' do
308           put :update, :id => @ds.id, :demander_status => @attr, :format => :json
309           response.body.should match /./
310         end
311       end
312     end
313     context '管理者権限がないとき' do
314       before do
315         sign_out @admin
316       end
317       it 'ステータスコード302 Foundを返す' do
318         put :update, :id => @ds.id, :demander_status => @attr
319         response.status.should eq 302
320       end
321       context 'html形式' do
322         it 'サインインページへ遷移する' do
323           put :update, :id => @ds.id, :demander_status => @attr
324           response.body.should redirect_to '/admins/sign_in'
325         end
326       end
327       context 'json形式' do
328         it '応答メッセージにUnauthorizedを返す' do
329           put :update, :id => @ds.id, :demander_status => @attr, :format => :json
330           response.message.should match(/Unauthorized/)
331         end
332       end
333     end
334     context '検証、保存に失敗したとき' do
335       before do
336         DemanderStatus.any_instance.stub(:approve).with(any_args()).and_return(false)
337       end
338       context 'html形式' do
339         it 'ステータスコード200 Okを返す' do
340           put :update, :id => @ds.id, :demander_status => @attr
341           response.status.should eq 200
342         end
343         it '編集ページを描画する' do
344           put :update, :id => @ds.id, :demander_status => @attr
345           response.should render_template("edit")
346         end
347       end
348       context 'json形式' do
349         it 'ステータスコード422 unprocessable_entity を返す' do
350           DemanderStatus.any_instance.stub(:save).and_return(false)
351           put :update, :id => @ds.id, :demander_status => @attr, :format => :json
352           response.status.should eq 422
353         end
354         it '応答メッセージUnprocessable Entityを返す' do
355           put :update, :id => @ds.id, :demander_status => @attr, :format => :json
356           response.message.should match(/Unprocessable/)
357         end
358       end
359     end
360   end
361   
362   describe '貸与停止に於いて' do
363     before do
364       @ds = FactoryGirl.create :demander_status
365       @demander = FactoryGirl.create :demander, :demander_status_id => @ds.id
366       sign_in @admin
367     end
368     context '事前チェックしておく' do
369       it '貸与状況モデルに編集取得を問い合わせている' do
370         DemanderStatus.stub(:edit).with(any_args()).and_return @ds
371         DemanderStatus.should_receive(:edit).exactly(1)
372         delete :destroy, :id => @ds.id
373       end
374       it 'モデルに貸与停止を依頼する' do
375         DemanderStatus.any_instance.stub(:reject).with(any_args).and_return true
376         DemanderStatus.any_instance.should_receive(:reject).exactly(1)
377         delete :destroy, :id => @ds.id
378       end
379       it '@demander_statusにアレを取得している' do
380         delete :destroy, :id => @ds.id
381         assigns(:demander_status).should eq(@ds)
382       end
383     end
384     context 'つつがなく終わるとき' do
385       before do
386         DemanderStatus.any_instance.stub(:reject).with(any_args()).and_return(true)
387       end
388       context 'html形式' do
389         it 'ステータスコード302 Foundを返す' do
390           delete :destroy, :id => @ds.id
391           response.status.should eq 302
392         end
393         it '貸与状況閲覧(show)ページに遷移する' do
394           delete :destroy, :id => @ds.id
395           response.should redirect_to(@ds)
396         end
397         it '一時的メッセージに処理成功を設定する' do
398           delete :destroy, :id => @ds.id
399           flash[:notice].should eq I18n.t('demander_statuses.flash.notice.rejected')
400         end
401       end
402       context 'json形式' do
403         it 'ステータスコード200 OKを返す' do
404           delete :destroy, :id => @ds.id, :format => :json
405           response.should be_success 
406         end
407         it 'ページ本体は特に返さない' do
408           delete :destroy, :id => @ds.id, :format => :json
409           response.body.should match /./
410         end
411       end
412     end
413     context '管理者権限がないとき' do
414       before do
415         sign_out @admin
416       end
417       it 'ステータスコード302 Foundを返す' do
418         delete :destroy, :id => @ds.id
419         response.status.should eq 302
420       end
421       context 'html形式' do
422         it 'サインインページへ遷移する' do
423           delete :destroy, :id => @ds.id
424           response.body.should redirect_to '/admins/sign_in'
425         end
426       end
427       context 'json形式' do
428         it '応答メッセージにUnauthorizedを返す' do
429           delete :destroy, :id => @ds.id, :format => :json
430           response.message.should match(/Unauthorized/)
431         end
432       end
433     end
434     
435     context '否決に失敗した(否決できる状態でなかった)とき' do
436       before do
437         DemanderStatus.any_instance.stub(:reject).with(any_args).and_return(false)
438       end
439       context 'html形式' do
440         it 'ステータスコード302 Foundを返す' do
441           delete :destroy, :id => @ds.id
442           response.status.should eq 302
443         end
444         it '貸与状況閲覧(show)ページに遷移するする' do
445           delete :destroy, :id => @ds.id
446           response.should redirect_to(@ds)
447         end
448         it '一時的メッセージに処理失敗を設定する' do
449           delete :destroy, :id => @ds.id
450           flash[:notice].should eq I18n.t('demander_statuses.flash.notice.not_rejected')
451         end
452       end
453       context 'json形式' do
454         it 'ステータスコード422 unprocessable_entity を返す' do
455           delete :destroy, :id => @ds.id, :format => :json
456           response.status.should eq 422
457         end
458         it '応答メッセージUnprocessable Entityを返す' do
459           delete :destroy, :id => @ds.id, :format => :json
460           response.message.should match(/Unprocessable/)
461         end
462       end
463     end
464   end
465
466 end