OSDN Git Service

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