OSDN Git Service

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