OSDN Git Service

t30354#:create mylist for rp
[pettanr/pettanr.git] / spec / models / speech_balloon_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #フキダシ
4
5 describe SpeechBalloon do
6   before do
7     @admin = FactoryGirl.create :admin
8     @user = FactoryGirl.create( :user_yas)
9     @author = FactoryGirl.create :author, :user_id => @user.id
10     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
11     @other_user = FactoryGirl.create( :user_yas)
12     @other_author = FactoryGirl.create :author, :user_id => @other_user.id
13     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id
14     @sp = FactoryGirl.create :system_picture
15     @lg = FactoryGirl.create :license_group
16     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
17     
18     @panel = FactoryGirl.create :panel, :author_id => @author.id
19     @speech_balloon_template = FactoryGirl.create :speech_balloon_template
20   end
21   
22   describe '検証に於いて' do
23     before do
24       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
25     end
26     
27     context 'オーソドックスなデータのとき' do
28       it '下限データが通る' do
29         @sb.classname = 'a'
30         @sb.z = 1
31         @sb.t = 0
32         @sb.should be_valid
33       end
34       it '上限データが通る' do
35         @sb.classname = 'a'*50
36         @sb.z = 99999
37         @sb.t = 99999
38         @sb.should be_valid
39       end
40     end
41     
42     context 'panel_idを検証するとき' do
43       #ネストの保存はnilを許可しなければならないので数値チェックだけ
44       it '数値でなければ失敗する' do
45         @sb.panel_id = 'a'
46         @sb.should_not be_valid
47       end
48     end
49     context 'speech_balloon_template_idを検証するとき' do
50       it 'nullなら失敗する' do
51         @sb.speech_balloon_template_id = nil
52         @sb.should_not be_valid
53       end
54       it '数値でなければ失敗する' do
55         @sb.speech_balloon_template_id = 'a'
56         @sb.should_not be_valid
57       end
58       it '存在するフキダシテンプレートでなければ失敗する' do
59         @sb.speech_balloon_template_id = 0
60         @sb.should_not be_valid
61       end
62     end
63     context 'classnameを検証するとき' do
64       it 'nullなら失敗する' do
65         @sb.classname = ''
66         @sb.should_not be_valid
67       end
68       it '51文字以上なら失敗する' do
69         @sb.classname = 'a'*51
70         @sb.should_not be_valid
71       end
72     end
73     context 'tを検証するとき' do
74       it 'nullなら失敗する' do
75         @sb.t = nil
76         @sb.should_not be_valid
77       end
78       it '数値でなければ失敗する' do
79         @sb.t = 'a'
80         @sb.should_not be_valid
81       end
82       it '負なら失敗する' do
83         @sb.t = -1
84         @sb.should_not be_valid
85       end
86     end
87     context 'settingsを検証するとき' do
88     end
89   end
90   
91   describe '閲覧許可に於いて' do
92     before do
93       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
94       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
95       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
96     end
97     context '検査対象がnil(ゲスト)のとき' do
98       context 'クローズドモードのとき' do
99         before do
100           MagicNumber['run_mode'] = 1
101         end
102         it '不許可を返す。' do
103           r = @sb.visible?(nil)
104           r.should be_false
105         end
106       end
107       context 'オープンモードのとき' do
108         before do
109           MagicNumber['run_mode'] = 0
110         end
111         it '公開されたコマのフキダシなら許可する' do
112           Panel.any_instance.stub(:publish?).with(any_args).and_return(true)
113           r = @sb.visible?(nil)
114           r.should be_true
115         end
116         it 'れ以外なら不許可を返す' do
117           Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
118           r = @sb.visible?(nil)
119           r.should be_false
120         end
121       end
122     end
123     context '検査対象が作家のとき' do
124       it '公開されたコマのフキダシなら許可する' do
125         Panel.any_instance.stub(:publish?).with(any_args).and_return(true)
126         r = @sb.visible?(@author)
127         r.should be_true
128       end
129       it 'れ以外なら不許可を返す' do
130         Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
131         r = @sb.visible?(@author)
132         r.should be_false
133       end
134     end
135     context '検査対象が管理者のとき' do
136       it '許可を返す。' do
137         Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
138         r = @sb.visible?(@admin)
139         r.should be_true
140       end
141     end
142     context '検査対象がそれ以外のとき' do
143       it '不許可を返す。' do
144         r = @sb.visible?(1)
145         r.should be_false
146       end
147     end
148   end
149   describe '一覧取得に於いて' do
150     before do
151       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
152       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
153       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
154     end
155     context 'page補正について' do
156       it '文字列から数値に変換される' do
157         SpeechBalloon.page('8').should eq 8
158       end
159       it 'nilの場合は1になる' do
160         SpeechBalloon.page().should eq 1
161       end
162       it '0以下の場合は1になる' do
163         SpeechBalloon.page('0').should eq 1
164       end
165     end
166     context 'page_size補正について' do
167       it '文字列から数値に変換される' do
168         SpeechBalloon.page_size('7').should eq 7
169       end
170       it 'nilの場合はSpeechBalloon.default_page_sizeになる' do
171         SpeechBalloon.page_size().should eq SpeechBalloon.default_page_size
172       end
173       it '0以下の場合はSpeechBalloon.default_page_sizeになる' do
174         SpeechBalloon.page_size('0').should eq SpeechBalloon.default_page_size
175       end
176       it 'SpeechBalloon.max_page_sizeを超えた場合はSpeechBalloon.max_page_sizeになる' do
177         SpeechBalloon.page_size('1000').should eq SpeechBalloon.max_page_size
178       end
179     end
180     context 'つつがなく終わるとき' do
181       it '一覧取得オプションを利用している' do
182         SpeechBalloon.stub(:list_opt).with(any_args).and_return({:include => :panel})
183         SpeechBalloon.should_receive(:list_opt).with(any_args).exactly(1)
184         r = SpeechBalloon.list
185       end
186     end
187     it 'リストを返す' do
188       r = SpeechBalloon.list
189       r.should eq [@sb]
190     end
191     it '時系列で並んでいる' do
192       #公開されたコマのフキダシは(他人のフキダシであっても)含んでいる
193       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
194       npl = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100
195       r = SpeechBalloon.list
196       r.should eq [npl, @sb]
197     end
198     it '非公開のコマのフキダシは自分のフキダシであっても含まない' do
199       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
200       npl = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100
201       pl = SpeechBalloon.list
202       pl.should eq [@sb]
203     end
204     context 'DBに5件あって1ページの件数を2件に変えたとして' do
205       before do
206         @sb2 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 1, :updated_at => Time.now + 100
207         @sb3 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 2, :updated_at => Time.now + 200
208         @sb4 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 3, :updated_at => Time.now + 300
209         @sb5 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 4, :updated_at => Time.now + 400
210         SpeechBalloon.stub(:default_page_size).and_return(2)
211       end
212       it '通常は2件を返す' do
213         pl = SpeechBalloon.list
214         pl.should have(2).items 
215       end
216       it 'page=1なら末尾2件を返す' do
217         #時系列で並んでいる
218         pl = SpeechBalloon.list(1)
219         pl.should eq [@sb5, @sb4]
220       end
221       it 'page=2なら中間2件を返す' do
222         pl = SpeechBalloon.list(2)
223         pl.should eq [@sb3, @sb2]
224       end
225       it 'page=3なら先頭1件を返す' do
226         pl = SpeechBalloon.list(3)
227         pl.should eq [@sb]
228       end
229     end
230     context 'DBに5件あって1ページの件数を0件に変えたとして' do
231       before do
232         @sb2 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 1, :updated_at => Time.now + 100
233         @sb3 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 2, :updated_at => Time.now + 200
234         @sb4 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 3, :updated_at => Time.now + 300
235         @sb5 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 4, :updated_at => Time.now + 400
236         SpeechBalloon.stub(:default_page_size).and_return(2)
237       end
238       it '通常は全件(5件)を返す' do
239         r = SpeechBalloon.list 5, 0
240         r.should have(5).items 
241       end
242     end
243   end
244   describe '一覧取得オプションに於いて' do
245     it 'includeキーを含んでいる' do
246       r = SpeechBalloon.list_opt
247       r.has_key?(:include).should be_true
248     end
249     it '4つの項目を含んでいる' do
250       r = SpeechBalloon.list_opt[:include]
251       r.should have(4).items
252     end
253     it 'コマを含んでいる' do
254       r = SpeechBalloon.list_opt[:include]
255       r.has_key?(:panel).should be_true
256     end
257       it 'コマは作家を含んでいる' do
258         r = SpeechBalloon.list_opt[:include]
259         r[:panel].has_key?(:author).should be_true
260       end
261     it 'フキダシ枠を含んでいる' do
262       r = SpeechBalloon.list_opt[:include]
263       r.has_key?(:balloons).should be_true
264     end
265     it 'セリフを含んでいる' do
266       r = SpeechBalloon.list_opt[:include]
267       r.has_key?(:speeches).should be_true
268     end
269     it 'フキダシテンプレートを含んでいる' do
270       r = SpeechBalloon.list_opt[:include]
271       r.has_key?(:speech_balloon_template).should be_true
272     end
273   end
274   describe 'json一覧出力オプションに於いて' do
275     before do
276       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
277       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
278       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
279       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
280     end
281     it 'コマを含んでいる' do
282       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
283       j = JSON.parse r
284       i = j.first
285       i.has_key?('panel').should be_true
286     end
287       it 'コマは作家を含んでいる' do
288         r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
289         j = JSON.parse r
290         i = j.first
291         s = i['panel']
292         s.has_key?('author').should be_true
293       end
294     it 'フキダシ枠を含んでいる' do
295       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
296       j = JSON.parse r
297       i = j.first
298       i.has_key?('balloons').should be_true
299     end
300     it 'セリフを含んでいる' do
301       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
302       j = JSON.parse r
303       i = j.first
304       i.has_key?('speeches').should be_true
305     end
306     it 'フキダシテンプレートを含んでいる' do
307       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
308       j = JSON.parse r
309       i = j.first
310       i.has_key?('speech_balloon_template').should be_true
311     end
312   end
313   
314   describe '単体取得に於いて' do
315     before do
316       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
317       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
318       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
319     end
320     context 'つつがなく終わるとき' do
321       it '単体取得オプションを利用している' do
322         SpeechBalloon.stub(:show_opt).with(any_args).and_return({:include => :panel})
323         SpeechBalloon.should_receive(:show_opt).with(any_args).exactly(1)
324         r = SpeechBalloon.show @sb.id, @author
325       end
326       it '閲覧許可を問い合わせている' do
327         SpeechBalloon.any_instance.stub(:visible?).with(any_args).and_return(true)
328         SpeechBalloon.any_instance.should_receive(:visible?).with(any_args).exactly(1)
329         r = SpeechBalloon.show @sb.id, @author
330       end
331     end
332     it '指定のフキダシを返す' do
333       SpeechBalloon.any_instance.stub(:visible?).and_return(true)
334       pl = SpeechBalloon.show @sb.id, @author
335       pl.should eq @sb
336     end
337     context '閲覧許可が出なかったとき' do
338       it '403Forbidden例外を返す' do
339         SpeechBalloon.any_instance.stub(:visible?).and_return(false)
340         lambda{
341           SpeechBalloon.show @sb.id, @author
342         }.should raise_error(ActiveRecord::Forbidden)
343       end
344     end
345     context '存在しないフキダシを開こうとしたとき' do
346       it '404RecordNotFound例外を返す' do
347         lambda{
348           SpeechBalloon.show 110, @author
349         }.should raise_error(ActiveRecord::RecordNotFound)
350       end
351     end
352   end
353   describe '単体取得オプションに於いて' do
354     it 'includeキーを含んでいる' do
355       r = SpeechBalloon.show_opt
356       r.has_key?(:include).should be_true
357     end
358     it '4つの項目を含んでいる' do
359       r = SpeechBalloon.show_opt[:include]
360       r.should have(4).items
361     end
362     it 'コマを含んでいる' do
363       r = SpeechBalloon.show_opt[:include]
364       r.has_key?(:panel).should be_true
365     end
366       it 'コマは作家を含んでいる' do
367         r = SpeechBalloon.show_opt[:include]
368         r[:panel].has_key?(:author).should be_true
369       end
370     it 'フキダシ枠を含んでいる' do
371       r = SpeechBalloon.show_opt[:include]
372       r.has_key?(:balloons).should be_true
373     end
374     it 'セリフを含んでいる' do
375       r = SpeechBalloon.show_opt[:include]
376       r.has_key?(:speeches).should be_true
377     end
378     it 'フキダシテンプレートを含んでいる' do
379       r = SpeechBalloon.show_opt[:include]
380       r.has_key?(:speech_balloon_template).should be_true
381     end
382   end
383   describe 'json単体出力オプションに於いて' do
384     before do
385       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
386       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
387       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
388       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
389     end
390     it 'コマを含んでいる' do
391       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
392       j = JSON.parse r
393       i = j
394       i.has_key?('panel').should be_true
395     end
396       it 'コマは作家を含んでいる' do
397         r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
398         j = JSON.parse r
399         i = j
400         s = i['panel']
401         s.has_key?('author').should be_true
402       end
403     it 'フキダシ枠を含んでいる' do
404       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
405       j = JSON.parse r
406       i = j
407       i.has_key?('balloons').should be_true
408     end
409     it 'セリフを含んでいる' do
410       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
411       j = JSON.parse r
412       i = j
413       i.has_key?('speeches').should be_true
414     end
415     it 'フキダシテンプレートを含んでいる' do
416       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
417       j = JSON.parse r
418       i = j
419       i.has_key?('speech_balloon_template').should be_true
420     end
421   end
422 end