OSDN Git Service

t#29400
[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     FactoryGirl.create :admin
7     @user = FactoryGirl.create( :user_yas)
8     @author = @user.author
9     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
10     @other_user = FactoryGirl.create( :user_yas)
11     @other_author = @other_user.author
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\r
72         @pp.should_not be_valid\r
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\r
323       it '一覧取得オプションを利用している' do\r
324         PanelPicture.stub(:list_opt).with(any_args).and_return({:include => :panel})\r
325         PanelPicture.should_receive(:list_opt).with(any_args).exactly(1)\r
326         r = PanelPicture.list
327       end\r
328     end\r
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       end
389       it '通常は全件(5件)を返す' do
390         r = PanelPicture.list 5, 0
391         r.should have(5).items 
392       end
393     end
394   end
395   describe 'list関連テーブルプションに於いて' do
396     it 'includeキーを含んでいる' do
397       r = PanelPicture.list_opt
398       r.has_key?(:include).should be_true
399     end
400     it '2つの項目を含んでいる' do
401       r = PanelPicture.list_opt[:include]
402       r.should have(2).items
403     end
404     it 'コマを含んでいる' do
405       r = PanelPicture.list_opt[:include]
406       r.has_key?(:panel).should be_true
407     end
408       it 'コマは作家を含んでいる' do
409         r = PanelPicture.list_opt[:include]
410         r[:panel].has_key?(:author).should be_true
411       end
412     it '実素材を含んでいる' do
413       r = PanelPicture.list_opt[:include]
414       r.has_key?(:picture).should be_true
415     end
416       it '実素材は絵師を含んでいる' do
417         r = PanelPicture.list_opt[:include]
418         r[:picture].has_key?(:artist).should be_true
419       end
420       it '実素材はライセンスを含んでいる' do
421         r = PanelPicture.list_opt[:include]
422         r[:picture].has_key?(:license).should be_true
423       end
424   end
425   describe 'json一覧出力オプションに於いて' do
426     it 'includeキーを含んでいる' do
427       r = PanelPicture.list_json_opt
428       r.has_key?(:include).should be_true
429     end
430     it '2つの項目を含んでいる' do
431       r = PanelPicture.list_json_opt[:include]
432       r.should have(2).items
433     end
434     it 'コマを含んでいる' do
435       r = PanelPicture.list_json_opt[:include]
436       r.has_key?(:panel).should be_true
437     end
438       it 'コマは作家を含んでいる' do
439         r = PanelPicture.list_json_opt[:include]
440         r[:panel].has_key?(:author).should be_true
441       end
442     it '実素材を含んでいる' do
443       r = PanelPicture.list_json_opt[:include]
444       r.has_key?(:picture).should be_true
445     end
446       it '実素材は絵師を含んでいる' do
447         r = PanelPicture.list_json_opt[:include]
448         r[:picture].has_key?(:artist).should be_true
449       end
450       it '実素材はライセンスを含んでいる' do
451         r = PanelPicture.list_json_opt[:include]
452         r[:picture].has_key?(:license).should be_true
453       end
454   end
455   
456   describe '自分のコマ一覧取得に於いて' do
457     before do
458       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :picture_id => @p.id,
459         :width => @p.width, :height => @p.height
460     end
461     context 'つつがなく終わるとき' do\r
462       it '一覧取得オプションを利用している' do\r
463         PanelPicture.stub(:list_opt).with(any_args).and_return({:include => :panel})\r
464         PanelPicture.should_receive(:list_opt).with(any_args).exactly(1)\r
465         r = PanelPicture.mylist @author
466       end\r
467     end\r
468     it 'リストを返す' do
469       pl = PanelPicture.mylist @author
470       pl.should eq [@pp]
471     end
472     it '時系列で並んでいる' do
473       npl = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
474         :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
475       pl = PanelPicture.mylist @author
476       pl.should eq [npl, @pp]
477     end
478     it '他人のコマのコマ絵は公開コマでも含まない' do
479       hpl = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
480       npl = FactoryGirl.create :panel_picture, :panel_id => hpl.id, :picture_id => @p.id,
481         :width => @p.width, :height => @p.height
482       pl = PanelPicture.mylist @author
483       pl.should eq [@pp]
484     end
485     it '自分のコマのコマ絵は非公開コマでも含んでいる' do
486       pl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
487       ni = FactoryGirl.create :panel_picture, :panel_id => pl.id, :picture_id => @p.id,
488         :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
489       r = PanelPicture.mylist @author
490       r.should eq [ni, @pp]
491     end
492     context 'DBに5件あって1ページの件数を2件に変えたとして' do
493       before do
494         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
495           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
496         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
497           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
498         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
499           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
500         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
501           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
502       end
503       it '通常は2件を返す' do
504         r = PanelPicture.mylist @author, 1, 2
505         r.should have(2).items 
506       end
507       it 'page=1なら末尾2件を返す' do
508         #時系列で並んでいる
509         r = PanelPicture.mylist(@author, 1, 2)
510         r.should eq [@npl5, @npl4]
511       end
512       it 'page=2なら中間2件を返す' do
513         r = PanelPicture.mylist(@author, 2, 2)
514         r.should eq [@npl3, @npl2]
515       end
516       it 'page=3なら先頭1件を返す' do
517         r = PanelPicture.mylist(@author, 3, 2)
518         r.should eq [@pp]
519       end
520     end
521     context 'DBに5件あって1ページの件数を0件に変えたとして' do
522       before do
523         @npl2 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :picture_id => @p.id,
524           :width => @p.width, :height => @p.height, :updated_at => Time.now + 100
525         @npl3 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 2, :picture_id => @p.id,
526           :width => @p.width, :height => @p.height, :updated_at => Time.now + 200
527         @npl4 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 3, :picture_id => @p.id,
528           :width => @p.width, :height => @p.height, :updated_at => Time.now + 300
529         @npl5 = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 4, :picture_id => @p.id,
530           :width => @p.width, :height => @p.height, :updated_at => Time.now + 400
531       end
532       it '通常は全件(5件)を返す' do
533         r = PanelPicture.mylist @author, 5, 0
534         r.should have(5).items 
535       end
536     end
537   end
538   
539 end