OSDN Git Service

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