OSDN Git Service

t#31076:import methods move to model
[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.create :speech, :speech_balloon_id => @sb.id\r
139     end\r
140     context 'オープンモードのとき' do\r
141       before do\r
142         MagicNumber['run_mode'] = 0\r
143       end\r
144       it '自身にゲスト用ロールチェックを問い合わせしている' do\r
145         Speech.any_instance.stub(:guest_role_check).and_return(true)\r
146         Speech.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)\r
147         r = @speech.visible?([@author])\r
148       end\r
149       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do\r
150         Speech.any_instance.stub(:guest_role_check).and_return(false)\r
151         r = @speech.visible?([@author])\r
152         r.should be_false\r
153       end\r
154     end\r
155     context 'クローズドモードのとき' do\r
156       before do\r
157         MagicNumber['run_mode'] = 1\r
158       end\r
159       it '自身に読者用ロールチェックを問い合わせしている' do\r
160         Speech.any_instance.stub(:reader_role_check).and_return(true)\r
161         Speech.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)\r
162         r = @speech.visible?([@author])\r
163       end\r
164       it '読者用ロールチェックが失敗したとき、falseを返す' do\r
165         Speech.any_instance.stub(:reader_role_check).and_return(false)\r
166         r = @speech.visible?([@author])\r
167         r.should be_false\r
168       end\r
169     end\r
170     context '事前チェックする' do\r
171       before do\r
172         MagicNumber['run_mode'] = 1\r
173         Speech.any_instance.stub(:reader_role_check).and_return(true)\r
174       end\r
175       it '自身のコマに所持判定を問い合わせしている' do\r
176         Panel.any_instance.stub(:own?).and_return(true)\r
177         Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)\r
178         r = @speech.visible?([@author])\r
179       end\r
180       it '自身のコマに閲覧許可を問い合わせしている' do\r
181         Panel.any_instance.stub(:own?).and_return(false)\r
182         Panel.any_instance.stub(:visible?).and_return(true)\r
183         Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
184         r = @speech.visible?([@author])\r
185       end\r
186     end\r
187     context 'つつがなく終わるとき' do\r
188       before do\r
189         MagicNumber['run_mode'] = 1\r
190         Panel.any_instance.stub(:reader_role_check).and_return(true)\r
191       end\r
192       it '自分のコマのセリフなら許可する' do\r
193         Panel.any_instance.stub(:own?).and_return(true)\r
194         Panel.any_instance.stub(:visible?).and_return(false)\r
195         r = @speech.visible?([@author])\r
196         r.should be_true\r
197       end\r
198       it '他人の非公開コマのセリフなら許可しない' do\r
199         Panel.any_instance.stub(:own?).and_return(false)\r
200         Panel.any_instance.stub(:visible?).and_return(false)\r
201         r = @speech.visible?([@author])\r
202         r.should be_false\r
203       end\r
204       it '他人のコマのセリフでも公開なら許可する' do\r
205         Panel.any_instance.stub(:own?).and_return(false)\r
206         Panel.any_instance.stub(:visible?).and_return(true)\r
207         r = @speech.visible?([@author])\r
208         r.should be_true\r
209       end\r
210     end\r
211   end\r
212   \r
213   describe '一覧取得に於いて' do\r
214     before do\r
215       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
216       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
217       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
218     end\r
219     context 'page補正について' do\r
220       it '文字列から数値に変換される' do\r
221         Speech.page('8').should eq 8\r
222       end\r
223       it 'nilの場合は1になる' do\r
224         Speech.page().should eq 1\r
225       end\r
226       it '0以下の場合は1になる' do\r
227         Speech.page('0').should eq 1\r
228       end\r
229     end\r
230     context 'page_size補正について' do\r
231       it '文字列から数値に変換される' do\r
232         Speech.page_size('7').should eq 7\r
233       end\r
234       it 'nilの場合はSpeech.default_page_sizeになる' do\r
235         Speech.page_size().should eq Speech.default_page_size\r
236       end\r
237       it '0以下の場合はSpeech.default_page_sizeになる' do\r
238         Speech.page_size('0').should eq Speech.default_page_size\r
239       end\r
240       it 'Speech.max_page_sizeを超えた場合はSpeech.max_page_sizeになる' do\r
241         Speech.page_size('1000').should eq Speech.max_page_size\r
242       end\r
243     end\r
244     context 'つつがなく終わるとき' do\r
245       it '一覧取得オプションを利用している' do\r
246         Speech.stub(:list_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
247         Speech.should_receive(:list_opt).with(any_args).exactly(1)\r
248         r = Speech.list\r
249       end\r
250     end\r
251     it 'リストを返す' do\r
252       r = Speech.list\r
253       r.should eq [@speech]\r
254     end\r
255     it '時系列で並んでいる' do\r
256       #公開されたコマのセリフは(他人のセリフであっても)含んでいる\r
257       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1\r
258       nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
259       npl = FactoryGirl.create :speech, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
260       r = Speech.list\r
261       r.should eq [npl, @speech]\r
262     end\r
263     it '非公開のコマのセリフは自分のセリフであっても含まない' do\r
264       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0\r
265       nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
266       npl = FactoryGirl.create :speech, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
267       pl = Speech.list\r
268       pl.should eq [@speech]\r
269     end\r
270     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
271       before do\r
272         @speech2 = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :updated_at => Time.now + 100\r
273         @speech3 = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :updated_at => Time.now + 200\r
274         @speech4 = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :updated_at => Time.now + 300\r
275         @speech5 = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :updated_at => Time.now + 400\r
276         Speech.stub(:default_page_size).and_return(2)\r
277       end\r
278       it '通常は2件を返す' do\r
279         pl = Speech.list\r
280         pl.should have(2).items \r
281       end\r
282       it 'page=1なら末尾2件を返す' do\r
283         #時系列で並んでいる\r
284         pl = Speech.list(1)\r
285         pl.should eq [@speech5, @speech4]\r
286       end\r
287       it 'page=2なら中間2件を返す' do\r
288         pl = Speech.list(2)\r
289         pl.should eq [@speech3, @speech2]\r
290       end\r
291       it 'page=3なら先頭1件を返す' do\r
292         pl = Speech.list(3)\r
293         pl.should eq [@speech]\r
294       end\r
295     end\r
296     context 'DBに5件あって1ページの件数を0件に変えたとして' 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 '通常は全件(5件)を返す' do\r
305         r = Speech.list 5, 0\r
306         r.should have(5).items \r
307       end\r
308     end\r
309   end\r
310   describe '一覧取得オプションに於いて' do\r
311     it 'includeキーを含んでいる' do\r
312       r = Speech.list_opt\r
313       r.has_key?(:include).should be_true\r
314     end\r
315     it '1つの項目を含んでいる' do\r
316       r = Speech.list_opt[:include]\r
317       r.should have(1).items\r
318     end\r
319     it 'フキダシを含んでいる' do\r
320       r = Speech.list_opt[:include]\r
321       r.has_key?(:speech_balloon).should be_true\r
322     end\r
323       it 'フキダシはコマを含んでいる' do\r
324         r = Speech.list_opt[:include]\r
325         r[:speech_balloon].has_key?(:panel).should be_true\r
326       end\r
327         it 'コマは作家を含んでいる' do\r
328           r = Speech.list_opt[:include]\r
329           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
330         end\r
331       it 'フキダシはフキダシ枠を含んでいる' do\r
332         r = Speech.list_opt[:include]\r
333         r[:speech_balloon].has_key?(:balloons).should be_true\r
334       end\r
335       it 'フキダシはフキダシテンプレートを含んでいる' do\r
336         r = Speech.list_opt[:include]\r
337         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
338       end\r
339   end\r
340   describe 'json一覧出力オプションに於いて' do\r
341     before do\r
342       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
343       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
344       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
345     end\r
346     it 'フキダシを含んでいる' do\r
347       r = Speech.list.to_json Speech.list_json_opt\r
348       j = JSON.parse r\r
349       i = j.first\r
350       i.has_key?('speech_balloon').should be_true\r
351     end\r
352       it 'フキダシはコマを含んでいる' do\r
353         r = Speech.list.to_json Speech.list_json_opt\r
354         j = JSON.parse r\r
355         i = j.first\r
356         s = i['speech_balloon']\r
357         s.has_key?('panel').should be_true\r
358       end\r
359         it 'コマは作家を含んでいる' do\r
360           r = Speech.list.to_json Speech.list_json_opt\r
361           j = JSON.parse r\r
362           i = j.first\r
363           s = i['speech_balloon']['panel']\r
364           s.has_key?('author').should be_true\r
365         end\r
366       it 'フキダシはフキダシ枠を含んでいる' do\r
367         r = Speech.list.to_json Speech.list_json_opt\r
368         j = JSON.parse r\r
369         i = j.first\r
370         s = i['speech_balloon']\r
371         s.has_key?('balloons').should be_true\r
372       end\r
373       it 'フキダシはフキダシテンプレートを含んでいる' do\r
374         r = Speech.list.to_json Speech.list_json_opt\r
375         j = JSON.parse r\r
376         i = j.first\r
377         s = i['speech_balloon']\r
378         s.has_key?('speech_balloon_template').should be_true\r
379       end\r
380   end\r
381   \r
382   describe '単体取得に於いて' do\r
383     before do\r
384       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
385       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
386       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
387     end\r
388     context 'つつがなく終わるとき' do\r
389       it '単体取得オプションを利用している' do\r
390         Speech.stub(:show_opt).with(any_args).and_return({:include => {:speech_balloon => {:panel => {}}}})\r
391         Speech.should_receive(:show_opt).with(any_args).exactly(1)\r
392         r = Speech.show @speech.id, @author\r
393       end\r
394       it '閲覧許可を問い合わせている' do\r
395         Speech.any_instance.stub(:visible?).with(any_args).and_return(true)\r
396         Speech.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
397         r = Speech.show @speech.id, @author\r
398       end\r
399     end\r
400     it '指定のセリフを返す' do\r
401       Speech.any_instance.stub(:visible?).and_return(true)\r
402       pl = Speech.show @speech.id, @author\r
403       pl.should eq @speech\r
404     end\r
405     context '閲覧許可が出なかったとき' do\r
406       it '403Forbidden例外を返す' do\r
407         Speech.any_instance.stub(:visible?).and_return(false)\r
408         lambda{\r
409           Speech.show @speech.id, @author\r
410         }.should raise_error(ActiveRecord::Forbidden)\r
411       end\r
412     end\r
413     context '存在しないセリフを開こうとしたとき' do\r
414       it '404RecordNotFound例外を返す' do\r
415         lambda{\r
416           Speech.show 110, @author\r
417         }.should raise_error(ActiveRecord::RecordNotFound)\r
418       end\r
419     end\r
420   end\r
421   describe '単体取得オプションに於いて' do\r
422     it 'includeキーを含んでいる' do\r
423       r = Speech.show_opt\r
424       r.has_key?(:include).should be_true\r
425     end\r
426     it '1つの項目を含んでいる' do\r
427       r = Speech.show_opt[:include]\r
428       r.should have(1).items\r
429     end\r
430     it 'フキダシを含んでいる' do\r
431       r = Speech.show_opt[:include]\r
432       r.has_key?(:speech_balloon).should be_true\r
433     end\r
434       it 'フキダシはコマを含んでいる' do\r
435         r = Speech.show_opt[:include]\r
436         r[:speech_balloon].has_key?(:panel).should be_true\r
437       end\r
438         it 'コマは作家を含んでいる' do\r
439           r = Speech.show_opt[:include]\r
440           r[:speech_balloon][:panel].has_key?(:author).should be_true\r
441         end\r
442       it 'フキダシはフキダシ枠を含んでいる' do\r
443         r = Speech.show_opt[:include]\r
444         r[:speech_balloon].has_key?(:balloons).should be_true\r
445       end\r
446       it 'フキダシはフキダシテンプレートを含んでいる' do\r
447         r = Speech.show_opt[:include]\r
448         r[:speech_balloon].has_key?(:speech_balloon_template).should be_true\r
449       end\r
450   end\r
451   describe 'json単体出力オプションに於いて' do\r
452     before do\r
453       @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
454       @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
455       @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id\r
456     end\r
457     it 'フキダシを含んでいる' do\r
458       r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
459       j = JSON.parse r\r
460       i = j\r
461       i.has_key?('speech_balloon').should be_true\r
462     end\r
463       it 'コマを含んでいる' do\r
464         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
465         j = JSON.parse r\r
466         i = j['speech_balloon']\r
467         i.has_key?('panel').should be_true\r
468       end\r
469         it 'コマは作家を含んでいる' do\r
470           r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
471           j = JSON.parse r\r
472           i = j['speech_balloon']\r
473           s = i['panel']\r
474           s.has_key?('author').should be_true\r
475         end\r
476       it 'フキダシ枠を含んでいる' do\r
477         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
478         j = JSON.parse r\r
479         i = j['speech_balloon']\r
480         i.has_key?('balloons').should be_true\r
481       end\r
482       it 'フキダシテンプレートを含んでいる' do\r
483         r = Speech.show(@speech.id, @author).to_json Speech.show_json_opt\r
484         j = JSON.parse r\r
485         i = j['speech_balloon']\r
486         i.has_key?('speech_balloon_template').should be_true\r
487       end\r
488   end\r
489 end\r