OSDN Git Service

t#30237:update story view
[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   describe '一覧取得に於いて' do
293     before do
294       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :picture_id => @p.id,
295         :width => @p.width, :height => @p.height
296     end
297     context 'page補正について' do
298       it '文字列から数値に変換される' do
299         PanelPicture.page('8').should eq 8
300       end
301       it 'nilの場合は1になる' do
302         PanelPicture.page().should eq 1
303       end
304       it '0以下の場合は1になる' do
305         PanelPicture.page('0').should eq 1
306       end
307     end
308     context 'page_size補正について' do
309       it '文字列から数値に変換される' do
310         PanelPicture.page_size('7').should eq 7
311       end
312       it 'nilの場合はPanelPicture.default_page_sizeになる' do
313         PanelPicture.page_size().should eq PanelPicture.default_page_size
314       end
315       it '0以下の場合はPanelPicture.default_page_sizeになる' do
316         PanelPicture.page_size('0').should eq PanelPicture.default_page_size
317       end
318       it 'PanelPicture.max_page_sizeを超えた場合はPanelPicture.max_page_sizeになる' do
319         PanelPicture.page_size('1000').should eq PanelPicture.max_page_size
320       end
321     end
322     context 'つつがなく終わるとき' do
323       it '一覧取得オプションを利用している' do
324         PanelPicture.stub(:list_opt).with(any_args).and_return({:include => :panel})
325         PanelPicture.should_receive(:list_opt).with(any_args).exactly(1)
326         r = PanelPicture.list
327       end
328     end
329     it 'リストを返す' do
330       r = PanelPicture.list
331       r.should eq [@pp]
332     end
333     it '時系列で並んでいる' do
334       #公開されたコマのコマ絵は(他人のコマ絵であっても)含んでいる
335       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
336       npl = FactoryGirl.create :panel_picture, :panel_id => hc.id, :t => 0, :picture_id => @p.id,
337         :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
338       r = PanelPicture.list
339       r.should eq [npl, @pp]
340     end
341     it '非公開のコマのコマ絵は自分のコマであっても含まない' do
342       hpl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
343       npl = FactoryGirl.create :panel_picture, :panel_id => hpl.id, :picture_id => @p.id,
344         :width => @p.width, :height => @p.height
345       pl = PanelPicture.list
346       pl.should eq [@pp]
347     end
348     context 'DBに5件あって1ページの件数を2件に変えたとして' do
349       before do
350         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
351           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
352         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
353           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
354         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
355           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
356         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
357           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
358         PanelPicture.stub(:default_page_size).and_return(2)
359       end
360       it '通常は2件を返す' do
361         pl = PanelPicture.list
362         pl.should have(2).items 
363       end
364       it 'page=1なら末尾2件を返す' do
365         #時系列で並んでいる
366         pl = PanelPicture.list(1)
367         pl.should eq [@npl5, @npl4]
368       end
369       it 'page=2なら中間2件を返す' do
370         pl = PanelPicture.list(2)
371         pl.should eq [@npl3, @npl2]
372       end
373       it 'page=3なら先頭1件を返す' do
374         pl = PanelPicture.list(3)
375         pl.should eq [@pp]
376       end
377     end
378     context 'DBに5件あって1ページの件数を0件に変えたとして' do
379       before do
380         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
381           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
382         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
383           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
384         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
385           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
386         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
387           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
388         PanelPicture.stub(:default_page_size).and_return(2)
389       end
390       it '通常は全件(5件)を返す' do
391         r = PanelPicture.list 5, 0
392         r.should have(5).items 
393       end
394     end
395   end
396   describe '一覧取得オプションに於いて' do
397     it 'includeキーを含んでいる' do
398       r = PanelPicture.list_opt
399       r.has_key?(:include).should be_true
400     end
401     it '2つの項目を含んでいる' do
402       r = PanelPicture.list_opt[:include]
403       r.should have(2).items
404     end
405     it 'コマを含んでいる' do
406       r = PanelPicture.list_opt[:include]
407       r.has_key?(:panel).should be_true
408     end
409       it 'コマは作家を含んでいる' do
410         r = PanelPicture.list_opt[:include]
411         r[:panel].has_key?(:author).should be_true
412       end
413     it '実素材を含んでいる' do
414       r = PanelPicture.list_opt[:include]
415       r.has_key?(:picture).should be_true
416     end
417       it '実素材は絵師を含んでいる' do
418         r = PanelPicture.list_opt[:include]
419         r[:picture].has_key?(:artist).should be_true
420       end
421       it '実素材はライセンスを含んでいる' do
422         r = PanelPicture.list_opt[:include]
423         r[:picture].has_key?(:license).should be_true
424       end
425   end
426   describe 'json一覧出力オプションに於いて' do
427     before do
428       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
429       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
430       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
431       @sbt = FactoryGirl.create :speech_balloon_template
432       @comic = FactoryGirl.create :comic, :author_id => @author.id, :visible => 1
433       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
434       @story = FactoryGirl.create :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
435       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :picture_id => @p.id,
436         :width => @p.width, :height => @p.height
437     end
438     it 'コマを含んでいる' do
439       r = PanelPicture.list.to_json PanelPicture.list_json_opt
440       j = JSON.parse r
441       i = j.first
442       i.has_key?('panel').should be_true
443     end
444       it 'コマは作家を含んでいる' do
445         r = PanelPicture.list.to_json PanelPicture.list_json_opt
446         j = JSON.parse r
447         i = j.first
448         s = i['panel']
449         s.has_key?('author').should be_true
450       end
451     it '実素材を含んでいる' do
452       r = PanelPicture.list.to_json PanelPicture.list_json_opt
453       j = JSON.parse r
454       i = j.first
455       i.has_key?('picture').should be_true
456     end
457       it '実素材は絵師を含んでいる' do
458         r = PanelPicture.list.to_json PanelPicture.list_json_opt
459         j = JSON.parse r
460         i = j.first
461         s = i['picture']
462         s.has_key?('artist').should be_true
463       end
464       it '実素材はライセンスを含んでいる' do
465         r = PanelPicture.list.to_json PanelPicture.list_json_opt
466         j = JSON.parse r
467         i = j.first
468         s = i['picture']
469         s.has_key?('license').should be_true
470       end
471   end
472   
473   describe '自分のコマ一覧取得に於いて' do
474     before do
475       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :picture_id => @p.id,
476         :width => @p.width, :height => @p.height
477     end
478     context 'つつがなく終わるとき' do
479       it '一覧取得オプションを利用している' do
480         PanelPicture.stub(:list_opt).with(any_args).and_return({:include => :panel})
481         PanelPicture.should_receive(:list_opt).with(any_args).exactly(1)
482         r = PanelPicture.mylist @author
483       end
484     end
485     it 'リストを返す' do
486       pl = PanelPicture.mylist @author
487       pl.should eq [@pp]
488     end
489     it '時系列で並んでいる' do
490       npl = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
491         :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
492       pl = PanelPicture.mylist @author
493       pl.should eq [npl, @pp]
494     end
495     it '他人のコマのコマ絵は公開コマでも含まない' do
496       hpl = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
497       npl = FactoryGirl.create :panel_picture, :panel_id => hpl.id, :picture_id => @p.id,
498         :width => @p.width, :height => @p.height
499       pl = PanelPicture.mylist @author
500       pl.should eq [@pp]
501     end
502     it '自分のコマのコマ絵は非公開コマでも含んでいる' do
503       pl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
504       ni = FactoryGirl.create :panel_picture, :panel_id => pl.id, :picture_id => @p.id,
505         :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
506       r = PanelPicture.mylist @author
507       r.should eq [ni, @pp]
508     end
509     context 'DBに5件あって1ページの件数を2件に変えたとして' do
510       before do
511         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
512           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
513         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
514           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
515         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
516           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
517         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
518           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
519       end
520       it '通常は2件を返す' do
521         r = PanelPicture.mylist @author, 1, 2
522         r.should have(2).items 
523       end
524       it 'page=1なら末尾2件を返す' do
525         #時系列で並んでいる
526         r = PanelPicture.mylist(@author, 1, 2)
527         r.should eq [@npl5, @npl4]
528       end
529       it 'page=2なら中間2件を返す' do
530         r = PanelPicture.mylist(@author, 2, 2)
531         r.should eq [@npl3, @npl2]
532       end
533       it 'page=3なら先頭1件を返す' do
534         r = PanelPicture.mylist(@author, 3, 2)
535         r.should eq [@pp]
536       end
537     end
538     context 'DBに5件あって1ページの件数を0件に変えたとして' do
539       before do
540         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
541           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
542         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
543           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
544         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
545           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
546         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
547           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
548         Author.stub(:default_panel_picture_page_size).and_return(2)
549       end
550       it '通常は全件(5件)を返す' do
551         r = PanelPicture.mylist @author, 5, 0
552         r.should have(5).items 
553       end
554     end
555   end
556   
557 end