OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / spec / models / balloon_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 require 'spec_helper'\r
3 #フキダシ枠\r
4 describe Balloon do\r
5   before do\r
6     @admin = FactoryGirl.create :admin\r
7     @user = FactoryGirl.create( :user_yas)\r
8     @author = FactoryGirl.create :author, :user_id => @user.id\r
9     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id\r
10     @other_user = FactoryGirl.create( :user_yas)\r
11     @other_author = FactoryGirl.create :author, :user_id => @other_user.id\r
12     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id\r
13     @sp = FactoryGirl.create :system_picture\r
14     @lg = FactoryGirl.create :license_group\r
15     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id\r
16     \r
17     @speech_balloon_template = FactoryGirl.create :speech_balloon_template\r
18     @panel = FactoryGirl.create :panel, :author_id => @author.id\r
19   end\r
20   \r
21   describe '検証に於いて' do\r
22     before do\r
23       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
24       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
25       @balloon = FactoryGirl.build :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
26     end\r
27     context 'オーソドックスなデータのとき' do\r
28       it '下限データが通る' do\r
29         @balloon.x = 0\r
30         @balloon.y = 0\r
31         @balloon.width = 1\r
32         @balloon.height = 1\r
33         @balloon.r = 0\r
34         @balloon.should be_valid\r
35       end\r
36       it '上限データが通る' do\r
37         @balloon.x = 99999\r
38         @balloon.y = 99999\r
39         @balloon.width = 99999\r
40         @balloon.height = 99999\r
41         @balloon.r = 99999\r
42         @balloon.should be_valid\r
43       end\r
44     end\r
45     \r
46     context 'speech_balloon_idを検証するとき' do\r
47       #ネストの保存はnilを許可しなければならないので数値チェックだけ\r
48       it 'テストデータの確認' do\r
49         @balloon.speech_balloon_id = @sb.id\r
50         @balloon.should be_valid\r
51       end\r
52       it '数値でなければ失敗する' do\r
53         @balloon.speech_balloon_id = 'a'\r
54         @balloon.should_not be_valid\r
55       end\r
56     end\r
57     context 'system_picture_idを検証するとき' do\r
58       it 'nullなら失敗する' do\r
59         @balloon.system_picture_id = nil\r
60         @balloon.should_not be_valid\r
61       end\r
62       it '数値でなければ失敗する' do\r
63         @balloon.system_picture_id = 'a'\r
64         @balloon.should_not be_valid\r
65       end\r
66       it '存在するシステム画像でなければ失敗する' do\r
67         @balloon.system_picture_id = 0\r
68         @balloon.should_not be_valid\r
69       end\r
70     end\r
71     context 'xを検証するとき' do\r
72       it 'nullなら失敗する' do\r
73         @balloon.x = nil\r
74         @balloon.should_not be_valid\r
75       end\r
76       it '数値でなければ失敗する' do\r
77         @balloon.x = 'a'\r
78         @balloon.should_not be_valid\r
79       end\r
80       it '0なら通る' do\r
81         @balloon.x = '0'\r
82         @balloon.should be_valid\r
83       end\r
84       it '負でも通る' do\r
85         @balloon.x = -1\r
86         @balloon.should be_valid\r
87       end\r
88     end\r
89     context 'yを検証するとき' do\r
90       it 'nullなら失敗する' do\r
91         @balloon.y = nil\r
92         @balloon.should_not be_valid\r
93       end\r
94       it '数値でなければ失敗する' do\r
95         @balloon.y = 'a'\r
96         @balloon.should_not be_valid\r
97       end\r
98       it '0なら通る' do\r
99         @balloon.y = '0'\r
100         @balloon.should be_valid\r
101       end\r
102       it '負でも通る' do\r
103         @balloon.y = -1\r
104         @balloon.should be_valid\r
105       end\r
106     end\r
107     context 'widthを検証するとき' do\r
108       it 'nullなら失敗する' do\r
109         @balloon.width = nil\r
110         @balloon.should_not be_valid\r
111       end\r
112       it '数値でなければ失敗する' do\r
113         @balloon.width = 'a'\r
114         @balloon.should_not be_valid\r
115       end\r
116       it '0なら失敗する' do\r
117         @balloon.width = '0'\r
118         @balloon.should_not be_valid\r
119       end\r
120       it '負でも失敗する' do\r
121         @balloon.width = -1\r
122         @balloon.should_not be_valid\r
123       end\r
124     end\r
125     context 'heightを検証するとき' do\r
126       it 'nullなら失敗する' do\r
127         @balloon.height = nil\r
128         @balloon.should_not be_valid\r
129       end\r
130       it '数値でなければ失敗する' do\r
131         @balloon.height = 'a'\r
132         @balloon.should_not be_valid\r
133       end\r
134       it '0なら失敗する' do\r
135         @balloon.height = '0'\r
136         @balloon.should_not be_valid\r
137       end\r
138       it '負でも失敗する' do\r
139         @balloon.height = -1\r
140         @balloon.should_not be_valid\r
141       end\r
142     end\r
143     context 'rを検証するとき' do\r
144       it 'nullなら失敗する' do\r
145         @balloon.r = nil\r
146         @balloon.should_not be_valid\r
147       end\r
148       it '数値でなければ失敗する' do\r
149         @balloon.r = 'a'\r
150         @balloon.should_not be_valid\r
151       end\r
152       it '0なら通る' do\r
153         @balloon.r = '0'\r
154         @balloon.should be_valid\r
155       end\r
156       it '負でも通る' do\r
157         @balloon.r = -1\r
158         @balloon.should be_valid\r
159       end\r
160     end\r
161     context 'settingsを検証するとき' do\r
162     end\r
163   end\r
164   \r
165   describe '文字コード検証に於いて' do\r
166     before do\r
167       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
168       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
169       @balloon = FactoryGirl.build :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
170     end\r
171     \r
172     context 'settingsを検証するとき' do\r
173       it 'Shift JISなら失敗する' do\r
174         @balloon.settings = "\x83G\x83r\x83]\x83D"\r
175         lambda{\r
176           @balloon.valid_encode\r
177         }.should raise_error(Pettanr::BadRequest)\r
178       end\r
179     end\r
180   end\r
181   \r
182   describe '閲覧許可に於いて' do\r
183     before do\r
184       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
185       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
186       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
187     end\r
188     context 'オープンモードのとき' do\r
189       before do\r
190         MagicNumber['run_mode'] = 0\r
191       end\r
192       it '自身にゲスト用ロールチェックを問い合わせしている' do\r
193         Balloon.any_instance.stub(:guest_role_check).and_return(true)\r
194         Balloon.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)\r
195         r = @balloon.visible?([@author])\r
196       end\r
197       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do\r
198         Balloon.any_instance.stub(:guest_role_check).and_return(false)\r
199         r = @balloon.visible?([@author])\r
200         r.should be_false\r
201       end\r
202     end\r
203     context 'クローズドモードのとき' do\r
204       before do\r
205         MagicNumber['run_mode'] = 1\r
206       end\r
207       it '自身に読者用ロールチェックを問い合わせしている' do\r
208         Balloon.any_instance.stub(:reader_role_check).and_return(true)\r
209         Balloon.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)\r
210         r = @balloon.visible?([@author])\r
211       end\r
212       it '読者用ロールチェックが失敗したとき、falseを返す' do\r
213         Balloon.any_instance.stub(:reader_role_check).and_return(false)\r
214         r = @balloon.visible?([@author])\r
215         r.should be_false\r
216       end\r
217     end\r
218     context '事前チェックする' do\r
219       before do\r
220         MagicNumber['run_mode'] = 1\r
221         Balloon.any_instance.stub(:reader_role_check).and_return(true)\r
222       end\r
223       it '自身のコマに所持判定を問い合わせしている' do\r
224         Panel.any_instance.stub(:own?).and_return(true)\r
225         Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)\r
226         r = @balloon.visible?([@author])\r
227       end\r
228       it '自身のコマに閲覧許可を問い合わせしている' do\r
229         Panel.any_instance.stub(:own?).and_return(false)\r
230         Panel.any_instance.stub(:visible?).and_return(true)\r
231         Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
232         r = @balloon.visible?([@author])\r
233       end\r
234     end\r
235     context 'つつがなく終わるとき' do\r
236       before do\r
237         MagicNumber['run_mode'] = 1\r
238         Panel.any_instance.stub(:reader_role_check).and_return(true)\r
239       end\r
240       it '自分のコマのコマ絵なら許可する' do\r
241         Panel.any_instance.stub(:own?).and_return(true)\r
242         Panel.any_instance.stub(:visible?).and_return(false)\r
243         r = @balloon.visible?([@author])\r
244         r.should be_true\r
245       end\r
246       it '他人の非公開コマのコマ絵なら許可しない' do\r
247         Panel.any_instance.stub(:own?).and_return(false)\r
248         Panel.any_instance.stub(:visible?).and_return(false)\r
249         r = @balloon.visible?([@author])\r
250         r.should be_false\r
251       end\r
252       it '他人のコマのコマ絵でも公開なら許可する' do\r
253         Panel.any_instance.stub(:own?).and_return(false)\r
254         Panel.any_instance.stub(:visible?).and_return(true)\r
255         r = @balloon.visible?([@author])\r
256         r.should be_true\r
257       end\r
258     end\r
259   end\r
260   \r
261   describe '一覧取得に於いて' do\r
262     before do\r
263       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
264       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
265       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
266     end\r
267     context 'page補正について' do\r
268       it '文字列から数値に変換される' do\r
269         Balloon.page('8').should eq 8\r
270       end\r
271       it 'nilの場合は1になる' do\r
272         Balloon.page().should eq 1\r
273       end\r
274       it '0以下の場合は1になる' do\r
275         Balloon.page('0').should eq 1\r
276       end\r
277     end\r
278     context 'page_size補正について' do\r
279       it '文字列から数値に変換される' do\r
280         Balloon.page_size('7').should eq 7\r
281       end\r
282       it 'nilの場合はBalloon.default_page_sizeになる' do\r
283         Balloon.page_size().should eq Balloon.default_page_size\r
284       end\r
285       it '0以下の場合はBalloon.default_page_sizeになる' do\r
286         Balloon.page_size('0').should eq Balloon.default_page_size\r
287       end\r
288       it 'Balloon.max_page_sizeを超えた場合はBalloon.max_page_sizeになる' do\r
289         Balloon.page_size('1000').should eq Balloon.max_page_size\r
290       end\r
291     end\r
292     context 'つつがなく終わるとき' do\r
293       it '一覧取得オプションを利用している' do\r
294         Balloon.stub(:list_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
295         Balloon.should_receive(:list_opt).with(any_args).exactly(1)\r
296         r = Balloon.list\r
297       end\r
298     end\r
299     it 'リストを返す' do\r
300       r = Balloon.list\r
301       r.should eq [@balloon]\r
302     end\r
303     it '時系列で並んでいる' do\r
304       #公開されたコマのフキダシ枠は(他人のフキダシ枠であっても)含んでいる\r
305       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1\r
306       nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
307       npl = FactoryGirl.create :balloon, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
308       r = Balloon.list\r
309       r.should eq [npl, @balloon]\r
310     end\r
311     it '非公開のコマのフキダシ枠は自分のフキダシ枠であっても含まない' do\r
312       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0\r
313       nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
314       npl = FactoryGirl.create :balloon, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
315       pl = Balloon.list\r
316       pl.should eq [@balloon]\r
317     end\r
318     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
319       before do\r
320         @balloon2 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 100\r
321         @balloon3 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 200\r
322         @balloon4 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 300\r
323         @balloon5 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 400\r
324         Balloon.stub(:default_page_size).and_return(2)\r
325       end\r
326       it '通常は2件を返す' do\r
327         pl = Balloon.list\r
328         pl.should have(2).items \r
329       end\r
330       it 'page=1なら末尾2件を返す' do\r
331         #時系列で並んでいる\r
332         pl = Balloon.list(1)\r
333         pl.should eq [@balloon5, @balloon4]\r
334       end\r
335       it 'page=2なら中間2件を返す' do\r
336         pl = Balloon.list(2)\r
337         pl.should eq [@balloon3, @balloon2]\r
338       end\r
339       it 'page=3なら先頭1件を返す' do\r
340         pl = Balloon.list(3)\r
341         pl.should eq [@balloon]\r
342       end\r
343     end\r
344     context 'DBに5件あって1ページの件数を0件に変えたとして' do\r
345       before do\r
346         @balloon2 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 100\r
347         @balloon3 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 200\r
348         @balloon4 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 300\r
349         @balloon5 = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :updated_at => Time.now + 400\r
350         Balloon.stub(:default_page_size).and_return(2)\r
351       end\r
352       it '通常は全件(5件)を返す' do\r
353         r = Balloon.list 5, 0\r
354         r.should have(5).items \r
355       end\r
356     end\r
357   end\r
358   describe '一覧取得オプションに於いて' do\r
359     it 'includeキーを含んでいる' do\r
360       r = Balloon.list_opt\r
361       r.has_key?(:include).should be_true\r
362     end\r
363     it '1つの項目を含んでいる' do\r
364       r = Balloon.list_opt[:include]\r
365       r.should have(1).items\r
366     end\r
367     it 'フキダシを含んでいる' do\r
368       r = Balloon.list_opt[:include]\r
369       r.has_key?(:speech_balloon).should be_true\r
370     end\r
371       it 'フキダシはコマを含んでいる' do\r
372         r = Balloon.list_opt[:include]\r
373         r[:speech_balloon].has_key?(:panel).should be_true\r
374       end\r
375         it 'コマは作家を含んでいる' do\r
376           r = Balloon.list_opt[:include]\r
377           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
378         end\r
379       it 'フキダシはセリフを含んでいる' do\r
380         r = Balloon.list_opt[:include]\r
381         r[:speech_balloon].has_key?(:speech).should be_true\r
382       end\r
383       it 'フキダシはフキダシテンプレートを含んでいる' do\r
384         r = Balloon.list_opt[:include]\r
385         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
386       end\r
387   end\r
388   describe 'json一覧出力オプションに於いて' do\r
389     before do\r
390       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
391       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
392       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
393     end\r
394     it 'フキダシを含んでいる' do\r
395       r = Balloon.list.to_json Balloon.list_json_opt\r
396       j = JSON.parse r\r
397       i = j.first\r
398       i.has_key?('speech_balloon').should be_true\r
399     end\r
400       it 'フキダシはコマを含んでいる' do\r
401         r = Balloon.list.to_json Balloon.list_json_opt\r
402         j = JSON.parse r\r
403         i = j.first\r
404         s = i['speech_balloon']\r
405         s.has_key?('panel').should be_true\r
406       end\r
407         it 'コマは作家を含んでいる' do\r
408           r = Balloon.list.to_json Balloon.list_json_opt\r
409           j = JSON.parse r\r
410           i = j.first\r
411           s = i['speech_balloon']['panel']\r
412           s.has_key?('author').should be_true\r
413         end\r
414       it 'フキダシはセリフを含んでいる' do\r
415         r = Balloon.list.to_json Balloon.list_json_opt\r
416         j = JSON.parse r\r
417         i = j.first\r
418         s = i['speech_balloon']\r
419         s.has_key?('speech').should be_true\r
420       end\r
421       it 'フキダシはフキダシテンプレートを含んでいる' do\r
422         r = Balloon.list.to_json Balloon.list_json_opt\r
423         j = JSON.parse r\r
424         i = j.first\r
425         s = i['speech_balloon']\r
426         s.has_key?('speech_balloon_template').should be_true\r
427       end\r
428   end\r
429   \r
430   describe '単体取得に於いて' do\r
431     before do\r
432       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
433       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
434       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
435     end\r
436     context 'つつがなく終わるとき' do\r
437       it '単体取得オプションを利用している' do\r
438         Balloon.stub(:show_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
439         Balloon.should_receive(:show_opt).with(any_args).exactly(1)\r
440         r = Balloon.show @balloon.id, @author\r
441       end\r
442       it '閲覧許可を問い合わせている' do\r
443         Balloon.any_instance.stub(:visible?).with(any_args).and_return(true)\r
444         Balloon.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
445         r = Balloon.show @balloon.id, @author\r
446       end\r
447     end\r
448     it '指定のフキダシ枠を返す' do\r
449       Balloon.any_instance.stub(:visible?).and_return(true)\r
450       pl = Balloon.show @balloon.id, @author\r
451       pl.should eq @balloon\r
452     end\r
453     context '閲覧許可が出なかったとき' do\r
454       it '403Forbidden例外を返す' do\r
455         Balloon.any_instance.stub(:visible?).and_return(false)\r
456         lambda{\r
457           Balloon.show @balloon.id, @author\r
458         }.should raise_error(ActiveRecord::Forbidden)\r
459       end\r
460     end\r
461     context '存在しないフキダシ枠を開こうとしたとき' do\r
462       it '404RecordNotFound例外を返す' do\r
463         lambda{\r
464           Balloon.show 110, @author\r
465         }.should raise_error(ActiveRecord::RecordNotFound)\r
466       end\r
467     end\r
468   end\r
469   describe '単体取得オプションに於いて' do\r
470     it 'includeキーを含んでいる' do\r
471       r = Balloon.show_opt\r
472       r.has_key?(:include).should be_true\r
473     end\r
474     it '1つの項目を含んでいる' do\r
475       r = Balloon.show_opt[:include]\r
476       r.should have(1).items\r
477     end\r
478     it 'フキダシを含んでいる' do\r
479       r = Balloon.show_opt[:include]\r
480       r.has_key?(:speech_balloon).should be_true\r
481     end\r
482       it 'フキダシはコマを含んでいる' do\r
483         r = Balloon.show_opt[:include]\r
484         r[:speech_balloon].has_key?(:panel).should be_true\r
485       end\r
486         it 'コマは作家を含んでいる' do\r
487           r = Balloon.show_opt[:include]\r
488           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
489         end\r
490       it 'フキダシはセリフを含んでいる' do\r
491         r = Balloon.show_opt[:include]\r
492         r[:speech_balloon].has_key?(:speech).should be_true\r
493       end\r
494       it 'フキダシはフキダシテンプレートを含んでいる' do\r
495         r = Balloon.show_opt[:include]\r
496         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
497       end\r
498   end\r
499   describe 'json単体出力オプションに於いて' do\r
500     before do\r
501       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
502       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
503       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
504     end\r
505     it 'フキダシを含んでいる' do\r
506       r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
507       j = JSON.parse r\r
508       i = j\r
509       i.has_key?('speech_balloon').should be_true\r
510     end\r
511       it 'コマを含んでいる' do\r
512         r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
513         j = JSON.parse r\r
514         i = j['speech_balloon']\r
515         i.has_key?('panel').should be_true\r
516       end\r
517         it 'コマは作家を含んでいる' do\r
518           r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
519           j = JSON.parse r\r
520           i = j['speech_balloon']\r
521           s = i['panel']\r
522           s.has_key?('author').should be_true\r
523         end\r
524       it 'セリフを含んでいる' do\r
525         r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
526         j = JSON.parse r\r
527         i = j['speech_balloon']\r
528         i.has_key?('speech').should be_true\r
529       end\r
530       it 'フキダシテンプレートを含んでいる' do\r
531         r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
532         j = JSON.parse r\r
533         i = j['speech_balloon']\r
534         i.has_key?('speech_balloon_template').should be_true\r
535       end\r
536   end\r
537 end\r