OSDN Git Service

t#31535::speech_balloon has one :speech and balloon
[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.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
94     end
95     
96     context 'classnameを検証するとき' do
97       it 'Shift JISなら失敗する' do
98         @sb.classname = "\x83G\x83r\x83]\x83D"
99         lambda{
100           @sb.valid_encode
101         }.should raise_error(Pettanr::BadRequest)
102       end
103     end
104     
105     context 'settingsを検証するとき' do
106       it 'Shift JISなら失敗する' do
107         @sb.settings = "\x83G\x83r\x83]\x83D"
108         lambda{
109           @sb.valid_encode
110         }.should raise_error(Pettanr::BadRequest)
111       end
112     end
113     
114     context 'captionを検証するとき' do
115       it 'Shift JISなら失敗する' do
116         @sb.caption = "\x83G\x83r\x83]\x83D"
117         lambda{
118           @sb.valid_encode
119         }.should raise_error(Pettanr::BadRequest)
120       end
121     end
122     
123   end
124   
125   describe '閲覧許可に於いて' do
126     before do
127       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
128     end
129     context 'オープンモードのとき' do
130       before do
131         MagicNumber['run_mode'] = 0
132       end
133       it '自身にゲスト用ロールチェックを問い合わせしている' do
134         SpeechBalloon.any_instance.stub(:guest_role_check).and_return(true)
135         SpeechBalloon.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)
136         r = @sb.visible?([@author])
137       end
138       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do
139         SpeechBalloon.any_instance.stub(:guest_role_check).and_return(false)
140         r = @sb.visible?([@author])
141         r.should be_false
142       end
143     end
144     context 'クローズドモードのとき' do
145       before do
146         MagicNumber['run_mode'] = 1
147       end
148       it '自身に読者用ロールチェックを問い合わせしている' do
149         SpeechBalloon.any_instance.stub(:reader_role_check).and_return(true)
150         SpeechBalloon.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)
151         r = @sb.visible?([@author])
152       end
153       it '読者用ロールチェックが失敗したとき、falseを返す' do
154         SpeechBalloon.any_instance.stub(:reader_role_check).and_return(false)
155         r = @sb.visible?([@author])
156         r.should be_false
157       end
158     end
159     context '事前チェックする' do
160       before do
161         MagicNumber['run_mode'] = 1
162         SpeechBalloon.any_instance.stub(:reader_role_check).and_return(true)
163       end
164       it '自身のコマに所持判定を問い合わせしている' do
165         Panel.any_instance.stub(:own?).and_return(true)
166         Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)
167         r = @sb.visible?([@author])
168       end
169       it '自身のコマに閲覧許可を問い合わせしている' do
170         Panel.any_instance.stub(:own?).and_return(false)
171         Panel.any_instance.stub(:visible?).and_return(true)
172         Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)
173         r = @sb.visible?([@author])
174       end
175     end
176     context 'つつがなく終わるとき' do
177       before do
178         MagicNumber['run_mode'] = 1
179         Panel.any_instance.stub(:reader_role_check).and_return(true)
180       end
181       it '自分のコマのフキダシなら許可する' do
182         Panel.any_instance.stub(:own?).and_return(true)
183         Panel.any_instance.stub(:visible?).and_return(false)
184         r = @sb.visible?([@author])
185         r.should be_true
186       end
187       it '他人の非公開コマのフキダシなら許可しない' do
188         Panel.any_instance.stub(:own?).and_return(false)
189         Panel.any_instance.stub(:visible?).and_return(false)
190         r = @sb.visible?([@author])
191         r.should be_false
192       end
193       it '他人のコマのフキダシでも公開なら許可する' do
194         Panel.any_instance.stub(:own?).and_return(false)
195         Panel.any_instance.stub(:visible?).and_return(true)
196         r = @sb.visible?([@author])
197         r.should be_true
198       end
199     end
200   end
201   
202   describe '一覧取得に於いて' do
203     before do
204       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
205       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
206       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
207     end
208     context 'page補正について' do
209       it '文字列から数値に変換される' do
210         SpeechBalloon.page('8').should eq 8
211       end
212       it 'nilの場合は1になる' do
213         SpeechBalloon.page().should eq 1
214       end
215       it '0以下の場合は1になる' do
216         SpeechBalloon.page('0').should eq 1
217       end
218     end
219     context 'page_size補正について' do
220       it '文字列から数値に変換される' do
221         SpeechBalloon.page_size('7').should eq 7
222       end
223       it 'nilの場合はSpeechBalloon.default_page_sizeになる' do
224         SpeechBalloon.page_size().should eq SpeechBalloon.default_page_size
225       end
226       it '0以下の場合はSpeechBalloon.default_page_sizeになる' do
227         SpeechBalloon.page_size('0').should eq SpeechBalloon.default_page_size
228       end
229       it 'SpeechBalloon.max_page_sizeを超えた場合はSpeechBalloon.max_page_sizeになる' do
230         SpeechBalloon.page_size('1000').should eq SpeechBalloon.max_page_size
231       end
232     end
233     context 'つつがなく終わるとき' do
234       it '一覧取得オプションを利用している' do
235         SpeechBalloon.stub(:list_opt).with(any_args).and_return({:include => :panel})
236         SpeechBalloon.should_receive(:list_opt).with(any_args).exactly(1)
237         r = SpeechBalloon.list
238       end
239     end
240     it 'リストを返す' do
241       r = SpeechBalloon.list
242       r.should eq [@sb]
243     end
244     it '時系列で並んでいる' do
245       #公開されたコマのフキダシは(他人のフキダシであっても)含んでいる
246       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
247       npl = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100
248       r = SpeechBalloon.list
249       r.should eq [npl, @sb]
250     end
251     it '非公開のコマのフキダシは自分のフキダシであっても含まない' do
252       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
253       npl = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100
254       pl = SpeechBalloon.list
255       pl.should eq [@sb]
256     end
257     context 'DBに5件あって1ページの件数を2件に変えたとして' do
258       before do
259         @sb2 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 1, :updated_at => Time.now + 100
260         @sb3 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 2, :updated_at => Time.now + 200
261         @sb4 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 3, :updated_at => Time.now + 300
262         @sb5 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 4, :updated_at => Time.now + 400
263         SpeechBalloon.stub(:default_page_size).and_return(2)
264       end
265       it '通常は2件を返す' do
266         pl = SpeechBalloon.list
267         pl.should have(2).items 
268       end
269       it 'page=1なら末尾2件を返す' do
270         #時系列で並んでいる
271         pl = SpeechBalloon.list(1)
272         pl.should eq [@sb5, @sb4]
273       end
274       it 'page=2なら中間2件を返す' do
275         pl = SpeechBalloon.list(2)
276         pl.should eq [@sb3, @sb2]
277       end
278       it 'page=3なら先頭1件を返す' do
279         pl = SpeechBalloon.list(3)
280         pl.should eq [@sb]
281       end
282     end
283     context 'DBに5件あって1ページの件数を0件に変えたとして' do
284       before do
285         @sb2 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 1, :updated_at => Time.now + 100
286         @sb3 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 2, :updated_at => Time.now + 200
287         @sb4 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 3, :updated_at => Time.now + 300
288         @sb5 = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id, :t => 4, :updated_at => Time.now + 400
289         SpeechBalloon.stub(:default_page_size).and_return(2)
290       end
291       it '通常は全件(5件)を返す' do
292         r = SpeechBalloon.list 5, 0
293         r.should have(5).items 
294       end
295     end
296   end
297   describe '一覧取得オプションに於いて' do
298     it 'includeキーを含んでいる' do
299       r = SpeechBalloon.list_opt
300       r.has_key?(:include).should be_true
301     end
302     it '4つの項目を含んでいる' do
303       r = SpeechBalloon.list_opt[:include]
304       r.should have(4).items
305     end
306     it 'コマを含んでいる' do
307       r = SpeechBalloon.list_opt[:include]
308       r.has_key?(:panel).should be_true
309     end
310       it 'コマは作家を含んでいる' do
311         r = SpeechBalloon.list_opt[:include]
312         r[:panel].has_key?(:author).should be_true
313       end
314     it 'フキダシ枠を含んでいる' do
315       r = SpeechBalloon.list_opt[:include]
316       r.has_key?(:balloon).should be_true
317     end
318     it 'セリフを含んでいる' do
319       r = SpeechBalloon.list_opt[:include]
320       r.has_key?(:speech).should be_true
321     end
322     it 'フキダシテンプレートを含んでいる' do
323       r = SpeechBalloon.list_opt[:include]
324       r.has_key?(:speech_balloon_template).should be_true
325     end
326   end
327   describe 'json一覧出力オプションに於いて' do
328     before do
329       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
330       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
331       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
332       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
333     end
334     it 'コマを含んでいる' do
335       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
336       j = JSON.parse r
337       i = j.first
338       i.has_key?('panel').should be_true
339     end
340       it 'コマは作家を含んでいる' do
341         r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
342         j = JSON.parse r
343         i = j.first
344         s = i['panel']
345         s.has_key?('author').should be_true
346       end
347     it 'フキダシ枠を含んでいる' do
348       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
349       j = JSON.parse r
350       i = j.first
351       i.has_key?('balloon').should be_true
352     end
353     it 'セリフを含んでいる' do
354       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
355       j = JSON.parse r
356       i = j.first
357       i.has_key?('speech').should be_true
358     end
359     it 'フキダシテンプレートを含んでいる' do
360       r = SpeechBalloon.list.to_json SpeechBalloon.list_json_opt
361       j = JSON.parse r
362       i = j.first
363       i.has_key?('speech_balloon_template').should be_true
364     end
365   end
366   
367   describe '単体取得に於いて' do
368     before do
369       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
370       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
371       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
372     end
373     context 'つつがなく終わるとき' do
374       it '単体取得オプションを利用している' do
375         SpeechBalloon.stub(:show_opt).with(any_args).and_return({:include => :panel})
376         SpeechBalloon.should_receive(:show_opt).with(any_args).exactly(1)
377         r = SpeechBalloon.show @sb.id, @author
378       end
379       it '閲覧許可を問い合わせている' do
380         SpeechBalloon.any_instance.stub(:visible?).with(any_args).and_return(true)
381         SpeechBalloon.any_instance.should_receive(:visible?).with(any_args).exactly(1)
382         r = SpeechBalloon.show @sb.id, @author
383       end
384     end
385     it '指定のフキダシを返す' do
386       SpeechBalloon.any_instance.stub(:visible?).and_return(true)
387       pl = SpeechBalloon.show @sb.id, @author
388       pl.should eq @sb
389     end
390     context '閲覧許可が出なかったとき' do
391       it '403Forbidden例外を返す' do
392         SpeechBalloon.any_instance.stub(:visible?).and_return(false)
393         lambda{
394           SpeechBalloon.show @sb.id, @author
395         }.should raise_error(ActiveRecord::Forbidden)
396       end
397     end
398     context '存在しないフキダシを開こうとしたとき' do
399       it '404RecordNotFound例外を返す' do
400         lambda{
401           SpeechBalloon.show 110, @author
402         }.should raise_error(ActiveRecord::RecordNotFound)
403       end
404     end
405   end
406   describe '単体取得オプションに於いて' do
407     it 'includeキーを含んでいる' do
408       r = SpeechBalloon.show_opt
409       r.has_key?(:include).should be_true
410     end
411     it '4つの項目を含んでいる' do
412       r = SpeechBalloon.show_opt[:include]
413       r.should have(4).items
414     end
415     it 'コマを含んでいる' do
416       r = SpeechBalloon.show_opt[:include]
417       r.has_key?(:panel).should be_true
418     end
419       it 'コマは作家を含んでいる' do
420         r = SpeechBalloon.show_opt[:include]
421         r[:panel].has_key?(:author).should be_true
422       end
423     it 'フキダシ枠を含んでいる' do
424       r = SpeechBalloon.show_opt[:include]
425       r.has_key?(:balloon).should be_true
426     end
427     it 'セリフを含んでいる' do
428       r = SpeechBalloon.show_opt[:include]
429       r.has_key?(:speech).should be_true
430     end
431     it 'フキダシテンプレートを含んでいる' do
432       r = SpeechBalloon.show_opt[:include]
433       r.has_key?(:speech_balloon_template).should be_true
434     end
435   end
436   describe 'json単体出力オプションに於いて' do
437     before do
438       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
439       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
440       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id
441       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id
442     end
443     it 'コマを含んでいる' do
444       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
445       j = JSON.parse r
446       i = j
447       i.has_key?('panel').should be_true
448     end
449       it 'コマは作家を含んでいる' do
450         r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
451         j = JSON.parse r
452         i = j
453         s = i['panel']
454         s.has_key?('author').should be_true
455       end
456     it 'フキダシ枠を含んでいる' do
457       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
458       j = JSON.parse r
459       i = j
460       i.has_key?('balloon').should be_true
461     end
462     it 'セリフを含んでいる' do
463       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
464       j = JSON.parse r
465       i = j
466       i.has_key?('speech').should be_true
467     end
468     it 'フキダシテンプレートを含んでいる' do
469       r = SpeechBalloon.show(@sb.id, @author).to_json SpeechBalloon.show_json_opt
470       j = JSON.parse r
471       i = j
472       i.has_key?('speech_balloon_template').should be_true
473     end
474   end
475 end