OSDN Git Service

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