OSDN Git Service

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