OSDN Git Service

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