OSDN Git Service

create provider
[pettanr/pettanr.git] / spec / models / provider_status_spec.rb
1 # -*- encoding: utf-8 -*-
2 #借受状況
3 require 'spec_helper'
4
5 describe ProviderStatus 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   end
14   describe '検証に於いて' do
15     before do
16       @ps = FactoryGirl.build :provider_status
17     end
18     
19     context 'オーソドックスなデータのとき' do
20       it '下限データが通る' do
21         @ps.receive_hour1 = -99999
22         @ps.receive_hour2 = -99999
23         @ps.should be_valid
24       end
25       it '上限データが通る' do
26         @ps.receive_hour1 = 99999
27         @ps.receive_hour2 = 99999
28         @ps.should be_valid
29       end
30     end
31     
32     context 'receive_hour1を検証するとき' do
33       it '数値でなければ失敗する' do
34         @ps.receive_hour1 = 'a'
35         @ps.should_not be_valid
36       end
37     end
38     context 'receive_hour2を検証するとき' do
39       it '数値でなければ失敗する' do
40         @ps.receive_hour2 = 'a'
41         @ps.should_not be_valid
42       end
43     end
44   end
45   
46   describe 'デフォルト値補充に於いて' do
47     it 'defined' do
48       @ps = FactoryGirl.build :provider_status
49       @ps.supply_default
50     end
51   end
52   
53   describe '上書き補充に於いて' do
54     it 'defined' do
55       @ps = FactoryGirl.build :provider_status
56       @ps.overwrite
57     end
58   end
59   
60   describe '所持判定に於いて' do
61     before do
62       @ps = FactoryGirl.create :provider_status
63     end
64     it '管理者ならyes' do
65       @ps.own?(@admin).should == true
66     end
67     it '作家ならno' do
68       @ps.own?(@author).should == false
69     end
70     it 'パラメータが管理者でないならno' do
71       @ps.own?(nil).should == false
72     end
73   end
74   
75   describe '閲覧許可に於いて' do
76     before do
77       @ps = FactoryGirl.create :provider_status
78     end
79     it '管理者なら許可する' do
80       r = @ps.visible?(@admin)
81       r.should == true
82     end
83     it '作家なら許可しない' do
84       r = @ps.visible?(@author)
85       r.should == false
86     end
87     it 'それ以外のとき不許可を返す。' do
88       r = @ps.visible?(nil)
89       r.should be_false
90     end
91   end
92   
93   describe '状態に於いて' do
94     before do
95     end
96     it '借り受けしていないのとき0を返す' do
97       @ps = FactoryGirl.create :provider_status, :token => nil
98       r = @ps.status
99       r.should eq 0
100     end
101     it '借り受けしているのとき1を返す' do
102       @ps = FactoryGirl.create :provider_status, :token => 'a'
103       r = @ps.status
104       r.should eq 1
105     end
106   end
107   
108   describe '一覧取得に於いて' do
109     before do
110       @ps = FactoryGirl.create :provider_status
111       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id, :name => "6"
112     end
113     context 'page補正について' do
114       it '文字列から数値に変換される' do
115         ProviderStatus.page('8').should eq 8
116       end
117       it 'nilの場合は1になる' do
118         ProviderStatus.page().should eq 1
119       end
120       it '0以下の場合は1になる' do
121         ProviderStatus.page('0').should eq 1
122       end
123     end
124     context 'page_size補正について' do
125       it '文字列から数値に変換される' do
126         ProviderStatus.page_size('7').should eq 7
127       end
128       it 'nilの場合はProviderStatus.default_page_sizeになる' do
129         ProviderStatus.page_size().should eq ProviderStatus.default_page_size
130       end
131       it '0以下の場合はProviderStatus.default_page_sizeになる' do
132         ProviderStatus.page_size('0').should eq ProviderStatus.default_page_size
133       end
134       it 'ProviderStatus.max_page_sizeを超えた場合はProviderStatus.max_page_sizeになる' do
135         ProviderStatus.page_size('1000').should eq ProviderStatus.max_page_size
136       end
137     end
138     context 'つつがなく終わるとき' do
139       it '一覧取得オプションを利用している' do
140         ProviderStatus.stub(:list_opt).with(any_args).and_return({:include => {:provider => {}} })
141         ProviderStatus.should_receive(:list_opt).with(any_args).exactly(1)
142         r = ProviderStatus.list
143       end
144     end
145     it 'リストを返す' do
146       r = ProviderStatus.list
147       r.should eq [@ps]
148     end
149     it '管理名で並んでいる' do
150       v = FactoryGirl.create :provider_status
151       vd = FactoryGirl.create :provider, :provider_status_id => v.id, :name => "0"
152       r = ProviderStatus.list
153       r.should eq [v, @ps]
154     end
155     context 'DBに5件あって1ページの件数を2件に変えたとして' do
156       before do
157         @ps2 = FactoryGirl.create :provider_status
158         @pd2 = FactoryGirl.create :provider, :provider_status_id => @ps2.id, :name => "5"
159         @ps3 = FactoryGirl.create :provider_status
160         @pd3 = FactoryGirl.create :provider, :provider_status_id => @ps3.id, :name => "4"
161         @ps4 = FactoryGirl.create :provider_status
162         @pd4 = FactoryGirl.create :provider, :provider_status_id => @ps4.id, :name => "3"
163         @ps5 = FactoryGirl.create :provider_status
164         @pd5 = FactoryGirl.create :provider, :provider_status_id => @ps5.id, :name => "2"
165         ProviderStatus.stub(:default_page_size).and_return(2)
166       end
167       it '通常は2件を返す' do
168         r = ProviderStatus.list
169         r.should have(2).items 
170       end
171       it 'page=1なら末尾2件を返す' do
172         #管理名で並んでいる
173         r = ProviderStatus.list(1)
174         r.should eq [@ps5, @ps4]
175       end
176       it 'page=2なら中間2件を返す' do
177         r = ProviderStatus.list(2)
178         r.should eq [@ps3, @ps2]
179       end
180       it 'page=3なら先頭1件を返す' do
181         r = ProviderStatus.list(3)
182         r.should eq [@ps]
183       end
184     end
185     context 'DBに5件あって1ページの件数を2件に変えたとして' do
186       before do
187         @ps2 = FactoryGirl.create :provider_status
188         @pd2 = FactoryGirl.create :provider, :provider_status_id => @ps2.id, :name => "5"
189         @ps3 = FactoryGirl.create :provider_status
190         @pd3 = FactoryGirl.create :provider, :provider_status_id => @ps3.id, :name => "4"
191         @ps4 = FactoryGirl.create :provider_status
192         @pd4 = FactoryGirl.create :provider, :provider_status_id => @ps4.id, :name => "3"
193         @ps5 = FactoryGirl.create :provider_status
194         @pd5 = FactoryGirl.create :provider, :provider_status_id => @ps5.id, :name => "2"
195         ProviderStatus.stub(:default_page_size).and_return(2)
196       end
197       it '件数0は全件(5件)を返す' do
198         r = ProviderStatus.list 5, 0
199         r.should have(5).items 
200       end
201     end
202   end
203   describe '待機中一覧取得に於いて' do
204     before do
205       @ps = FactoryGirl.create :provider_status
206       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id, :name => "6"
207     end
208     context 'つつがなく終わるとき' do
209       it '一覧取得オプションを利用している' do
210         ProviderStatus.stub(:list_opt).with(any_args).and_return({:include => {:provider => {}} })
211         ProviderStatus.should_receive(:list_opt).with(any_args).exactly(1)
212         r = ProviderStatus.available_list
213       end
214     end
215     it 'リストを返す' do
216       r = ProviderStatus.available_list
217       r.should eq [@ps]
218     end
219     it '管理名で並んでいる' do
220       @ps2 = FactoryGirl.create :provider_status
221       v = FactoryGirl.create :provider, :name => "0", :provider_status_id => @ps2.id
222       r = ProviderStatus.available_list
223       r.should eq [@ps2, @ps]
224     end
225     it '借受状況のトークンが設定されていない借受状況に限る' do
226       @ps2 = FactoryGirl.create :provider_status, :token => 'aaaaa'
227       v = FactoryGirl.create :provider, :name => "0", :provider_status_id => @ps2.id
228       r = ProviderStatus.available_list
229       r.should eq [@ps]
230     end
231     context 'DBに5件あって1ページの件数を2件に変えたとして' do
232       before do
233         @ps2 = FactoryGirl.create :provider_status
234         @pd2 = FactoryGirl.create :provider, :provider_status_id => @ps2.id, :name => "5"
235         @ps3 = FactoryGirl.create :provider_status
236         @pd3 = FactoryGirl.create :provider, :provider_status_id => @ps3.id, :name => "4"
237         @ps4 = FactoryGirl.create :provider_status
238         @pd4 = FactoryGirl.create :provider, :provider_status_id => @ps4.id, :name => "3"
239         @ps5 = FactoryGirl.create :provider_status
240         @pd5 = FactoryGirl.create :provider, :provider_status_id => @ps5.id, :name => "2"
241         ProviderStatus.stub(:default_page_size).and_return(2)
242       end
243       it '通常は2件を返す' do
244         r = ProviderStatus.available_list
245         r.should have(2).items 
246       end
247       it 'page=1なら末尾2件を返す' do
248         #管理名で並んでいる
249         r = ProviderStatus.available_list(1)
250         r.should eq [@ps5, @ps4]
251       end
252       it 'page=2なら中間2件を返す' do
253         r = ProviderStatus.available_list(2)
254         r.should eq [@ps3, @ps2]
255       end
256       it 'page=3なら先頭1件を返す' do
257         r = ProviderStatus.available_list(3)
258         r.should eq [@ps]
259       end
260     end
261     context 'DBに5件あって1ページの件数を2件に変えたとして' do
262       before do
263         @ps2 = FactoryGirl.create :provider_status
264         @pd2 = FactoryGirl.create :provider, :provider_status_id => @ps2.id, :name => "5"
265         @ps3 = FactoryGirl.create :provider_status
266         @pd3 = FactoryGirl.create :provider, :provider_status_id => @ps3.id, :name => "4"
267         @ps4 = FactoryGirl.create :provider_status
268         @pd4 = FactoryGirl.create :provider, :provider_status_id => @ps4.id, :name => "3"
269         @ps5 = FactoryGirl.create :provider_status
270         @pd5 = FactoryGirl.create :provider, :provider_status_id => @ps5.id, :name => "2"
271         ProviderStatus.stub(:default_page_size).and_return(2)
272       end
273       it '件数0は全件(5件)を返す' do
274         r = ProviderStatus.available_list 5, 0
275         r.should have(5).items 
276       end
277     end
278   end
279   describe '一覧取得オプションに於いて' do
280     it 'includeキーを含んでいる' do
281       r = ProviderStatus.list_opt
282       r.has_key?(:include).should be_true
283     end
284     it '1つの項目を含んでいる' do
285       r = ProviderStatus.list_opt[:include]
286       r.should have(1).items
287     end
288     it '貸手を含んでいる' do
289       r = ProviderStatus.list_opt[:include]
290       r.has_key?(:provider).should be_true
291     end
292   end
293   describe 'json一覧出力オプションに於いて' do
294     before do
295       @ps = FactoryGirl.create :provider_status
296       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id
297     end
298     it '貸手を含んでいる' do
299       r = ProviderStatus.list.to_json ProviderStatus.list_json_opt
300       j = JSON.parse r
301       i = j.first
302       i.has_key?('provider').should be_true
303     end
304   end
305   
306   describe '単体取得に於いて' do
307     before do
308       @ps = FactoryGirl.create :provider_status
309       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id
310     end
311     context 'つつがなく終わるとき' do
312       it '単体取得オプションを利用している' do
313         ProviderStatus.stub(:show_opt).with(any_args).and_return({})
314         ProviderStatus.should_receive(:show_opt).with(any_args).exactly(1)
315         r = ProviderStatus.show @ps.id, @admin
316       end
317       it '閲覧許可を問い合わせている' do
318         ProviderStatus.any_instance.stub(:visible?).with(any_args).and_return(true)
319         ProviderStatus.any_instance.should_receive(:visible?).with(any_args).exactly(1)
320         r = ProviderStatus.show @ps.id, @admin
321       end
322     end
323     it '指定の借受状況を返す' do
324       r = ProviderStatus.show @ps.id, @admin
325       r.should eq @ps
326     end
327     context '閲覧許可が出なかったとき' do
328       it '403Forbidden例外を返す' do
329         ProviderStatus.any_instance.stub(:visible?).and_return(false)
330         lambda{
331           ProviderStatus.show @ps.id, @admin
332         }.should raise_error(ActiveRecord::Forbidden)
333       end
334     end
335     context '存在しない借受状況を開こうとしたとき' do
336       it '404RecordNotFound例外を返す' do
337         lambda{
338           ProviderStatus.show 110, @admin
339         }.should raise_error(ActiveRecord::RecordNotFound)
340       end
341     end
342   end
343   
344   describe '編集取得に於いて' do
345     before do
346       @ps = FactoryGirl.create :provider_status
347       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id
348     end
349     context 'つつがなく終わるとき' do
350       it '単体取得オプションを利用している' do
351         ProviderStatus.stub(:show_opt).with(any_args).and_return({})
352         ProviderStatus.should_receive(:show_opt).with(any_args).exactly(1)
353         r = ProviderStatus.edit @ps.id, @admin
354       end
355       it '所持判定を問い合わせている' do
356         ProviderStatus.any_instance.stub(:own?).with(any_args).and_return(true)
357         ProviderStatus.any_instance.should_receive(:own?).with(any_args).exactly(1)
358         r = ProviderStatus.edit @ps.id, @admin
359       end
360     end
361     it '指定の借受状況を返す' do
362       ProviderStatus.any_instance.stub(:own?).and_return(true)
363       r = ProviderStatus.edit @ps.id, @admin
364       r.should eq @ps
365     end
366     context '権限がなかったとき' do
367       it '403Forbidden例外を返す' do
368         ProviderStatus.any_instance.stub(:own?).and_return(false)
369         lambda{
370           ProviderStatus.edit @ps.id, @admin
371         }.should raise_error(ActiveRecord::Forbidden)
372       end
373     end
374     context '存在しない借受状況を開こうとしたとき' do
375       it '404RecordNotFound例外を返す' do
376         lambda{
377           ProviderStatus.edit 110, @admin
378         }.should raise_error(ActiveRecord::RecordNotFound)
379       end
380     end
381   end
382   describe '単体取得オプションに於いて' do
383     it 'includeキーを含んでいる' do
384       r = ProviderStatus.show_opt
385       r.has_key?(:include).should be_true
386     end
387     it '1つの項目を含んでいる' do
388       r = ProviderStatus.show_opt[:include]
389       r.should have(1).items
390     end
391     it '貸手を含んでいる' do
392       r = ProviderStatus.show_opt[:include]
393       r.has_key?(:provider).should be_true
394     end
395   end
396   describe 'json単体出力オプションに於いて' do
397     before do
398       @ps = FactoryGirl.create :provider_status
399       @pd = FactoryGirl.create :provider, :provider_status_id => @ps.id
400     end
401     it '貸手を含んでいる' do
402       r = ProviderStatus.show(@ps.id, @admin).to_json ProviderStatus.show_json_opt
403       j = JSON.parse r
404       i = j
405       i.has_key?('provider').should be_true
406     end
407   end
408   
409 end