OSDN Git Service

t#31757:add font
[pettanr/pettanr.git] / spec / models / speech_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 #セリフ\r
3 require 'spec_helper'\r
4 \r
5 describe Speech do\r
6   before do\r
7     @admin = FactoryGirl.create :admin\r
8     @user = FactoryGirl.create( :user_yas)\r
9     @author = FactoryGirl.create :author, :user_id => @user.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     @writing_format = FactoryGirl.create :writing_format\r
18     @speech_balloon_template = FactoryGirl.create :speech_balloon_template, "name" => "circle@pettan.com", "classname" => "CircleSpeechBalloon", "caption" => "cc",  "system_picture_id" => @sp.id, "settings" => '{}'\r
19     @panel = FactoryGirl.create :panel, :author_id => @author.id\r
20   end\r
21   \r
22   describe '検証に於いて' do\r
23     before do\r
24       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
25       @speech = @sb.build_speech(\r
26         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
27       )\r
28       @balloon = @sb.build_balloon(\r
29         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
30       )\r
31       @sb.boost\r
32       @sb.save!\r
33     end\r
34     \r
35     context 'オーソドックスなデータのとき' do\r
36       it '下限データが通る' do\r
37         @speech.font_size = 1.0\r
38         @speech.text_align = 0\r
39         @speech.fore_color = 0\r
40         @speech.x = 0\r
41         @speech.y = 0\r
42         @speech.width = 1\r
43         @speech.height = 1\r
44         @speech.quotes = ''\r
45         @speech.should be_valid\r
46       end\r
47       it '上限データが通る' do\r
48         @speech.font_size = 99999.0\r
49         @speech.text_align = 3\r
50         @speech.fore_color = 0xffffff\r
51         @speech.x = 99999\r
52         @speech.y = 99999\r
53         @speech.width = 99999\r
54         @speech.height = 99999\r
55         @speech.quotes = '[ ] [ ] [ ] [ ]'\r
56         @speech.should be_valid\r
57       end\r
58     end\r
59     \r
60     context 'speech_balloon_idを検証するとき' do\r
61       #ネストの保存はnilを許可しなければならないので数値チェックだけ\r
62       it 'テストデータの確認' do\r
63         @speech.speech_balloon_id = @sb.id\r
64         @speech.should be_valid\r
65       end\r
66       it '数値でなければ失敗する' do\r
67         @speech.speech_balloon_id = 'a'\r
68         @speech.should_not be_valid\r
69       end\r
70     end\r
71     context 'contentを検証するとき' do\r
72     end\r
73     context 'font_sizeを検証するとき' do\r
74       it 'nullなら失敗する' do\r
75         @speech.font_size = nil\r
76         @speech.should_not be_valid\r
77       end\r
78       it '数値でなければ失敗する' do\r
79         @speech.font_size = 'a'\r
80         @speech.should_not be_valid\r
81       end\r
82       it '0なら通る' do\r
83         @speech.font_size = '0'\r
84         @speech.should be_valid\r
85       end\r
86       it '10.5なら通る' do\r
87         @speech.font_size = '0'\r
88         @speech.should be_valid\r
89       end\r
90       it '負なら失敗する' do\r
91         @speech.font_size = 10.5\r
92         @speech.should be_valid\r
93       end\r
94     end\r
95     context 'text_alignを検証するとき' do\r
96       it 'nullなら失敗する' do\r
97         @speech.text_align = nil\r
98         @speech.should_not be_valid\r
99       end\r
100       it '数値でなければ失敗する' do\r
101         @speech.text_align = 'a'\r
102         @speech.should_not be_valid\r
103       end\r
104       it '0なら通る' do\r
105         @speech.text_align = '0'\r
106         @speech.should be_valid\r
107       end\r
108       it '負なら失敗する' do\r
109         @speech.text_align = -1\r
110         @speech.should_not be_valid\r
111       end\r
112       it '4なら失敗する' do\r
113         @speech.text_align = 4\r
114         @speech.should_not be_valid\r
115       end\r
116     end\r
117     context 'fore_colorを検証するとき' do\r
118       it 'nullなら失敗する' do\r
119         @speech.fore_color = nil\r
120         @speech.should_not be_valid\r
121       end\r
122       it '数値でなければ失敗する' do\r
123         @speech.fore_color = 'a'\r
124         @speech.should_not be_valid\r
125       end\r
126       it '0なら通る' do\r
127         @speech.fore_color = '0'\r
128         @speech.should be_valid\r
129       end\r
130       it '負なら失敗する' do\r
131         @speech.fore_color = -1\r
132         @speech.should_not be_valid\r
133       end\r
134       it '24bit colorでなければ失敗する' do\r
135         @speech.fore_color = 0x1000000\r
136         @speech.should_not be_valid\r
137       end\r
138     end\r
139     context 'xを検証するとき' do\r
140       it 'nullなら失敗する' do\r
141         @speech.x = nil\r
142         @speech.should_not be_valid\r
143       end\r
144       it '数値でなければ失敗する' do\r
145         @speech.x = 'a'\r
146         @speech.should_not be_valid\r
147       end\r
148       it '0なら通る' do\r
149         @speech.x = '0'\r
150         @speech.should be_valid\r
151       end\r
152       it '負でも通る' do\r
153         @speech.x = -1\r
154         @speech.should be_valid\r
155       end\r
156     end\r
157     context 'yを検証するとき' do\r
158       it 'nullなら失敗する' do\r
159         @speech.y = nil\r
160         @speech.should_not be_valid\r
161       end\r
162       it '数値でなければ失敗する' do\r
163         @speech.y = 'a'\r
164         @speech.should_not be_valid\r
165       end\r
166       it '0なら通る' do\r
167         @speech.y = '0'\r
168         @speech.should be_valid\r
169       end\r
170       it '負でも通る' do\r
171         @speech.y = -1\r
172         @speech.should be_valid\r
173       end\r
174     end\r
175     context 'widthを検証するとき' do\r
176       it 'nullなら失敗する' do\r
177         @speech.width = nil\r
178         @speech.should_not be_valid\r
179       end\r
180       it '数値でなければ失敗する' do\r
181         @speech.width = 'a'\r
182         @speech.should_not be_valid\r
183       end\r
184       it '0なら失敗する' do\r
185         @speech.width = '0'\r
186         @speech.should_not be_valid\r
187       end\r
188       it '負でも失敗する' do\r
189         @speech.width = -1\r
190         @speech.should_not be_valid\r
191       end\r
192     end\r
193     context 'heightを検証するとき' do\r
194       it 'nullなら失敗する' do\r
195         @speech.height = nil\r
196         @speech.should_not be_valid\r
197       end\r
198       it '数値でなければ失敗する' do\r
199         @speech.height = 'a'\r
200         @speech.should_not be_valid\r
201       end\r
202       it '0なら失敗する' do\r
203         @speech.height = '0'\r
204         @speech.should_not be_valid\r
205       end\r
206       it '負でも失敗する' do\r
207         @speech.height = -1\r
208         @speech.should_not be_valid\r
209       end\r
210     end\r
211     context 'quotesを検証するとき' do\r
212       it '奇数なら失敗する' do\r
213         @speech.quotes = '[ ] ['\r
214         @speech.should_not be_valid\r
215       end\r
216       it '16文字以上なら失敗する' do\r
217         @speech.quotes = '[ ] [ ] [ ] [ ] [ ]'\r
218         @speech.should_not be_valid\r
219       end\r
220     end\r
221     context 'settingsを検証するとき' do\r
222     end\r
223   end\r
224   \r
225   describe '文字コード検証に於いて' do\r
226     before do\r
227       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
228       @speech = @sb.build_speech(\r
229         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
230       )\r
231       @balloon = @sb.build_balloon(\r
232         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
233       )\r
234       @sb.boost\r
235       @sb.save!\r
236     end\r
237     \r
238     context 'contentを検証するとき' do\r
239       it 'Shift JISなら失敗する' do\r
240         @speech.content = "\x83G\x83r\x83]\x83D"\r
241         lambda{\r
242           @speech.valid_encode\r
243         }.should raise_error(Pettanr::BadRequest)\r
244       end\r
245     end\r
246     \r
247     context 'quotesを検証するとき' do\r
248       it 'Shift JISなら失敗する' do\r
249         @speech.quotes = "\x83G \x83r \x83 ]\x83D"\r
250         lambda{\r
251           @speech.valid_encode\r
252         }.should raise_error(Pettanr::BadRequest)\r
253       end\r
254     end\r
255     \r
256     context 'settingsを検証するとき' do\r
257       it 'Shift JISなら失敗する' do\r
258         @speech.settings = "\x83G\x83r\x83]\x83D"\r
259         lambda{\r
260           @speech.valid_encode\r
261         }.should raise_error(Pettanr::BadRequest)\r
262       end\r
263     end\r
264   end\r
265   \r
266   describe '閲覧許可に於いて' do\r
267     before do\r
268       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
269       @speech = @sb.build_speech(\r
270         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
271       )\r
272       @balloon = @sb.build_balloon(\r
273         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
274       )\r
275       @sb.boost\r
276       @sb.save!\r
277     end\r
278     context 'オープンモードのとき' do\r
279       before do\r
280         MagicNumber['run_mode'] = 0\r
281       end\r
282       it '自身にゲスト用ロールチェックを問い合わせしている' do\r
283         Speech.any_instance.stub(:guest_role_check).and_return(true)\r
284         Speech.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)\r
285         r = @speech.visible?([@author])\r
286       end\r
287       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do\r
288         Speech.any_instance.stub(:guest_role_check).and_return(false)\r
289         r = @speech.visible?([@author])\r
290         r.should be_false\r
291       end\r
292     end\r
293     context 'クローズドモードのとき' do\r
294       before do\r
295         MagicNumber['run_mode'] = 1\r
296       end\r
297       it '自身に読者用ロールチェックを問い合わせしている' do\r
298         Speech.any_instance.stub(:reader_role_check).and_return(true)\r
299         Speech.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)\r
300         r = @speech.visible?([@author])\r
301       end\r
302       it '読者用ロールチェックが失敗したとき、falseを返す' do\r
303         Speech.any_instance.stub(:reader_role_check).and_return(false)\r
304         r = @speech.visible?([@author])\r
305         r.should be_false\r
306       end\r
307     end\r
308     context '事前チェックする' do\r
309       before do\r
310         MagicNumber['run_mode'] = 1\r
311         Speech.any_instance.stub(:reader_role_check).and_return(true)\r
312       end\r
313       it '自身のコマに所持判定を問い合わせしている' do\r
314         Panel.any_instance.stub(:own?).and_return(true)\r
315         Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)\r
316         r = @speech.visible?([@author])\r
317       end\r
318       it '自身のコマに閲覧許可を問い合わせしている' do\r
319         Panel.any_instance.stub(:own?).and_return(false)\r
320         Panel.any_instance.stub(:visible?).and_return(true)\r
321         Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
322         r = @speech.visible?([@author])\r
323       end\r
324     end\r
325     context 'つつがなく終わるとき' do\r
326       before do\r
327         MagicNumber['run_mode'] = 1\r
328         Panel.any_instance.stub(:reader_role_check).and_return(true)\r
329       end\r
330       it '自分のコマのセリフなら許可する' do\r
331         Panel.any_instance.stub(:own?).and_return(true)\r
332         Panel.any_instance.stub(:visible?).and_return(false)\r
333         r = @speech.visible?([@author])\r
334         r.should be_true\r
335       end\r
336       it '他人の非公開コマのセリフなら許可しない' do\r
337         Panel.any_instance.stub(:own?).and_return(false)\r
338         Panel.any_instance.stub(:visible?).and_return(false)\r
339         r = @speech.visible?([@author])\r
340         r.should be_false\r
341       end\r
342       it '他人のコマのセリフでも公開なら許可する' do\r
343         Panel.any_instance.stub(:own?).and_return(false)\r
344         Panel.any_instance.stub(:visible?).and_return(true)\r
345         r = @speech.visible?([@author])\r
346         r.should be_true\r
347       end\r
348     end\r
349   end\r
350   \r
351   describe '一覧取得に於いて' do\r
352     before do\r
353       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
354       @speech = @sb.build_speech(\r
355         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
356       )\r
357       @balloon = @sb.build_balloon(\r
358         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
359       )\r
360       @sb.boost\r
361       @sb.save!\r
362     end\r
363     context 'page補正について' do\r
364       it '文字列から数値に変換される' do\r
365         Speech.page('8').should eq 8\r
366       end\r
367       it 'nilの場合は1になる' do\r
368         Speech.page().should eq 1\r
369       end\r
370       it '0以下の場合は1になる' do\r
371         Speech.page('0').should eq 1\r
372       end\r
373     end\r
374     context 'page_size補正について' do\r
375       it '文字列から数値に変換される' do\r
376         Speech.page_size('7').should eq 7\r
377       end\r
378       it 'nilの場合はSpeech.default_page_sizeになる' do\r
379         Speech.page_size().should eq Speech.default_page_size\r
380       end\r
381       it '0以下の場合はSpeech.default_page_sizeになる' do\r
382         Speech.page_size('0').should eq Speech.default_page_size\r
383       end\r
384       it 'Speech.max_page_sizeを超えた場合はSpeech.max_page_sizeになる' do\r
385         Speech.page_size('1000').should eq Speech.max_page_size\r
386       end\r
387     end\r
388     context 'つつがなく終わるとき' do\r
389       it '一覧取得オプションを利用している' do\r
390         Speech.stub(:list_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
391         Speech.should_receive(:list_opt).with(any_args).exactly(1)\r
392         r = Speech.list\r
393       end\r
394     end\r
395     it 'リストを返す' do\r
396       r = Speech.list\r
397       r.should eq [@speech]\r
398     end\r
399     it '時系列で並んでいる' do\r
400       #公開されたコマのセリフは(他人のセリフであっても)含んでいる\r
401       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1\r
402       nsb = FactoryGirl.build :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id\r
403       npl = nsb.build_speech(\r
404         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id, :updated_at => Time.now + 100)\r
405       )\r
406       nsb.build_balloon(\r
407         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
408       )\r
409       nsb.boost\r
410       nsb.save!\r
411       r = Speech.list\r
412       r.should eq [npl, @speech]\r
413     end\r
414     it '非公開のコマのセリフは自分のセリフであっても含まない' do\r
415       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0\r
416       nsb = FactoryGirl.build :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id\r
417       npl = nsb.build_speech(\r
418         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id, :updated_at => Time.now + 100)\r
419       )\r
420       nsb.build_balloon(\r
421         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
422       )\r
423       nsb.boost\r
424       nsb.save!\r
425       pl = Speech.list\r
426       pl.should eq [@speech]\r
427     end\r
428     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
429       before do\r
430         @sb2 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
431         @speech2 = @sb2.build_speech(\r
432           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
433         )\r
434         @balloon2 = @sb2.build_balloon(\r
435           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 100)\r
436         )\r
437         @sb2.boost\r
438         @sb2.save!\r
439         @sb3 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
440         @speech3 = @sb3.build_speech(\r
441           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
442         )\r
443         @balloon3 = @sb3.build_balloon(\r
444           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 200)\r
445         )\r
446         @sb3.boost\r
447         @sb3.save!\r
448         @sb4 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
449         @speech4 = @sb4.build_speech(\r
450           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
451         )\r
452         @balloon4 = @sb4.build_balloon(\r
453           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 300)\r
454         )\r
455         @sb4.boost\r
456         @sb4.save!\r
457         @sb5 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
458         @speech5 = @sb5.build_speech(\r
459           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
460         )\r
461         @balloon5 = @sb5.build_balloon(\r
462           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 400)\r
463         )\r
464         @sb5.boost\r
465         @sb5.save!\r
466         Speech.stub(:default_page_size).and_return(2)\r
467       end\r
468       it '通常は2件を返す' do\r
469         pl = Speech.list\r
470         pl.should have(2).items \r
471       end\r
472       it 'page=1なら末尾2件を返す' do\r
473         #時系列で並んでいる\r
474         pl = Speech.list(1)\r
475         pl.should eq [@speech5, @speech4]\r
476       end\r
477       it 'page=2なら中間2件を返す' do\r
478         pl = Speech.list(2)\r
479         pl.should eq [@speech3, @speech2]\r
480       end\r
481       it 'page=3なら先頭1件を返す' do\r
482         pl = Speech.list(3)\r
483         pl.should eq [@speech]\r
484       end\r
485     end\r
486     context 'DBに5件あって1ページの件数を0件に変えたとして' do\r
487       before do\r
488         @sb2 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
489         @speech2 = @sb2.build_speech(\r
490           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
491         )\r
492         @balloon2 = @sb2.build_balloon(\r
493           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 100)\r
494         )\r
495         @sb2.boost\r
496         @sb2.save!\r
497         @sb3 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
498         @speech3 = @sb3.build_speech(\r
499           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
500         )\r
501         @balloon3 = @sb3.build_balloon(\r
502           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 200)\r
503         )\r
504         @sb3.boost\r
505         @sb3.save!\r
506         @sb4 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
507         @speech4 = @sb4.build_speech(\r
508           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
509         )\r
510         @balloon4 = @sb4.build_balloon(\r
511           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 300)\r
512         )\r
513         @sb4.boost\r
514         @sb4.save!\r
515         @sb5 = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
516         @speech5 = @sb5.build_speech(\r
517           FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
518         )\r
519         @balloon5 = @sb5.build_balloon(\r
520           FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 400)\r
521         )\r
522         @sb5.boost\r
523         @sb5.save!\r
524         Speech.stub(:default_page_size).and_return(2)\r
525       end\r
526       it '通常は全件(5件)を返す' do\r
527         r = Speech.list 5, 0\r
528         r.should have(5).items \r
529       end\r
530     end\r
531   end\r
532   describe '一覧取得オプションに於いて' do\r
533     it 'includeキーを含んでいる' do\r
534       r = Speech.list_opt\r
535       r.has_key?(:include).should be_true\r
536     end\r
537     it '1つの項目を含んでいる' do\r
538       r = Speech.list_opt[:include]\r
539       r.should have(1).items\r
540     end\r
541     it 'フキダシを含んでいる' do\r
542       r = Speech.list_opt[:include]\r
543       r.has_key?(:speech_balloon).should be_true\r
544     end\r
545       it 'フキダシはコマを含んでいる' do\r
546         r = Speech.list_opt[:include]\r
547         r[:speech_balloon].has_key?(:panel).should be_true\r
548       end\r
549         it 'コマは作家を含んでいる' do\r
550           r = Speech.list_opt[:include]\r
551           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
552         end\r
553       it 'フキダシはフキダシ枠を含んでいる' do\r
554         r = Speech.list_opt[:include]\r
555         r[:speech_balloon].has_key?(:balloon).should be_true\r
556       end\r
557       it 'フキダシはフキダシテンプレートを含んでいる' do\r
558         r = Speech.list_opt[:include]\r
559         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
560       end\r
561   end\r
562   describe 'json一覧出力オプションに於いて' do\r
563     before do\r
564       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
565       @speech = @sb.build_speech(\r
566         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
567       )\r
568       @balloon = @sb.build_balloon(\r
569         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
570       )\r
571       @sb.boost\r
572       @sb.save!\r
573     end\r
574     it 'フキダシを含んでいる' do\r
575       r = Speech.list.to_json Speech.list_json_opt\r
576       j = JSON.parse r\r
577       i = j.first\r
578       i.has_key?('speech_balloon').should be_true\r
579     end\r
580       it 'フキダシはコマを含んでいる' do\r
581         r = Speech.list.to_json Speech.list_json_opt\r
582         j = JSON.parse r\r
583         i = j.first\r
584         s = i['speech_balloon']\r
585         s.has_key?('panel').should be_true\r
586       end\r
587         it 'コマは作家を含んでいる' do\r
588           r = Speech.list.to_json Speech.list_json_opt\r
589           j = JSON.parse r\r
590           i = j.first\r
591           s = i['speech_balloon']['panel']\r
592           s.has_key?('author').should be_true\r
593         end\r
594       it 'フキダシはフキダシ枠を含んでいる' do\r
595         r = Speech.list.to_json Speech.list_json_opt\r
596         j = JSON.parse r\r
597         i = j.first\r
598         s = i['speech_balloon']\r
599         s.has_key?('balloon').should be_true\r
600       end\r
601       it 'フキダシはフキダシテンプレートを含んでいる' do\r
602         r = Speech.list.to_json Speech.list_json_opt\r
603         j = JSON.parse r\r
604         i = j.first\r
605         s = i['speech_balloon']\r
606         s.has_key?('speech_balloon_template').should be_true\r
607       end\r
608   end\r
609   \r
610   describe '単体取得に於いて' do\r
611     before do\r
612       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
613       @speech = @sb.build_speech(\r
614         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
615       )\r
616       @balloon = @sb.build_balloon(\r
617         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
618       )\r
619       @sb.boost\r
620       @sb.save!\r
621     end\r
622     context 'つつがなく終わるとき' do\r
623       it '単体取得オプションを利用している' do\r
624         Speech.stub(:show_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
625         Speech.should_receive(:show_opt).with(any_args).exactly(1)\r
626         r = Speech.show @speech.id, @author\r
627       end\r
628       it '閲覧許可を問い合わせている' do\r
629         Speech.any_instance.stub(:visible?).with(any_args).and_return(true)\r
630         Speech.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
631         r = Speech.show @speech.id, @author\r
632       end\r
633     end\r
634     it '指定のセリフを返す' do\r
635       Speech.any_instance.stub(:visible?).and_return(true)\r
636       pl = Speech.show @speech.id, @author\r
637       pl.should eq @speech\r
638     end\r
639     context '閲覧許可が出なかったとき' do\r
640       it '403Forbidden例外を返す' do\r
641         Speech.any_instance.stub(:visible?).and_return(false)\r
642         lambda{\r
643           Speech.show @speech.id, @author\r
644         }.should raise_error(ActiveRecord::Forbidden)\r
645       end\r
646     end\r
647     context '存在しないセリフを開こうとしたとき' do\r
648       it '404RecordNotFound例外を返す' do\r
649         lambda{\r
650           Speech.show 110, @author\r
651         }.should raise_error(ActiveRecord::RecordNotFound)\r
652       end\r
653     end\r
654   end\r
655   describe '単体取得オプションに於いて' do\r
656     it 'includeキーを含んでいる' do\r
657       r = Speech.show_opt\r
658       r.has_key?(:include).should be_true\r
659     end\r
660     it '1つの項目を含んでいる' do\r
661       r = Speech.show_opt[:include]\r
662       r.should have(1).items\r
663     end\r
664     it 'フキダシを含んでいる' do\r
665       r = Speech.show_opt[:include]\r
666       r.has_key?(:speech_balloon).should be_true\r
667     end\r
668       it 'フキダシはコマを含んでいる' do\r
669         r = Speech.show_opt[:include]\r
670         r[:speech_balloon].has_key?(:panel).should be_true\r
671       end\r
672         it 'コマは作家を含んでいる' do\r
673           r = Speech.show_opt[:include]\r
674           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
675         end\r
676       it 'フキダシはフキダシ枠を含んでいる' do\r
677         r = Speech.show_opt[:include]\r
678         r[:speech_balloon].has_key?(:balloon).should be_true\r
679       end\r
680       it 'フキダシはフキダシテンプレートを含んでいる' do\r
681         r = Speech.show_opt[:include]\r
682         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
683       end\r
684   end\r
685   describe 'json単体出力オプションに於いて' do\r
686     before do\r
687       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
688       @speech = @sb.build_speech(\r
689         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
690       )\r
691       @balloon = @sb.build_balloon(\r
692         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
693       )\r
694       @sb.boost\r
695       @sb.save!\r
696     end\r
697     it 'フキダシを含んでいる' do\r
698       r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
699       j = JSON.parse r\r
700       i = j\r
701       i.has_key?('speech_balloon').should be_true\r
702     end\r
703       it 'コマを含んでいる' do\r
704         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
705         j = JSON.parse r\r
706         i = j['speech_balloon']\r
707         i.has_key?('panel').should be_true\r
708       end\r
709         it 'コマは作家を含んでいる' do\r
710           r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
711           j = JSON.parse r\r
712           i = j['speech_balloon']\r
713           s = i['panel']\r
714           s.has_key?('author').should be_true\r
715         end\r
716       it 'フキダシ枠を含んでいる' do\r
717         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
718         j = JSON.parse r\r
719         i = j['speech_balloon']\r
720         i.has_key?('balloon').should be_true\r
721       end\r
722       it 'フキダシテンプレートを含んでいる' do\r
723         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
724         j = JSON.parse r\r
725         i = j['speech_balloon']\r
726         i.has_key?('speech_balloon_template').should be_true\r
727       end\r
728   end\r
729 end\r