OSDN Git Service

t#29045:create overwrite on panel
[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       Comic.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     context 'オプションがないとき' do\r
289       it '3つの項目を含んでいる' do\r
290         r = Panel.show_include_opt\r
291         r.should have(3).items\r
292       end\r
293       it 'コマ絵を含んでいる' do\r
294         r = Panel.show_include_opt\r
295         r.has_key?(:panel_pictures).should be_true\r
296       end\r
297         it 'コマ絵は素材を含んでいる' do\r
298           r = Panel.show_include_opt\r
299           r[:panel_pictures].has_key?(:resource_picture).should be_true\r
300         end\r
301           it '素材は絵師を含んでいる' do\r
302             r = Panel.show_include_opt\r
303             r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
304           end\r
305           it '素材はライセンスを含んでいる' do\r
306             r = Panel.show_include_opt\r
307             r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
308           end\r
309       it 'フキダシを含んでいる' do\r
310         r = Panel.show_include_opt\r
311         r.has_key?(:speech_balloons).should be_true\r
312       end\r
313         it 'フキダシはフキダシ枠を含んでいる' do\r
314           r = Panel.show_include_opt\r
315           r[:speech_balloons].has_key?(:balloons).should be_true\r
316         end\r
317         it 'フキダシはセリフを含んでいる' do\r
318           r = Panel.show_include_opt\r
319           r[:speech_balloons].has_key?(:speeches).should be_true\r
320         end\r
321       it '作家を含んでいる' do\r
322         r = Panel.show_include_opt\r
323         r.has_key?(:author).should be_true\r
324       end\r
325     end\r
326     context 'オプションで原画を含ませたとき' do\r
327       it '4つの項目を含んでいる' do\r
328         r = Panel.show_include_opt(:include => {:test => {}})\r
329         r.should have(4).items\r
330       end\r
331       it 'testを含んでいる' do\r
332         r = Panel.show_include_opt(:include => {:test => {}})\r
333         r.has_key?(:test).should be_true\r
334       end\r
335     end\r
336   end\r
337   describe 'json単体出力オプションに於いて' do\r
338     it 'includeキーを含んでいる' do\r
339       r = Panel.show_json_include_opt\r
340       r.has_key?(:include).should be_true\r
341     end\r
342     it '3つの項目を含んでいる' do\r
343       r = Panel.show_json_include_opt[:include]\r
344       r.should have(3).items\r
345     end\r
346     it 'コマ絵を含んでいる' do\r
347       r = Panel.show_json_include_opt[:include]\r
348       r.has_key?(:panel_pictures).should be_true\r
349     end\r
350       it 'コマ絵は素材を含んでいる' do\r
351         r = Panel.show_json_include_opt[:include]\r
352         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
353       end\r
354         it '素材は絵師を含んでいる' do\r
355           r = Panel.show_json_include_opt[:include]\r
356           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
357         end\r
358         it '素材はライセンスを含んでいる' do\r
359           r = Panel.show_json_include_opt[:include]\r
360           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
361         end\r
362     it 'フキダシを含んでいる' do\r
363       r = Panel.show_include_opt\r
364       r.has_key?(:speech_balloons).should be_true\r
365     end\r
366       it 'フキダシはフキダシ枠を含んでいる' do\r
367         r = Panel.show_include_opt\r
368         r[:speech_balloons].has_key?(:balloons).should be_true\r
369       end\r
370       it 'フキダシはセリフを含んでいる' do\r
371         r = Panel.show_include_opt\r
372         r[:speech_balloons].has_key?(:speeches).should be_true\r
373       end\r
374     it '作家を含んでいる' do\r
375       r = Panel.show_json_include_opt[:include]\r
376       r.has_key?(:author).should be_true\r
377     end\r
378   end\r
379   describe '一覧取得に於いて' do\r
380     before do\r
381       @panel = Factory :panel, :author_id => @author.id\r
382     end\r
383     context 'page補正について' do\r
384       it '文字列から数値に変換される' do\r
385         Panel.page('8').should eq 8\r
386       end\r
387       it 'nilの場合は1になる' do\r
388         Panel.page().should eq 1\r
389       end\r
390       it '0以下の場合は1になる' do\r
391         Panel.page('0').should eq 1\r
392       end\r
393     end\r
394     context 'page_size補正について' do\r
395       it '文字列から数値に変換される' do\r
396         Panel.page_size('7').should eq 7\r
397       end\r
398       it 'nilの場合はPanel.default_page_sizeになる' do\r
399         Panel.page_size().should eq Panel.default_page_size\r
400       end\r
401       it '0以下の場合はPanel.default_page_sizeになる' do\r
402         Panel.page_size('0').should eq Panel.default_page_size\r
403       end\r
404       it 'Panel.max_page_sizeを超えた場合はPanel.max_page_sizeになる' do\r
405         Panel.page_size('1000').should eq Panel.max_page_size\r
406       end\r
407     end\r
408     it 'リストを返す' do\r
409       pl = Panel.list\r
410       pl.should eq [@panel]\r
411     end\r
412     it '時系列で並んでいる' do\r
413       npl = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
414       pl = Panel.list\r
415       pl.should eq [npl, @panel]\r
416     end\r
417     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
418       before do\r
419         @npl2 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
420         @npl3 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
421         @npl4 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
422         @npl5 = Factory :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
423         Panel.stub(:default_page_size).and_return(2)\r
424       end\r
425       it '通常は2件を返す' do\r
426         pl = Panel.list\r
427         pl.should have(2).items \r
428       end\r
429       it 'page=1なら末尾2件を返す' do\r
430         #時系列で並んでいる\r
431         pl = Panel.list( {}, 1)\r
432         pl.should eq [@npl5, @npl4]\r
433       end\r
434       it 'page=2なら中間2件を返す' do\r
435         pl = Panel.list({}, 2)\r
436         pl.should eq [@npl3, @npl2]\r
437       end\r
438       it 'page=3なら先頭1件を返す' do\r
439         pl = Panel.list({}, 3)\r
440         pl.should eq [@panel]\r
441       end\r
442     end\r
443   end\r
444   describe 'list関連テーブルプションに於いて' do\r
445     it 'includeキーを含んでいる' do\r
446       r = Panel.list_opt\r
447       r.has_key?(:include).should be_true\r
448     end\r
449     it '3つの項目を含んでいる' do\r
450       r = Panel.list_opt[:include]\r
451       r.should have(3).items\r
452     end\r
453     it 'コマ絵を含んでいる' do\r
454       r = Panel.list_opt[:include]\r
455       r.has_key?(:panel_pictures).should be_true\r
456     end\r
457       it 'コマ絵は素材を含んでいる' do\r
458         r = Panel.list_opt[:include]\r
459         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
460       end\r
461         it '素材は絵師を含んでいる' do\r
462           r = Panel.list_opt[:include]\r
463           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
464         end\r
465         it '素材はライセンスを含んでいる' do\r
466           r = Panel.list_opt[:include]\r
467           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
468         end\r
469     it 'フキダシを含んでいる' do\r
470       r = Panel.show_include_opt\r
471       r.has_key?(:speech_balloons).should be_true\r
472     end\r
473       it 'フキダシはフキダシ枠を含んでいる' do\r
474         r = Panel.show_include_opt\r
475         r[:speech_balloons].has_key?(:balloons).should be_true\r
476       end\r
477       it 'フキダシはセリフを含んでいる' do\r
478         r = Panel.show_include_opt\r
479         r[:speech_balloons].has_key?(:speeches).should be_true\r
480       end\r
481     it '作家を含んでいる' do\r
482       r = Panel.list_opt[:include]\r
483       r.has_key?(:author).should be_true\r
484     end\r
485   end\r
486   describe 'json一覧出力オプションに於いて' do\r
487     it 'includeキーを含んでいる' do\r
488       r = Panel.list_json_opt\r
489       r.has_key?(:include).should be_true\r
490     end\r
491     it '3つの項目を含んでいる' do\r
492       r = Panel.list_json_opt[:include]\r
493       r.should have(3).items\r
494     end\r
495     it 'コマ絵を含んでいる' do\r
496       r = Panel.list_json_opt[:include]\r
497       r.has_key?(:panel_pictures).should be_true\r
498     end\r
499       it 'コマ絵は素材を含んでいる' do\r
500         r = Panel.list_json_opt[:include]\r
501         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
502       end\r
503         it '素材は絵師を含んでいる' do\r
504           r = Panel.list_json_opt[:include]\r
505           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
506         end\r
507         it '素材はライセンスを含んでいる' do\r
508           r = Panel.list_json_opt[:include]\r
509           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
510         end\r
511     it 'フキダシを含んでいる' do\r
512       r = Panel.show_include_opt\r
513       r.has_key?(:speech_balloons).should be_true\r
514     end\r
515       it 'フキダシはフキダシ枠を含んでいる' do\r
516         r = Panel.show_include_opt\r
517         r[:speech_balloons].has_key?(:balloons).should be_true\r
518       end\r
519       it 'フキダシはセリフを含んでいる' do\r
520         r = Panel.show_include_opt\r
521         r[:speech_balloons].has_key?(:speeches).should be_true\r
522       end\r
523     it '作家を含んでいる' do\r
524       r = Panel.list_json_opt[:include]\r
525       r.has_key?(:author).should be_true\r
526     end\r
527   end\r
528   \r
529   #異常データ検出\r
530     #コマはコミックに従属しなくなったのでtで入れ替えるチェックは要らなくなった\r
531     #コマ絵とフキダシの整合チェックをする\r
532   describe 'id収集に於いて' do\r
533     context 'つつがなく終わるとき' do\r
534       it '第一パラメータで指定された配列中から第二引数のidを収集している' do\r
535         a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r
536           [{:panel_id => 3, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
537         r = Panel.collect_element_value a, :panel_id\r
538         r.should eq [1, 2, 3, 4]\r
539       end\r
540     end\r
541     context 'Nil除外指示があるとき' do\r
542       it '収集したpanel_idのうちnilは除外している' do\r
543         a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}, {:panel_id => nil, :a => 'a'}], \r
544           [{:panel_id => 3, :a => 'a'}, {:panel_id => nil, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
545         r = Panel.collect_element_value a, :panel_id, true\r
546         r.should eq [1, 2, 3, 4]\r
547       end\r
548     end\r
549   end\r
550   describe 'id一致チェックに於いて' do\r
551     #parent.idがNilのときはすべてNil。数値のときは全一致\r
552     context '親が既存(idが数値)のとき' do\r
553       it 'すべてid一致するときTrueを返す' do\r
554         r = Panel.validate_id [1, 1, 1, 1], 1\r
555         r.should be_true\r
556       end\r
557       it 'idが一致する中にNilが混じってもTrueを返す' do\r
558         r = Panel.validate_id [1, 1, 1, 1, nil], 1\r
559         r.should be_true\r
560       end\r
561       it 'すべて数値でも一致しないときFalseを返す' do\r
562         r = Panel.validate_id [1, 1, 1, 1, 2], 1\r
563         r.should be_false\r
564       end\r
565       it '数値とNilが混ざってもIDが一致しないときFalseを返す' do\r
566         r = Panel.validate_id [1, 1, nil, 2], 1\r
567         r.should be_false\r
568       end\r
569     end\r
570     context '親が新規(idがNil)のとき' do\r
571       it 'すべてNilはTrueを返す' do\r
572         r = Panel.validate_id [ nil,nil,nil,nil], nil\r
573         r.should be_true\r
574       end\r
575       it 'すべてnilでなければFalseを返す' do\r
576         r = Panel.validate_id [nil,nil,nil,nil, 2], nil\r
577         r.should be_false\r
578       end\r
579     end\r
580   end\r
581   describe 'idチェック単体に於いて' do\r
582     before do\r
583 #      @pp = Factory :panel_picture, :panel_id => @panel.id, :t => 1\r
584     end\r
585     context 'つつがなく終わるとき' do\r
586       it 'idを収集依頼している' do\r
587         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
588         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
589         Panel.stub(:validate_id).with(any_args).and_return(true)\r
590         r = Panel.validate_element_id [], :panel_id, nil\r
591       end\r
592       it '収集したidを一致チェック依頼している' do\r
593         Panel.should_receive(:validate_id).with(any_args).exactly(1)\r
594         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
595         Panel.stub(:validate_id).with(any_args).and_return(true)\r
596         r = Panel.validate_element_id [], :panel_id, nil\r
597       end\r
598     end\r
599     #実データでチェック\r
600     #依頼チェックだけでは不安なので最低限のチェックを\r
601     context 'コマ新規のとき' do\r
602       it 'コマ絵で正常通過している' do\r
603         @panel = Factory.build :panel, :author_id => @author.id\r
604         @panel.panel_pictures.build(\r
605           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
606         )\r
607         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
608         r.should be_true\r
609       end\r
610       it 'フキダシで正常通過している' do\r
611         @panel = Factory.build :panel, :author_id => @author.id\r
612         @panel.speech_balloons.build(\r
613           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
614         )\r
615         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
616         r.should be_true\r
617       end\r
618     end\r
619     context 'コマ既存のとき' do\r
620       it 'コマ絵で正常通過している' do\r
621         @panel = Factory :panel, :author_id => @author.id\r
622         @panel.panel_pictures.build(\r
623           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
624         )\r
625         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
626         r.should be_true\r
627       end\r
628       it 'フキダシで正常通過している' do\r
629         @panel = Factory :panel, :author_id => @author.id\r
630         @panel.speech_balloons.build(\r
631           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
632         )\r
633         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
634         r.should be_true\r
635       end\r
636     end\r
637     context 'フキダシ新規のとき' do\r
638       it 'バルーンで正常通過している' do\r
639         @panel = Factory.build :panel, :author_id => @author.id\r
640         @panel.speech_balloons.build(\r
641           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
642         )\r
643         @panel.speech_balloons.first.balloons.build(\r
644           Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
645         )\r
646         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
647         r.should be_true\r
648       end\r
649       it 'セリフで正常通過している' do\r
650         @panel = Factory.build :panel, :author_id => @author.id\r
651         @panel.speech_balloons.build(\r
652           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
653         )\r
654         @panel.speech_balloons.first.speeches.build(\r
655           Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
656         )\r
657         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
658         r.should be_true\r
659       end\r
660     end\r
661   end\r
662   describe 'idチェックリスト生成に於いて' do\r
663     before do\r
664       @panel = Factory.build :panel, :author_id => @author.id\r
665     end\r
666     context 'つつがなく終わるとき' do\r
667       it 'コマ部品とフキダシ部品のトータル2を返す' do\r
668         @panel.panel_pictures.build(\r
669           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
670         )\r
671         @panel.speech_balloons.build(\r
672           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
673         )\r
674         @panel.speech_balloons.first.balloons.build(\r
675           Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
676         )\r
677         @panel.speech_balloons.first.speeches.build(\r
678           Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
679         )\r
680         r = @panel.validate_id_list\r
681         r.should have(2).items\r
682       end\r
683       it 'コマ部品とフキダシ部品[複数:2]のケースでトータル3を返す' do\r
684         @panel.panel_pictures.build(\r
685           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
686         )\r
687         sb1 = @panel.speech_balloons.build(\r
688           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
689         )\r
690         sb1.balloons.build(\r
691           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
692         )\r
693         sb1.speeches.build(\r
694           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
695         )\r
696         sb2 = @panel.speech_balloons.build(\r
697           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
698         )\r
699         sb2.balloons.build(\r
700           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
701         )\r
702         sb2.speeches.build(\r
703           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
704         )\r
705         r = @panel.validate_id_list\r
706         r.should have(3).items\r
707       end\r
708     end\r
709   end\r
710   describe 'idチェック複合に於いて' do\r
711     before do\r
712       @panel = Factory.build :panel, :author_id => @author.id\r
713     end\r
714     context 'つつがなく終わるとき' do\r
715       it 'コマ部品とフキダシ部品の二回チェック依頼している' do\r
716         Panel.should_receive(:validate_element_id).with(any_args).exactly(2)\r
717         Panel.stub(:validate_element_id).with(any_args).and_return(true)\r
718         @panel.panel_pictures.build(\r
719           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
720         )\r
721         sb1 = @panel.speech_balloons.build(\r
722           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
723         )\r
724         sb1.balloons.build(\r
725           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
726         )\r
727         sb1.speeches.build(\r
728           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
729         )\r
730         r = Panel.validate_elements_id(@panel.validate_id_list)\r
731       end\r
732     end\r
733   end\r
734   describe 'シリアライズチェックに於いて' do\r
735     context 'つつがなく終わるとき' do\r
736       it '0からシリアライズされているならTrueを返す' do\r
737         r = Panel.validate_t [0, 1, 2]\r
738         r.should be_true\r
739       end\r
740       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
741         r = Panel.validate_t [0, 2, 1]\r
742         r.should be_true\r
743       end\r
744       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
745         r = Panel.validate_t [ 2, 1, 4, 3, 0]\r
746         r.should be_true\r
747       end\r
748     end\r
749     context '異常なとき' do\r
750       it '0から始まらないならFalseを返す' do\r
751         r = Panel.validate_t [1, 2, 3]\r
752         r.should be_false\r
753       end\r
754       it '連続していないならFalseを返す' do\r
755         r = Panel.validate_t [0, 1, 2, 4]\r
756         r.should be_false\r
757       end\r
758       it '連続していないならFalseを返す' do\r
759         r = Panel.validate_t [0, 1, 2, 4, 5]\r
760         r.should be_false\r
761       end\r
762     end\r
763   end\r
764   describe 'tチェック単体に於いて' do\r
765     before do\r
766     end\r
767     context 'つつがなく終わるとき' do\r
768       it 'コマ絵とフキダシのtを収集依頼している' do\r
769         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
770         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
771         Panel.stub(:validate_t).with(any_args).and_return(true)\r
772         r = Panel.validate_element_t [], :t\r
773       end\r
774       it '収集したtをシリアライズチェック依頼している' do\r
775         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
776         Panel.should_receive(:validate_t).with(any_args).exactly(1)\r
777         Panel.stub(:validate_t).with(any_args).and_return(true)\r
778         r = Panel.validate_element_t [], :t\r
779       end\r
780     end\r
781     #実データでチェック\r
782     #依頼チェックだけでは不安なので最低限のチェックを\r
783     context '新規のとき' do\r
784       it 'コマ絵で正常通過している' do\r
785         @panel = Factory.build :panel, :author_id => @author.id\r
786         @panel.panel_pictures.build(\r
787           Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
788         )\r
789         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
790         r.should be_true\r
791       end\r
792       it 'フキダシで正常通過している' do\r
793         @panel = Factory.build :panel, :author_id => @author.id\r
794         @panel.speech_balloons.build(\r
795           Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id, :t => nil)\r
796         )\r
797         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
798         r.should be_true\r
799       end\r
800     end\r
801     context '既存のとき' do\r
802       it 'コマ絵で正常通過している' do\r
803         @panel = Factory :panel, :author_id => @author.id\r
804         @panel.panel_pictures.build(\r
805           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
806         )\r
807         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
808         r.should be_true\r
809       end\r
810       it 'フキダシで正常通過している' do\r
811         @panel = Factory :panel, :author_id => @author.id\r
812         @panel.speech_balloons.build(\r
813           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
814         )\r
815         r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
816         r.should be_true\r
817       end\r
818     end\r
819   end\r
820   describe '複合チェックに於いて' do\r
821     context 'つつがなく終わるとき' do\r
822       it 'している' do\r
823         @panel = Factory.build :panel, :author_id => @author.id\r
824         @panel.panel_pictures.build(\r
825           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
826         )\r
827         @panel.panel_pictures.build(\r
828           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 1)\r
829         )\r
830         sb1 = @panel.speech_balloons.build(\r
831           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
832         )\r
833         sb1.balloons.build(\r
834           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
835         )\r
836         sb1.speeches.build(\r
837           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
838         )\r
839         sb2 = @panel.speech_balloons.build(\r
840           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
841         )\r
842         sb2.balloons.build(\r
843           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
844         )\r
845         sb2.speeches.build(\r
846           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
847         )\r
848         r = @panel.validate_child\r
849         r.should be_true\r
850       end\r
851     end\r
852   end\r
853   describe '複合チェックに於いて' do\r
854     context 'つつがなく終わるとき' do\r
855       it 'している' do\r
856         @panel = Factory.build :panel, :author_id => @author.id\r
857         @panel.panel_pictures.build(\r
858           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
859         )\r
860         @panel.panel_pictures.build(\r
861           Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 1)\r
862         )\r
863         sb1 = @panel.speech_balloons.build(\r
864           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
865         )\r
866         sb1.balloons.build(\r
867           Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
868         )\r
869         sb1.speeches.build(\r
870           Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
871         )\r
872         sb2 = @panel.speech_balloons.build(\r
873           Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
874         )\r
875         sb2.balloons.build(\r
876           Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
877         )\r
878         sb2.speeches.build(\r
879           Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
880         )\r
881         r = @panel.validate_child\r
882         r.should be_true\r
883       end\r
884     end\r
885   end\r
886   describe '保存に於いて' do\r
887     context 'つつがなく終わるとき' do\r
888       it 'idチェックを依頼している' do\r
889         Panel.should_receive(:validate_elements_id).with(any_args).exactly(1)\r
890         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
891         @panel = Factory.build :panel, :author_id => @author.id\r
892         r = @panel.store\r
893       end\r
894       it '保存を依頼している' do\r
895         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
896         Panel.any_instance.should_receive(:save).with(any_args).exactly(1)\r
897         Panel.any_instance.stub(:save).with(any_args).and_return(true)\r
898         @panel = Factory.build :panel, :author_id => @author.id\r
899         r = @panel.store\r
900       end\r
901       it 'Trueを返す' do\r
902         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
903         @panel = Factory.build :panel, :author_id => @author.id\r
904         r = @panel.store\r
905         r.should be_true\r
906       end\r
907       it 'エラーメッセージがセットされていない' do\r
908         Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
909         @panel = Factory :panel, :author_id => @author.id\r
910         r = @panel.store\r
911         @panel.errors.empty?.should be_true\r
912       end\r
913       context '新規のとき' do\r
914         it 'Trueを返す' do\r
915           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
916           @panel = Factory.build :panel, :author_id => @author.id\r
917           r = @panel.store\r
918           r.should be_true\r
919         end\r
920         it '行が追加されている' do\r
921           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
922           @panel = Factory.build :panel, :author_id => @author.id\r
923           lambda {\r
924             r = @panel.store\r
925           }.should change(Panel, :count)\r
926         end\r
927       end\r
928       context '更新のとき' do\r
929         it 'Trueを返す' do\r
930           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
931           @panel = Factory :panel, :author_id => @author.id\r
932           r = @panel.store\r
933           r.should be_true\r
934         end\r
935         it '行が追加されていない' do\r
936           Panel.stub(:validate_elements_id).with(any_args).and_return(true)\r
937           @panel = Factory :panel, :author_id => @author.id\r
938           lambda {\r
939             r = @panel.store\r
940           }.should_not change(Panel, :count)\r
941         end\r
942       end\r
943     end\r
944     context 'idチェックが失敗するとき' do\r
945       it 'Falseを返す' do\r
946         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
947         @panel = Factory :panel, :author_id => @author.id\r
948         r = @panel.store\r
949         r.should be_false\r
950       end\r
951       it 'エラーメッセージがセットされている' do\r
952         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
953         @panel = Factory :panel, :author_id => @author.id\r
954         r = @panel.store\r
955         @panel.errors.empty?.should be_false\r
956       end\r
957       it '行が追加されていない' do\r
958         Panel.stub(:validate_elements_id).with(any_args).and_return(false)\r
959         @panel = Factory.build :panel, :author_id => @author.id\r
960         lambda {\r
961           r = @panel.store\r
962         }.should_not change(Panel, :count)\r
963       end\r
964     end\r
965   end\r
966 end\r