OSDN Git Service

Merge branch 'v04' of git.sourceforge.jp:/gitroot/pettanr/pettanr
[pettanr/pettanr.git] / spec / models / panel_spec.rb
1 # -*- encoding: utf-8 -*-\r
2 require 'spec_helper'\r
3 #コマ\r
4 describe Panel do\r
5   before do\r
6     Factory :admin\r
7     @license = Factory :license\r
8     @user = Factory( :user_yas)\r
9     @author = @user.author\r
10     @artist = Factory :artist_yas, :author_id => @author.id\r
11     @other_user = Factory( :user_yas)\r
12     @other_author = @other_user.author\r
13     @op = Factory :original_picture, :artist_id => @artist.id, :license_id => @license.id\r
14     @rp = Factory :resource_picture, :original_picture_id => @op.id, :license_id => @license.id\r
15     @sbt = Factory :speech_balloon_template\r
16   end\r
17   \r
18   describe '検証に於いて' do\r
19     before do\r
20     end\r
21     \r
22     it 'オーソドックスなデータなら通る' do\r
23       @panel = Factory.build :panel, :author_id => @author.id\r
24       @panel.should be_valid\r
25     end\r
26     \r
27     context 'widthを検証するとき' do\r
28       before do\r
29         @panel = Factory.build :panel, :author_id => @author.id\r
30       end\r
31       it 'テストデータの確認' do\r
32         @panel.width = 1\r
33         @panel.should be_valid\r
34       end\r
35       it 'nullなら失敗する' do\r
36         @panel.width = nil\r
37         @panel.should_not be_valid\r
38       end\r
39       it '数値でなければ失敗する' do\r
40         @panel.width = 'a'\r
41         @panel.should_not be_valid\r
42       end\r
43       it '0なら失敗する' do\r
44         @panel.width = '0'\r
45         @panel.should_not be_valid\r
46       end\r
47       it '負でも失敗する' do\r
48         @panel.width = -1\r
49         @panel.should_not be_valid\r
50       end\r
51     end\r
52     context 'heightを検証するとき' do\r
53       before do\r
54         @panel = Factory.build :panel, :author_id => @author.id\r
55       end\r
56       it 'テストデータの確認' do\r
57         @panel.height = '1'\r
58         @panel.should be_valid\r
59       end\r
60       it 'nullなら失敗する' do\r
61         @panel.height = nil\r
62         @panel.should_not be_valid\r
63       end\r
64       it '数値でなければ失敗する' do\r
65         @panel.height = 'a'\r
66         @panel.should_not be_valid\r
67       end\r
68       it '0なら失敗する' do\r
69         @panel.height = '0'\r
70         @panel.should_not be_valid\r
71       end\r
72       it '負でも失敗する' do\r
73         @panel.height = -1\r
74         @panel.should_not be_valid\r
75       end\r
76     end\r
77     context 'borderを検証するとき' do\r
78       before do\r
79         @panel = Factory.build :panel, :author_id => @author.id\r
80       end\r
81       it 'テストデータの確認' do\r
82         @panel.border = '1'\r
83         @panel.should be_valid\r
84       end\r
85       it 'nullなら失敗する' do\r
86         @panel.border = nil\r
87         @panel.should_not be_valid\r
88       end\r
89       it '数値でなければ失敗する' do\r
90         @panel.border = 'a'\r
91         @panel.should_not be_valid\r
92       end\r
93       it '負なら失敗する' do\r
94         @panel.border = '-1'\r
95         @panel.should_not be_valid\r
96       end\r
97       it '0なら通る' do\r
98         @panel.border = 0\r
99         @panel.should be_valid\r
100       end\r
101     end\r
102     context 'xを検証するとき' do\r
103       before do\r
104         @panel = Factory.build :panel, :author_id => @author.id\r
105       end\r
106       it 'テストデータの確認' do\r
107         @panel.x = '1'\r
108         @panel.should be_valid\r
109       end\r
110       it '数値でなければ失敗する' do\r
111         @panel.x = 'a'\r
112         @panel.should_not be_valid\r
113       end\r
114       it '0なら通る' do\r
115         @panel.x = '0'\r
116         @panel.should be_valid\r
117       end\r
118       it '負でも通る' do\r
119         @panel.x = -1\r
120         @panel.should be_valid\r
121       end\r
122     end\r
123     context 'yを検証するとき' do\r
124       before do\r
125         @panel = Factory.build :panel, :author_id => @author.id\r
126       end\r
127       it 'テストデータの確認' do\r
128         @panel.y = '1'\r
129         @panel.should be_valid\r
130       end\r
131       it '数値でなければ失敗する' do\r
132         @panel.y = 'a'\r
133         @panel.should_not be_valid\r
134       end\r
135       it '0なら通る' do\r
136         @panel.y = '0'\r
137         @panel.should be_valid\r
138       end\r
139       it '負でも通る' do\r
140         @panel.y = -1\r
141         @panel.should be_valid\r
142       end\r
143     end\r
144     context 'zを検証するとき' do\r
145       before do\r
146         @panel = Factory.build :panel, :author_id => @author.id\r
147       end\r
148       it 'テストデータの確認' do\r
149         @panel.z = '1'\r
150         @panel.should be_valid\r
151       end\r
152       it '数値でなければ失敗する' do\r
153         @panel.z = 'a'\r
154         @panel.should_not be_valid\r
155       end\r
156       it '0なら失敗する' do\r
157         @panel.z = '0'\r
158         @panel.should_not be_valid\r
159       end\r
160       it '負なら失敗する' do\r
161         @panel.z = -1\r
162         @panel.should_not be_valid\r
163       end\r
164     end\r
165     context 'author_idを検証するとき' do\r
166       before do\r
167         @panel = Factory.build :panel, :author_id => @author.id\r
168       end\r
169       it 'テストデータの確認' do\r
170         @panel.author_id = @author.id\r
171         @panel.should be_valid\r
172       end\r
173       it 'nullなら失敗する' do\r
174         @panel.author_id = nil\r
175         @panel.should_not be_valid\r
176       end\r
177       it '数値でなければ失敗する' do\r
178         @panel.author_id = 'a'\r
179         @panel.should_not be_valid\r
180       end\r
181       it '存在する絵師でなければ失敗する' do\r
182         @panel.author_id = 0\r
183         @panel.should_not be_valid\r
184       end\r
185     end\r
186     context '全体を検証するとき' do\r
187       before do\r
188         @panel = Factory :panel, :author_id => @author.id\r
189       end\r
190     end\r
191   end\r
192   \r
193   describe 'デフォルト値補充に於いて' do\r
194     before do\r
195       @panel = Factory.build :panel, :author_id => @author.id\r
196     end\r
197     it 'borderは2を補充する' do\r
198       @panel.border = nil\r
199       @panel.supply_default\r
200       @panel.border.should eq 2\r
201     end\r
202   end\r
203   \r
204   describe '上書き補充に於いて' do\r
205     before do\r
206       @panel = Factory.build :panel, :author_id => @author.id\r
207     end\r
208     context 'author_idを補充' do\r
209       it 'ログイン中の作家idを補充する' do\r
210         @panel.author_id = nil\r
211         @panel.overwrite @author\r
212         @panel.author_id.should eq @author.id\r
213       end\r
214     end\r
215     \r
216   end\r
217   \r
218   describe '作者判定に於いて' do\r
219     before do\r
220     end\r
221     it '自作のコマならyes' do\r
222       panel = Factory :panel, :author_id => @author.id\r
223       panel.own?(@author).should == true\r
224     end\r
225     it '他人のコマならno' do\r
226       panel = Factory :panel, :author_id => @author.id\r
227       panel.own?(@other_author).should == false\r
228     end\r
229     it '作家が不明ならno' do\r
230       panel = Factory :panel, :author_id => @author.id\r
231       panel.own?(nil).should == false\r
232     end\r
233   end\r
234   describe '閲覧許可に於いて' do\r
235     before do\r
236     end\r
237     it '自作のコマを見るときは許可する' do\r
238       Panel.any_instance.stub(:own?).and_return(true)\r
239       Panel.any_instance.stub(:publish?).and_return(true)\r
240       panel = Factory :panel, :author_id => @author.id\r
241       panel.visible?(@author).should == true\r
242     end\r
243     it '自作のコマは非公開でも許可する' do\r
244       Panel.any_instance.stub(:own?).and_return(true)\r
245       Panel.any_instance.stub(:publish?).and_return(false)\r
246       panel = Factory :panel, :author_id => @author.id\r
247       panel.visible?(@author).should == true\r
248     end\r
249     it '他人のコマでも公開なら許可する' do\r
250       Panel.any_instance.stub(:own?).and_return(false)\r
251       Panel.any_instance.stub(:publish?).and_return(true)\r
252       panel = Factory :panel, :author_id => @author.id\r
253       panel.visible?(@author).should == true\r
254     end\r
255     it '他人のコマで非公開なら許可しない' do\r
256       Panel.any_instance.stub(:own?).and_return(false)\r
257       Panel.any_instance.stub(:publish?).and_return(false)\r
258       panel = Factory :panel, :author_id => @author.id\r
259       panel.visible?(@author).should == false\r
260     end\r
261   end\r
262   describe '単体取得に於いて' do\r
263     before do\r
264       @panel = Factory :panel, :author_id => @author.id\r
265     end\r
266     it '指定のコマを返す' do\r
267       Panel.any_instance.stub(:visible?).and_return(true)\r
268       pl = Panel.show @panel.id, @author\r
269       pl.should eq @panel\r
270     end\r
271     context '他人の非公開コミックのコマを開こうとしたとき' do\r
272       it '403Forbidden例外を返す' do\r
273         Panel.any_instance.stub(:visible?).and_return(false)\r
274         lambda{\r
275           Panel.show @panel.id, @author\r
276         }.should raise_error(ActiveRecord::Forbidden)\r
277       end\r
278     end\r
279     context '存在しないコマを開こうとしたとき' do\r
280       it '404RecordNotFound例外を返す' do\r
281         lambda{\r
282           Panel.show 110, @author\r
283         }.should raise_error(ActiveRecord::RecordNotFound)\r
284       end\r
285     end\r
286   end\r
287   describe '単体取得に於いて' do\r
288     before do\r
289       @panel = Factory :panel, :author_id => @author.id\r
290     end\r
291     it '指定のコマを返す' do\r
292       Panel.any_instance.stub(:own?).and_return(true)\r
293       pl = Panel.edit @panel.id, @author\r
294       pl.should eq @panel\r
295     end\r
296     context '他人のコマを開こうとしたとき' do\r
297       it '403Forbidden例外を返す' do\r
298         Panel.any_instance.stub(:own?).and_return(false)\r
299         lambda{\r
300           Panel.edit @panel.id, @author\r
301         }.should raise_error(ActiveRecord::Forbidden)\r
302       end\r
303     end\r
304     context '存在しないコマを開こうとしたとき' do\r
305       it '404RecordNotFound例外を返す' do\r
306         lambda{\r
307           Panel.edit 110, @author\r
308         }.should raise_error(ActiveRecord::RecordNotFound)\r
309       end\r
310     end\r
311   end\r
312   describe '関連テーブルプションに於いて' do\r
313     context 'オプションがないとき' do\r
314       it '3つの項目を含んでいる' do\r
315         r = Panel.show_include_opt\r
316         r.should have(3).items\r
317       end\r
318       it 'コマ絵を含んでいる' do\r
319         r = Panel.show_include_opt\r
320         r.has_key?(:panel_pictures).should be_true\r
321       end\r
322         it 'コマ絵は素材を含んでいる' do\r
323           r = Panel.show_include_opt\r
324           r[:panel_pictures].has_key?(:resource_picture).should be_true\r
325         end\r
326           it '素材は絵師を含んでいる' do\r
327             r = Panel.show_include_opt\r
328             r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
329           end\r
330           it '素材はライセンスを含んでいる' do\r
331             r = Panel.show_include_opt\r
332             r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
333           end\r
334       it 'フキダシを含んでいる' do\r
335         r = Panel.show_include_opt\r
336         r.has_key?(:speech_balloons).should be_true\r
337       end\r
338         it 'フキダシはフキダシ枠を含んでいる' do\r
339           r = Panel.show_include_opt\r
340           r[:speech_balloons].has_key?(:balloons).should be_true\r
341         end\r
342         it 'フキダシはセリフを含んでいる' do\r
343           r = Panel.show_include_opt\r
344           r[:speech_balloons].has_key?(:speeches).should be_true\r
345         end\r
346       it '作家を含んでいる' do\r
347         r = Panel.show_include_opt\r
348         r.has_key?(:author).should be_true\r
349       end\r
350     end\r
351     context 'オプションで原画を含ませたとき' do\r
352       it '4つの項目を含んでいる' do\r
353         r = Panel.show_include_opt(:include => {:test => {}})\r
354         r.should have(4).items\r
355       end\r
356       it 'testを含んでいる' do\r
357         r = Panel.show_include_opt(:include => {:test => {}})\r
358         r.has_key?(:test).should be_true\r
359       end\r
360     end\r
361   end\r
362   describe 'json単体出力オプションに於いて' do\r
363     it 'includeキーを含んでいる' do\r
364       r = Panel.show_json_include_opt\r
365       r.has_key?(:include).should be_true\r
366     end\r
367     it '3つの項目を含んでいる' do\r
368       r = Panel.show_json_include_opt[:include]\r
369       r.should have(3).items\r
370     end\r
371     it 'コマ絵を含んでいる' do\r
372       r = Panel.show_json_include_opt[:include]\r
373       r.has_key?(:panel_pictures).should be_true\r
374     end\r
375       it 'コマ絵は素材を含んでいる' do\r
376         r = Panel.show_json_include_opt[:include]\r
377         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
378       end\r
379         it '素材は絵師を含んでいる' do\r
380           r = Panel.show_json_include_opt[:include]\r
381           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
382         end\r
383         it '素材はライセンスを含んでいる' do\r
384           r = Panel.show_json_include_opt[:include]\r
385           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
386         end\r
387     it 'フキダシを含んでいる' do\r
388       r = Panel.show_include_opt\r
389       r.has_key?(:speech_balloons).should be_true\r
390     end\r
391       it 'フキダシはフキダシ枠を含んでいる' do\r
392         r = Panel.show_include_opt\r
393         r[:speech_balloons].has_key?(:balloons).should be_true\r
394       end\r
395       it 'フキダシはセリフを含んでいる' do\r
396         r = Panel.show_include_opt\r
397         r[:speech_balloons].has_key?(:speeches).should be_true\r
398       end\r
399     it '作家を含んでいる' do\r
400       r = Panel.show_json_include_opt[:include]\r
401       r.has_key?(:author).should be_true\r
402     end\r
403   end\r
404   describe '一覧取得に於いて' do\r
405     before do\r
406       @panel = Factory :panel, :author_id => @author.id\r
407     end\r
408     context 'page補正について' do\r
409       it '文字列から数値に変換される' do\r
410         Panel.page('8').should eq 8\r
411       end\r
412       it 'nilの場合は1になる' do\r
413         Panel.page().should eq 1\r
414       end\r
415       it '0以下の場合は1になる' do\r
416         Panel.page('0').should eq 1\r
417       end\r
418     end\r
419     context 'page_size補正について' do\r
420       it '文字列から数値に変換される' do\r
421         Panel.page_size('7').should eq 7\r
422       end\r
423       it 'nilの場合はPanel.default_page_sizeになる' do\r
424         Panel.page_size().should eq Panel.default_page_size\r
425       end\r
426       it '0以下の場合はPanel.default_page_sizeになる' do\r
427         Panel.page_size('0').should eq Panel.default_page_size\r
428       end\r
429       it 'Panel.max_page_sizeを超えた場合はPanel.max_page_sizeになる' do\r
430         Panel.page_size('1000').should eq Panel.max_page_size\r
431       end\r
432     end\r
433     it 'リストを返す' do\r
434       pl = Panel.list\r
435       pl.should eq [@panel]\r
436     end\r
437     it '時系列で並んでいる' do\r
438       npl = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
439       pl = Panel.list\r
440       pl.should eq [npl, @panel]\r
441     end\r
442     it '非公開のコマは含まない' do\r
443       npl = Factory :panel, :author_id => @author.id, :publish => 0\r
444       pl = Panel.list\r
445       pl.should eq [@panel]\r
446     end\r
447     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
448       before do\r
449         @npl2 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
450         @npl3 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
451         @npl4 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
452         @npl5 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
453         Panel.stub(:default_page_size).and_return(2)\r
454       end\r
455       it '通常は2件を返す' do\r
456         pl = Panel.list\r
457         pl.should have(2).items \r
458       end\r
459       it 'page=1なら末尾2件を返す' do\r
460         #時系列で並んでいる\r
461         pl = Panel.list( {}, 1)\r
462         pl.should eq [@npl5, @npl4]\r
463       end\r
464       it 'page=2なら中間2件を返す' do\r
465         pl = Panel.list({}, 2)\r
466         pl.should eq [@npl3, @npl2]\r
467       end\r
468       it 'page=3なら先頭1件を返す' do\r
469         pl = Panel.list({}, 3)\r
470         pl.should eq [@panel]\r
471       end\r
472     end\r
473   end\r
474   describe 'list関連テーブルプションに於いて' do\r
475     it 'includeキーを含んでいる' do\r
476       r = Panel.list_opt\r
477       r.has_key?(:include).should be_true\r
478     end\r
479     it '3つの項目を含んでいる' do\r
480       r = Panel.list_opt[:include]\r
481       r.should have(3).items\r
482     end\r
483     it 'コマ絵を含んでいる' do\r
484       r = Panel.list_opt[:include]\r
485       r.has_key?(:panel_pictures).should be_true\r
486     end\r
487       it 'コマ絵は素材を含んでいる' do\r
488         r = Panel.list_opt[:include]\r
489         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
490       end\r
491         it '素材は絵師を含んでいる' do\r
492           r = Panel.list_opt[:include]\r
493           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
494         end\r
495         it '素材はライセンスを含んでいる' do\r
496           r = Panel.list_opt[:include]\r
497           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
498         end\r
499     it 'フキダシを含んでいる' do\r
500       r = Panel.show_include_opt\r
501       r.has_key?(:speech_balloons).should be_true\r
502     end\r
503       it 'フキダシはフキダシ枠を含んでいる' do\r
504         r = Panel.show_include_opt\r
505         r[:speech_balloons].has_key?(:balloons).should be_true\r
506       end\r
507       it 'フキダシはセリフを含んでいる' do\r
508         r = Panel.show_include_opt\r
509         r[:speech_balloons].has_key?(:speeches).should be_true\r
510       end\r
511     it '作家を含んでいる' do\r
512       r = Panel.list_opt[:include]\r
513       r.has_key?(:author).should be_true\r
514     end\r
515   end\r
516   describe 'json一覧出力オプションに於いて' do\r
517     it 'includeキーを含んでいる' do\r
518       r = Panel.list_json_opt\r
519       r.has_key?(:include).should be_true\r
520     end\r
521     it '3つの項目を含んでいる' do\r
522       r = Panel.list_json_opt[:include]\r
523       r.should have(3).items\r
524     end\r
525     it 'コマ絵を含んでいる' do\r
526       r = Panel.list_json_opt[:include]\r
527       r.has_key?(:panel_pictures).should be_true\r
528     end\r
529       it 'コマ絵は素材を含んでいる' do\r
530         r = Panel.list_json_opt[:include]\r
531         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
532       end\r
533         it '素材は絵師を含んでいる' do\r
534           r = Panel.list_json_opt[:include]\r
535           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
536         end\r
537         it '素材はライセンスを含んでいる' do\r
538           r = Panel.list_json_opt[:include]\r
539           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
540         end\r
541     it 'フキダシを含んでいる' do\r
542       r = Panel.show_include_opt\r
543       r.has_key?(:speech_balloons).should be_true\r
544     end\r
545       it 'フキダシはフキダシ枠を含んでいる' do\r
546         r = Panel.show_include_opt\r
547         r[:speech_balloons].has_key?(:balloons).should be_true\r
548       end\r
549       it 'フキダシはセリフを含んでいる' do\r
550         r = Panel.show_include_opt\r
551         r[:speech_balloons].has_key?(:speeches).should be_true\r
552       end\r
553     it '作家を含んでいる' do\r
554       r = Panel.list_json_opt[:include]\r
555       r.has_key?(:author).should be_true\r
556     end\r
557   end\r
558   \r
559   #異常データ検出\r
560     #コマはコミックに従属しなくなったのでtで入れ替えるチェックは要らなくなった\r
561     #コマ絵とフキダシの整合チェックをする\r
562   describe 'id収集に於いて' do\r
563     context 'つつがなく終わるとき' do\r
564       it '第一パラメータで指定された配列中から第二引数のidを収集している' do\r
565         a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r
566           [{:panel_id => 3, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
567         r = Panel.collect_element_value a, :panel_id\r
568         r.should eq [1, 2, 3, 4]\r
569       end\r
570     end\r
571     context 'Nil除外指示があるとき' do\r
572       it '収集したpanel_idのうちnilは除外している' do\r
573         a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}, {:panel_id => nil, :a => 'a'}], \r
574           [{:panel_id => 3, :a => 'a'}, {:panel_id => nil, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
575         r = Panel.collect_element_value a, :panel_id, true\r
576         r.should eq [1, 2, 3, 4]\r
577       end\r
578     end\r
579   end\r
580   describe 'id一致チェックに於いて' do\r
581     #parent.idがNilのときはすべてNil。数値のときは全一致\r
582     context '親が既存(idが数値)のとき' do\r
583       it 'すべてid一致するときTrueを返す' do\r
584         r = Panel.validate_id [1, 1, 1, 1], 1\r
585         r.should be_true\r
586       end\r
587       it 'idが一致する中にNilが混じってもTrueを返す' do\r
588         r = Panel.validate_id [1, 1, 1, 1, nil], 1\r
589         r.should be_true\r
590       end\r
591       it 'すべて数値でも一致しないときFalseを返す' do\r
592         r = Panel.validate_id [1, 1, 1, 1, 2], 1\r
593         r.should be_false\r
594       end\r
595       it '数値とNilが混ざってもIDが一致しないときFalseを返す' do\r
596         r = Panel.validate_id [1, 1, nil, 2], 1\r
597         r.should be_false\r
598       end\r
599     end\r
600     context '親が新規(idがNil)のとき' do\r
601       it 'すべてNilはTrueを返す' do\r
602         r = Panel.validate_id [ nil,nil,nil,nil], nil\r
603         r.should be_true\r
604       end\r
605       it 'すべてnilでなければFalseを返す' do\r
606         r = Panel.validate_id [nil,nil,nil,nil, 2], nil\r
607         r.should be_false\r
608       end\r
609     end\r
610   end\r
611   describe 'idチェック単体に於いて' do\r
612     before do\r
613 #      @pp = Factory :panel_picture, :panel_id => @panel.id, :t => 1\r
614     end\r
615     context 'つつがなく終わるとき' do\r
616       it 'idを収集依頼している' do\r
617         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
618         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
619         Panel.stub(:validate_id).with(any_args).and_return(true)\r
620         r = Panel.validate_element_id [], :panel_id, nil\r
621       end\r
622       it '収集したidを一致チェック依頼している' do\r
623         Panel.should_receive(:validate_id).with(any_args).exactly(1)\r
624         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
625         Panel.stub(:validate_id).with(any_args).and_return(true)\r
626         r = Panel.validate_element_id [], :panel_id, nil\r
627       end\r
628     end\r
629     #実データでチェック\r
630     #依頼チェックだけでは不安なので最低限のチェックを\r
631     context 'コマ新規のとき' do\r
632       it 'コマ絵で正常通過している' do\r
633         @panel = Factory.build :panel, :author_id => @author.id\r
634         @panel.panel_pictures.build(\r
635           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
636         )\r
637         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
638         r.should be_true\r
639       end\r
640       it 'フキダシで正常通過している' do\r
641         @panel = Factory.build :panel, :author_id => @author.id\r
642         @panel.speech_balloons.build(\r
643           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
644         )\r
645         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
646         r.should be_true\r
647       end\r
648     end\r
649     context 'コマ既存のとき' do\r
650       it 'コマ絵で正常通過している' do\r
651         @panel = Factory :panel, :author_id => @author.id\r
652         @panel.panel_pictures.build(\r
653           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
654         )\r
655         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
656         r.should be_true\r
657       end\r
658       it 'フキダシで正常通過している' do\r
659         @panel = Factory :panel, :author_id => @author.id\r
660         @panel.speech_balloons.build(\r
661           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
662         )\r
663         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
664         r.should be_true\r
665       end\r
666     end\r
667     context 'フキダシ新規のとき' do\r
668       it 'バルーンで正常通過している' do\r
669         @panel = Factory.build :panel, :author_id => @author.id\r
670         @panel.speech_balloons.build(\r
671           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
672         )\r
673         @panel.speech_balloons.first.balloons.build(\r
674           Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
675         )\r
676         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
677         r.should be_true\r
678       end\r
679       it 'セリフで正常通過している' do\r
680         @panel = Factory.build :panel, :author_id => @author.id\r
681         @panel.speech_balloons.build(\r
682           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
683         )\r
684         @panel.speech_balloons.first.speeches.build(\r
685           Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
686         )\r
687         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
688         r.should be_true\r
689       end\r
690     end\r
691   end\r
692   describe 'idチェックリスト生成に於いて' do\r
693     before do\r
694       @panel = Factory.build :panel, :author_id => @author.id\r
695     end\r
696     context 'つつがなく終わるとき' do\r
697       it 'コマ部品とフキダシ部品のトータル2を返す' do\r
698         @panel.panel_pictures.build(\r
699           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
700         )\r
701         @panel.speech_balloons.build(\r
702           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
703         )\r
704         @panel.speech_balloons.first.balloons.build(\r
705           Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
706         )\r
707         @panel.speech_balloons.first.speeches.build(\r
708           Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
709         )\r
710         r = @panel.validate_id_list\r
711         r.should have(2).items\r
712       end\r
713       it 'コマ部品とフキダシ部品[複数:2]のケースでトータル3を返す' do\r
714         @panel.panel_pictures.build(\r
715           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
716         )\r
717         sb1 = @panel.speech_balloons.build(\r
718           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
719         )\r
720         sb1.balloons.build(\r
721           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
722         )\r
723         sb1.speeches.build(\r
724           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
725         )\r
726         sb2 = @panel.speech_balloons.build(\r
727           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
728         )\r
729         sb2.balloons.build(\r
730           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
731         )\r
732         sb2.speeches.build(\r
733           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
734         )\r
735         r = @panel.validate_id_list\r
736         r.should have(3).items\r
737       end\r
738     end\r
739   end\r
740   describe 'idチェック複合に於いて' do\r
741     before do\r
742       @panel = Factory.build :panel, :author_id => @author.id\r
743     end\r
744     context 'つつがなく終わるとき' do\r
745       it 'コマ部品とフキダシ部品の二回チェック依頼している' do\r
746         Panel.should_receive(:validate_element_id).with(any_args).exactly(2)\r
747         Panel.stub(:validate_element_id).with(any_args).and_return(true)\r
748         @panel.panel_pictures.build(\r
749           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
750         )\r
751         sb1 = @panel.speech_balloons.build(\r
752           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
753         )\r
754         sb1.balloons.build(\r
755           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
756         )\r
757         sb1.speeches.build(\r
758           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
759         )\r
760         r = Panel.validate_elements_id(@panel.validate_id_list)\r
761       end\r
762     end\r
763   end\r
764   describe 'シリアライズチェックに於いて' do\r
765     context 'つつがなく終わるとき' do\r
766       it '0からシリアライズされているならTrueを返す' do\r
767         r = Panel.validate_t [0, 1, 2]\r
768         r.should be_true\r
769       end\r
770       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
771         r = Panel.validate_t [0, 2, 1]\r
772         r.should be_true\r
773       end\r
774       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
775         r = Panel.validate_t [ 2, 1, 4, 3, 0]\r
776         r.should be_true\r
777       end\r
778     end\r
779     context '異常なとき' do\r
780       it '0から始まらないならFalseを返す' do\r
781         r = Panel.validate_t [1, 2, 3]\r
782         r.should be_false\r
783       end\r
784       it '連続していないならFalseを返す' do\r
785         r = Panel.validate_t [0, 1, 2, 4]\r
786         r.should be_false\r
787       end\r
788       it '連続していないならFalseを返す' do\r
789         r = Panel.validate_t [0, 1, 2, 4, 5]\r
790         r.should be_false\r
791       end\r
792     end\r
793   end\r
794   describe 'tチェック単体に於いて' do\r
795     before do\r
796     end\r
797     context 'つつがなく終わるとき' do\r
798       it 'コマ絵とフキダシのtを収集依頼している' do\r
799         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
800         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
801         Panel.stub(:validate_t).with(any_args).and_return(true)\r
802         r = Panel.validate_element_t [], :t\r
803       end\r
804       it '収集したtをシリアライズチェック依頼している' do\r
805         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
806         Panel.should_receive(:validate_t).with(any_args).exactly(1)\r
807         Panel.stub(:validate_t).with(any_args).and_return(true)\r
808         r = Panel.validate_element_t [], :t\r
809       end\r
810     end\r
811     #実データでチェック\r
812     #依頼チェックだけでは不安なので最低限のチェックを\r
813     context '新規のとき' do\r
814       it 'コマ絵で正常通過している' do\r
815         @panel = Factory.build :panel, :author_id => @author.id\r
816         @panel.panel_pictures.build(\r
817           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
818         )\r
819         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
820         r.should be_true\r
821       end\r
822       it 'フキダシで正常通過している' do\r
823         @panel = Factory.build :panel, :author_id => @author.id\r
824         @panel.speech_balloons.build(\r
825           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id, :t => nil)\r
826         )\r
827         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
828         r.should be_true\r
829       end\r
830     end\r
831     context '既存のとき' do\r
832       it 'コマ絵で正常通過している' do\r
833         @panel = Factory :panel, :author_id => @author.id\r
834         @panel.panel_pictures.build(\r
835           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
836         )\r
837         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
838         r.should be_true\r
839       end\r
840       it 'フキダシで正常通過している' do\r
841         @panel = Factory :panel, :author_id => @author.id\r
842         @panel.speech_balloons.build(\r
843           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
844         )\r
845         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
846         r.should be_true\r
847       end\r
848     end\r
849   end\r
850   describe '複合チェックに於いて' do\r
851     context 'つつがなく終わるとき' do\r
852       it 'している' do\r
853         @panel = Factory.build :panel, :author_id => @author.id\r
854         @panel.panel_pictures.build(\r
855           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
856         )\r
857         @panel.panel_pictures.build(\r
858           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 1)\r
859         )\r
860         sb1 = @panel.speech_balloons.build(\r
861           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
862         )\r
863         sb1.balloons.build(\r
864           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
865         )\r
866         sb1.speeches.build(\r
867           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
868         )\r
869         sb2 = @panel.speech_balloons.build(\r
870           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
871         )\r
872         sb2.balloons.build(\r
873           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
874         )\r
875         sb2.speeches.build(\r
876           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
877         )\r
878         r = @panel.validate_child\r
879         r.should be_true\r
880       end\r
881     end\r
882   end\r
883   describe '複合チェックに於いて' do\r
884     context 'つつがなく終わるとき' do\r
885       it 'している' do\r
886         @panel = Factory.build :panel, :author_id => @author.id\r
887         @panel.panel_pictures.build(\r
888           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
889         )\r
890         @panel.panel_pictures.build(\r
891           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 1)\r
892         )\r
893         sb1 = @panel.speech_balloons.build(\r
894           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
895         )\r
896         sb1.balloons.build(\r
897           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
898         )\r
899         sb1.speeches.build(\r
900           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
901         )\r
902         sb2 = @panel.speech_balloons.build(\r
903           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
904         )\r
905         sb2.balloons.build(\r
906           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
907         )\r
908         sb2.speeches.build(\r
909           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
910         )\r
911         r = @panel.validate_child\r
912         r.should be_true\r
913       end\r
914     end\r
915   end\r
916   describe '保存に於いて' do\r
917     context 'つつがなく終わるとき' do\r
918       it 'idチェックを依頼している' do\r
919         Panel.should_receive(:validate_elements_id).with(any_args).exactly(1)\r
920         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
921         @panel = Factory.build :panel, :author_id => @author.id\r
922         r = @panel.store\r
923       end\r
924       it '保存を依頼している' do\r
925         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
926         Panel.any_instance.should_receive(:save).with(any_args).exactly(1)\r
927         Panel.any_instance.stub(:save).with(any_args).and_return(true)\r
928         @panel = Factory.build :panel, :author_id => @author.id\r
929         r = @panel.store\r
930       end\r
931       it 'Trueを返す' do\r
932         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
933         @panel = Factory.build :panel, :author_id => @author.id\r
934         r = @panel.store\r
935         r.should be_true\r
936       end\r
937       it 'エラーメッセージがセットされていない' do\r
938         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
939         @panel = Factory :panel, :author_id => @author.id\r
940         r = @panel.store\r
941         @panel.errors.empty?.should be_true\r
942       end\r
943       context '新規のとき' do\r
944         it 'Trueを返す' do\r
945           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
946           @panel = Factory.build :panel, :author_id => @author.id\r
947           r = @panel.store\r
948           r.should be_true\r
949         end\r
950         it '行が追加されている' do\r
951           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
952           @panel = Factory.build :panel, :author_id => @author.id\r
953           lambda {\r
954             r = @panel.store\r
955           }.should change(Panel, :count)\r
956         end\r
957       end\r
958       context '更新のとき' do\r
959         it 'Trueを返す' do\r
960           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
961           @panel = Factory :panel, :author_id => @author.id\r
962           r = @panel.store\r
963           r.should be_true\r
964         end\r
965         it '行が追加されていない' do\r
966           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
967           @panel = Factory :panel, :author_id => @author.id\r
968           lambda {\r
969             r = @panel.store\r
970           }.should_not change(Panel, :count)\r
971         end\r
972       end\r
973     end\r
974     context 'idチェックが失敗するとき' do\r
975       it 'Falseを返す' do\r
976         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
977         @panel = Factory :panel, :author_id => @author.id\r
978         r = @panel.store\r
979         r.should be_false\r
980       end\r
981       it 'エラーメッセージがセットされている' do\r
982         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
983         @panel = Factory :panel, :author_id => @author.id\r
984         r = @panel.store\r
985         @panel.errors.empty?.should be_false\r
986       end\r
987       it '行が追加されていない' do\r
988         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
989         @panel = Factory.build :panel, :author_id => @author.id\r
990         lambda {\r
991           r = @panel.store\r
992         }.should_not change(Panel, :count)\r
993       end\r
994     end\r
995   end\r
996 end\r