OSDN Git Service

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