OSDN Git Service

t#29400
[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     FactoryGirl.create :admin\r
7     @sp = FactoryGirl.create :system_picture\r
8     @lg = FactoryGirl.create :license_group\r
9     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id\r
10     @color = FactoryGirl.create :color
11     @user = FactoryGirl.create( :user_yas)\r
12     @author = @user.author\r
13     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id\r
14     @other_user = FactoryGirl.create( :user_yas)\r
15     @other_author = @other_user.author\r
16     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id\r
17     @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
18     @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
19     @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
20     @sbt = FactoryGirl.create :speech_balloon_template\r
21   end\r
22   \r
23   describe '検証に於いて' do\r
24     before do\r
25       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
26     end\r
27     \r
28     context 'オーソドックスなデータのとき' do
29       it '下限データが通る' do
30         @panel.width = 1
31         @panel.height = 1
32         @panel.border = 0
33         @panel.x = -99999
34         @panel.y = -99999
35         @panel.z = 1
36         @panel.publish = 0
37         @panel.should be_valid
38       end
39       it '上限データが通る' do
40         @panel.width = 99999
41         @panel.height = 99999
42         @panel.border = 99999
43         @panel.x = 99999
44         @panel.y = 99999
45         @panel.z = 99999
46         @panel.publish = 99999
47         @panel.should be_valid
48       end
49     end
50     
51     context 'widthを検証するとき' do\r
52       it 'nullなら失敗する' do\r
53         @panel.width = nil\r
54         @panel.should_not be_valid\r
55       end\r
56       it '数値でなければ失敗する' do\r
57         @panel.width = 'a'\r
58         @panel.should_not be_valid\r
59       end\r
60       it '0なら失敗する' do\r
61         @panel.width = '0'\r
62         @panel.should_not be_valid\r
63       end\r
64       it '負でも失敗する' do\r
65         @panel.width = -1\r
66         @panel.should_not be_valid\r
67       end\r
68     end\r
69     context 'heightを検証するとき' do\r
70       it 'nullなら失敗する' do\r
71         @panel.height = nil\r
72         @panel.should_not be_valid\r
73       end\r
74       it '数値でなければ失敗する' do\r
75         @panel.height = 'a'\r
76         @panel.should_not be_valid\r
77       end\r
78       it '0なら失敗する' do\r
79         @panel.height = '0'\r
80         @panel.should_not be_valid\r
81       end\r
82       it '負でも失敗する' do\r
83         @panel.height = -1\r
84         @panel.should_not be_valid\r
85       end\r
86     end\r
87     context 'borderを検証するとき' do\r
88       it 'nullなら失敗する' do\r
89         @panel.border = nil\r
90         @panel.should_not be_valid\r
91       end\r
92       it '数値でなければ失敗する' do\r
93         @panel.border = 'a'\r
94         @panel.should_not be_valid\r
95       end\r
96       it '負なら失敗する' do\r
97         @panel.border = '-1'\r
98         @panel.should_not be_valid\r
99       end\r
100       it '0なら通る' do\r
101         @panel.border = 0\r
102         @panel.should be_valid\r
103       end\r
104     end\r
105     context 'xを検証するとき' do\r
106       it '数値でなければ失敗する' do\r
107         @panel.x = 'a'\r
108         @panel.should_not be_valid\r
109       end\r
110       it '0なら通る' do\r
111         @panel.x = '0'\r
112         @panel.should be_valid\r
113       end\r
114       it '負でも通る' do\r
115         @panel.x = -1\r
116         @panel.should be_valid\r
117       end\r
118     end\r
119     context 'yを検証するとき' do\r
120       it '数値でなければ失敗する' do\r
121         @panel.y = 'a'\r
122         @panel.should_not be_valid\r
123       end\r
124       it '0なら通る' do\r
125         @panel.y = '0'\r
126         @panel.should be_valid\r
127       end\r
128       it '負でも通る' do\r
129         @panel.y = -1\r
130         @panel.should be_valid\r
131       end\r
132     end\r
133     context 'zを検証するとき' do\r
134       it '数値でなければ失敗する' do\r
135         @panel.z = 'a'\r
136         @panel.should_not be_valid\r
137       end\r
138       it '0なら失敗する' do\r
139         @panel.z = '0'\r
140         @panel.should_not be_valid\r
141       end\r
142       it '負なら失敗する' do\r
143         @panel.z = -1\r
144         @panel.should_not be_valid\r
145       end\r
146     end\r
147     context 'author_idを検証するとき' do\r
148       it 'nullなら失敗する' do\r
149         @panel.author_id = nil\r
150         @panel.should_not be_valid\r
151       end\r
152       it '数値でなければ失敗する' do\r
153         @panel.author_id = 'a'\r
154         @panel.should_not be_valid\r
155       end\r
156       it '存在する作家でなければ失敗する' do\r
157         @panel.author_id = 0\r
158         @panel.should_not be_valid\r
159       end\r
160     end\r
161     context '公開フラグを検証するとき' do\r
162       it '数値でなければ失敗する' do\r
163         @panel.publish = 'a'\r
164         @panel.should_not be_valid\r
165       end\r
166     end\r
167     context '全体を検証するとき' do\r
168       before do\r
169         @panel = FactoryGirl.create :panel, :author_id => @author.id\r
170       end\r
171     end\r
172   end\r
173   \r
174   describe 'デフォルト値補充に於いて' do\r
175     before do\r
176       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
177     end\r
178     it 'borderは2を補充する' do\r
179       @panel.border = nil\r
180       @panel.supply_default\r
181       @panel.border.should eq 2\r
182     end\r
183     it 'publishは0を補充する' do\r
184       @panel.publish = nil\r
185       @panel.supply_default\r
186       @panel.publish.should eq 0\r
187     end\r
188   end\r
189   \r
190   describe '上書き補充に於いて' do\r
191     before do\r
192       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
193     end\r
194     context 'author_idを補充' do\r
195       it 'ログイン中の作家idを補充する' do\r
196         @panel.author_id = nil\r
197         @panel.overwrite @author\r
198         @panel.author_id.should eq @author.id\r
199       end\r
200     end\r
201     \r
202   end\r
203   \r
204   describe '作者判定に於いて' do\r
205     before do\r
206     end\r
207     it '自作のコマならyes' do\r
208       panel = FactoryGirl.create :panel, :author_id => @author.id\r
209       panel.own?(@author).should == true\r
210     end\r
211     it '他人のコマならno' do\r
212       panel = FactoryGirl.create :panel, :author_id => @author.id\r
213       panel.own?(@other_author).should == false\r
214     end\r
215     it '作家が不明ならno' do\r
216       panel = FactoryGirl.create :panel, :author_id => @author.id\r
217       panel.own?(nil).should == false\r
218     end\r
219   end\r
220   \r
221   describe '閲覧許可に於いて' do\r
222     before do\r
223     end\r
224     it '自作のコマを見るときは許可する' do\r
225       Panel.any_instance.stub(:own?).and_return(true)\r
226       Panel.any_instance.stub(:publish?).and_return(true)\r
227       panel = FactoryGirl.create :panel, :author_id => @author.id\r
228       panel.visible?(@author).should == true\r
229     end\r
230     it '自作のコマは非公開でも許可する' do\r
231       Panel.any_instance.stub(:own?).and_return(true)\r
232       Panel.any_instance.stub(:publish?).and_return(false)\r
233       panel = FactoryGirl.create :panel, :author_id => @author.id\r
234       panel.visible?(@author).should == true\r
235     end\r
236     it '他人のコマでも公開なら許可する' do\r
237       Panel.any_instance.stub(:own?).and_return(false)\r
238       Panel.any_instance.stub(:publish?).and_return(true)\r
239       panel = FactoryGirl.create :panel, :author_id => @author.id\r
240       panel.visible?(@author).should == true\r
241     end\r
242     it '他人のコマで非公開なら許可しない' do\r
243       Panel.any_instance.stub(:own?).and_return(false)\r
244       Panel.any_instance.stub(:publish?).and_return(false)\r
245       panel = FactoryGirl.create :panel, :author_id => @author.id\r
246       panel.visible?(@author).should == false\r
247     end\r
248   end\r
249   \r
250   describe '一覧取得に於いて' do\r
251     before do\r
252       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
253     end\r
254     context 'page補正について' do\r
255       it '文字列から数値に変換される' do\r
256         Panel.page('8').should eq 8\r
257       end\r
258       it 'nilの場合は1になる' do\r
259         Panel.page().should eq 1\r
260       end\r
261       it '0以下の場合は1になる' do\r
262         Panel.page('0').should eq 1\r
263       end\r
264     end\r
265     context 'page_size補正について' do\r
266       it '文字列から数値に変換される' do\r
267         Panel.page_size('7').should eq 7\r
268       end\r
269       it 'nilの場合はPanel.default_page_sizeになる' do\r
270         Panel.page_size().should eq Panel.default_page_size\r
271       end\r
272       it '0以下の場合はPanel.default_page_sizeになる' do\r
273         Panel.page_size('0').should eq Panel.default_page_size\r
274       end\r
275       it 'Panel.max_page_sizeを超えた場合はPanel.max_page_sizeになる' do\r
276         Panel.page_size('1000').should eq Panel.max_page_size\r
277       end\r
278     end\r
279     it 'リストを返す' do\r
280       r = Panel.list\r
281       r.should eq [@panel]\r
282     end\r
283     it '時系列で並んでいる' do\r
284       #公開コミックは(他人のコミックであっても)含んでいる
285       npl = FactoryGirl.create :panel, :author_id => @other_author.id, :updated_at => Time.now + 100\r
286       r = Panel.list\r
287       r.should eq [npl, @panel]\r
288     end\r
289     it '非公開のコマ(自分のコマであっても)は含まない' do\r
290       npl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0\r
291       r = Panel.list\r
292       r.should eq [@panel]\r
293     end\r
294     context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
295       before do\r
296         @npl2 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
297         @npl3 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
298         @npl4 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
299         @npl5 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
300         Panel.stub(:default_page_size).and_return(2)\r
301       end\r
302       it '通常は2件を返す' do\r
303         pl = Panel.list\r
304         pl.should have(2).items \r
305       end\r
306       it 'page=1なら末尾2件を返す' do\r
307         #時系列で並んでいる\r
308         pl = Panel.list 1\r
309         pl.should eq [@npl5, @npl4]\r
310       end\r
311       it 'page=2なら中間2件を返す' do\r
312         pl = Panel.list 2\r
313         pl.should eq [@npl3, @npl2]\r
314       end\r
315       it 'page=3なら先頭1件を返す' do\r
316         pl = Panel.list 3\r
317         pl.should eq [@panel]\r
318       end\r
319     end\r
320     context 'DBに5件あって1ページの件数を2件に変えたとして' do
321       before do
322         @npl2 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
323         @npl3 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
324         @npl4 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
325         @npl5 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
326         Panel.stub(:default_page_size).and_return(2)\r
327       end
328       it '件数0は全件(5件)を返す' do
329         r = Panel.list 5, 0
330         r.should have(5).items 
331       end
332     end
333   end\r
334   describe 'list関連テーブルプションに於いて' do\r
335     it 'includeキーを含んでいる' do\r
336       r = Panel.list_opt\r
337       r.has_key?(:include).should be_true\r
338     end\r
339     it '6つの項目を含んでいる' do\r
340       r = Panel.list_opt[:include]\r
341       r.should have(6).items\r
342     end\r
343     it 'コマ絵を含んでいる' do\r
344       r = Panel.list_opt[:include]\r
345       r.has_key?(:panel_pictures).should be_true\r
346     end\r
347       it 'コマ絵は実素材を含んでいる' do\r
348         r = Panel.list_opt[:include]\r
349         r[:panel_pictures].has_key?(:picture).should be_true\r
350       end\r
351         it '実素材は絵師を含んでいる' do\r
352           r = Panel.list_opt[:include]\r
353           r[:panel_pictures][:picture].has_key?(:artist).should be_true\r
354         end\r
355         it '実素材はライセンスを含んでいる' do\r
356           r = Panel.list_opt[:include]\r
357           r[:panel_pictures][:picture].has_key?(:license).should be_true\r
358         end\r
359     it 'フキダシを含んでいる' do\r
360       r = Panel.list_opt[:include]\r
361       r.has_key?(:speech_balloons).should be_true\r
362     end\r
363       it 'フキダシはフキダシ枠を含んでいる' do\r
364         r = Panel.list_opt[:include]\r
365         r[:speech_balloons].has_key?(:balloons).should be_true\r
366       end\r
367       it 'フキダシはセリフを含んでいる' do\r
368         r = Panel.list_opt[:include]\r
369         r[:speech_balloons].has_key?(:speeches).should be_true\r
370       end\r
371     it '景色画像を含んでいる' do\r
372       r = Panel.list_opt[:include]\r
373       r.has_key?(:ground_pictures).should be_true\r
374     end\r
375       it '景色画像は実素材を含んでいる' do\r
376         r = Panel.list_opt[:include]\r
377         r[:ground_pictures].has_key?(:picture).should be_true\r
378       end\r
379         it '実素材は絵師を含んでいる' do\r
380           r = Panel.list_opt[:include]\r
381           r[:ground_pictures][:picture].has_key?(:artist).should be_true\r
382         end\r
383         it '実素材はライセンスを含んでいる' do\r
384           r = Panel.list_opt[:include]\r
385           r[:ground_pictures][:picture].has_key?(:license).should be_true\r
386         end\r
387     it '間接色を含んでいる' do\r
388       r = Panel.list_opt[:include]\r
389       r.has_key?(:ground_colors).should be_true\r
390     end\r
391       it '間接色は色を含んでいる' do\r
392         r = Panel.list_opt[:include]\r
393         r[:ground_colors].has_key?(:color).should be_true\r
394       end\r
395     it '景色を含んでいる' do\r
396       r = Panel.list_opt[:include]\r
397       r.has_key?(:panel_colors).should be_true\r
398     end\r
399     it '作家を含んでいる' do\r
400       r = Panel.list_opt[:include]\r
401       r.has_key?(:author).should be_true\r
402     end\r
403   end\r
404   describe 'json一覧出力オプションに於いて' do\r
405   end\r
406   \r
407   describe '自分のコマ一覧取得に於いて' do\r
408     before do\r
409       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
410     end\r
411     it 'リストを返す' do\r
412       pl = Panel.mylist @author\r
413       pl.should eq [@panel]\r
414     end\r
415     it '時系列で並んでいる' do\r
416       npl = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
417       pl = Panel.mylist @author\r
418       pl.should eq [npl, @panel]\r
419     end\r
420     it '他人のコマは公開でも含まない' do\r
421       npl = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1\r
422       pl = Panel.mylist @author\r
423       pl.should eq [@panel]\r
424     end\r
425     it '自分のコマは非公開でも含んでいる' do\r
426       npl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0, :updated_at => Time.now + 100\r
427       pl = Panel.mylist @author\r
428       pl.should eq [npl, @panel]\r
429     end\r
430     context 'DBに5件あって1ページの件数を2件に変えたとして' do
431       before do
432         @npl2 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
433         @npl3 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
434         @npl4 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
435         @npl5 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
436       end
437       it '通常は2件を返す' do\r
438         pl = Panel.list 1, 2\r
439         pl.should have(2).items \r
440       end\r
441       it 'page=1なら末尾2件を返す' do\r
442         #時系列で並んでいる\r
443         pl = Panel.mylist @author, 1, 2\r
444         pl.should eq [@npl5, @npl4]\r
445       end\r
446       it 'page=2なら中間2件を返す' do\r
447         pl = Panel.mylist @author, 2, 2\r
448         pl.should eq [@npl3, @npl2]\r
449       end\r
450       it 'page=3なら先頭1件を返す' do\r
451         pl = Panel.mylist @author, 3, 2\r
452         pl.should eq [@panel]\r
453       end\r
454     end
455     context 'DBに5件あって1ページの件数を0件に変えたとして' do
456       before do
457         @npl2 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 100\r
458         @npl3 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 200\r
459         @npl4 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 300\r
460         @npl5 = FactoryGirl.create :panel, :author_id => @author.id, :updated_at => Time.now + 400\r
461         Panel.stub(:default_page_size).and_return(2)\r
462       end
463       it '通常は全件(5件)を返す' do
464         r = Panel.mylist @author, 5, 0
465         r.should have(5).items 
466       end
467     end
468   end\r
469   \r
470   describe '単体取得に於いて' do\r
471     before do\r
472       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
473     end\r
474     context 'つつがなく終わるとき' do\r
475       it '単体取得オプションを利用している' do\r
476         Panel.stub(:show_opt).with(any_args).and_return({})\r
477         Panel.should_receive(:show_opt).with(any_args).exactly(1)\r
478         r = Panel.show @panel.id, @author
479       end\r
480       it '閲覧許可を問い合わせている' do\r
481         Panel.any_instance.stub(:visible?).with(any_args).and_return(true)\r
482         Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
483         r = Panel.show @panel.id, @author
484       end\r
485     end\r
486     it '指定のコマを返す' do\r
487       Panel.any_instance.stub(:visible?).and_return(true)\r
488       pl = Panel.show @panel.id, @author\r
489       pl.should eq @panel\r
490     end\r
491     context '閲覧許可が出なかったとき' do\r
492       it '403Forbidden例外を返す' do\r
493         Panel.any_instance.stub(:visible?).and_return(false)\r
494         lambda{\r
495           Panel.show @panel.id, @author\r
496         }.should raise_error(ActiveRecord::Forbidden)\r
497       end\r
498     end\r
499     context '存在しないコマを開こうとしたとき' do\r
500       it '404RecordNotFound例外を返す' do\r
501         lambda{\r
502           Panel.show 110, @author\r
503         }.should raise_error(ActiveRecord::RecordNotFound)\r
504       end\r
505     end\r
506   end\r
507   describe '編集取得に於いて' do\r
508     before do\r
509       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
510     end\r
511     context 'つつがなく終わるとき' do\r
512       it '単体取得オプションを利用している' do\r
513         Panel.stub(:show_opt).with(any_args).and_return({})\r
514         Panel.should_receive(:show_opt).with(any_args).exactly(1)\r
515         r = Panel.edit @panel.id, @author
516       end\r
517       it '所持判定を問い合わせている' do\r
518         Panel.any_instance.stub(:own?).with(any_args).and_return(true)\r
519         Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)\r
520         r = Panel.edit @panel.id, @author
521       end\r
522     end\r
523     it '指定のコマを返す' do\r
524       Panel.any_instance.stub(:own?).and_return(true)\r
525       pl = Panel.edit @panel.id, @author\r
526       pl.should eq @panel\r
527     end\r
528     context '他人のコマを開こうとしたとき' do\r
529       it '403Forbidden例外を返す' do\r
530         Panel.any_instance.stub(:own?).and_return(false)\r
531         lambda{\r
532           Panel.edit @panel.id, @author\r
533         }.should raise_error(ActiveRecord::Forbidden)\r
534       end\r
535     end\r
536     context '存在しないコマを開こうとしたとき' do\r
537       it '404RecordNotFound例外を返す' do\r
538         lambda{\r
539           Panel.edit 110, @author\r
540         }.should raise_error(ActiveRecord::RecordNotFound)\r
541       end\r
542     end\r
543   end\r
544   describe '関連テーブルプションに於いて' do\r
545     it 'includeキーを含んでいる' do\r
546       r = Panel.show_opt\r
547       r.has_key?(:include).should be_true\r
548     end\r
549     it '6つの項目を含んでいる' do\r
550       r = Panel.show_opt[:include]\r
551       r.should have(6).items\r
552     end\r
553     it 'コマ絵を含んでいる' do\r
554       r = Panel.show_opt[:include]\r
555       r.has_key?(:panel_pictures).should be_true\r
556     end\r
557       it 'コマ絵は実素材を含んでいる' do\r
558         r = Panel.show_opt[:include]\r
559         r[:panel_pictures].has_key?(:picture).should be_true\r
560       end\r
561         it '実素材は絵師を含んでいる' do\r
562           r = Panel.show_opt[:include]\r
563           r[:panel_pictures][:picture].has_key?(:artist).should be_true\r
564         end\r
565         it '実素材はライセンスを含んでいる' do\r
566           r = Panel.show_opt[:include]\r
567           r[:panel_pictures][:picture].has_key?(:license).should be_true\r
568         end\r
569     it 'フキダシを含んでいる' do\r
570       r = Panel.show_opt[:include]\r
571       r.has_key?(:speech_balloons).should be_true\r
572     end\r
573       it 'フキダシはフキダシ枠を含んでいる' do\r
574         r = Panel.show_opt[:include]\r
575         r[:speech_balloons].has_key?(:balloons).should be_true\r
576       end\r
577       it 'フキダシはセリフを含んでいる' do\r
578         r = Panel.show_opt[:include]\r
579         r[:speech_balloons].has_key?(:speeches).should be_true\r
580       end\r
581     it '景色画像を含んでいる' do\r
582       r = Panel.show_opt[:include]\r
583       r.has_key?(:ground_pictures).should be_true\r
584     end\r
585       it '景色画像は実素材を含んでいる' do\r
586         r = Panel.show_opt[:include]\r
587         r[:ground_pictures].has_key?(:picture).should be_true\r
588       end\r
589         it '実素材は絵師を含んでいる' do\r
590           r = Panel.show_opt[:include]\r
591           r[:ground_pictures][:picture].has_key?(:artist).should be_true\r
592         end\r
593         it '実素材はライセンスを含んでいる' do\r
594           r = Panel.show_opt[:include]\r
595           r[:ground_pictures][:picture].has_key?(:license).should be_true\r
596         end\r
597     it '間接色を含んでいる' do\r
598       r = Panel.show_opt[:include]\r
599       r.has_key?(:ground_colors).should be_true\r
600     end\r
601       it '間接色は色を含んでいる' do\r
602         r = Panel.show_opt[:include]\r
603         r[:ground_colors].has_key?(:color).should be_true\r
604       end\r
605     it '景色を含んでいる' do\r
606       r = Panel.show_opt[:include]\r
607       r.has_key?(:panel_colors).should be_true\r
608     end\r
609     it '作家を含んでいる' do\r
610       r = Panel.show_opt[:include]\r
611       r.has_key?(:author).should be_true\r
612     end\r
613   end\r
614   describe 'json単体出力オプションに於いて' do\r
615   end\r
616   describe 'コマ部品集合に於いて' do\r
617     before do\r
618       #コマを作成しておく。\r
619       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
620       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
621       @sb = @panel.speech_balloons.create(\r
622         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
623       )\r
624       @gc = @panel.ground_colors.create(\r
625         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
626       )\r
627       @gp = @panel.ground_pictures.create(\r
628         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
629       )\r
630       @pc = @panel.panel_colors.create(\r
631         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
632       )\r
633       @panel.reload\r
634     end\r
635     it 'リストを返している' do\r
636       r = @panel.parts_element\r
637       r.is_a?(Array).should be_true\r
638     end\r
639     it 'コマ絵とフキダシを合わせている' do\r
640       r = @panel.parts_element\r
641       r.include?(@pp).should be_true\r
642       r.include?(@sb).should be_true\r
643     end\r
644     it '景色素材と景色カラーと景色カラーコードを含んでいない' do\r
645       r = @panel.parts_element\r
646       r.include?(@gc).should_not be_true\r
647       r.include?(@gp).should_not be_true\r
648       r.include?(@pc).should_not be_true\r
649     end\r
650   end\r
651   describe 'コマ部品に於いて' do\r
652     before do\r
653       #コマを作成しておく。\r
654       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
655       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
656       @sb = @panel.speech_balloons.create(\r
657         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
658       )\r
659       @gc = @panel.ground_colors.create(\r
660         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
661       )\r
662       @gp = @panel.ground_pictures.create(\r
663         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
664       )\r
665       @pc = @panel.panel_colors.create(\r
666         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
667       )\r
668       @panel.reload\r
669     end\r
670     context 'つつがなく終わるとき' do\r
671       it 'コマ部品集合を利用している' do\r
672         Panel.any_instance.stub(:parts_element).with(any_args).and_return([])\r
673         Panel.any_instance.should_receive(:parts_element).with(any_args).exactly(1)\r
674         r = @panel.parts\r
675       end\r
676     end\r
677     it 'リストを返している' do\r
678       r = @panel.parts\r
679       r.is_a?(Array).should be_true\r
680       r.size.should eq 2\r
681     end\r
682     it 'tでソートしている' do\r
683       r = @panel.parts\r
684       r[0].should eq @sb\r
685       r[1].should eq @pp\r
686     end\r
687     context 'さらに末尾にフキダシを追加したとき' do\r
688       before do\r
689         @sb2 = @panel.speech_balloons.create(\r
690           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
691         )\r
692         @panel.reload\r
693       end\r
694       it 'tでソートしている' do\r
695         r = @panel.parts\r
696         r[0].should eq @sb\r
697         r[1].should eq @pp\r
698         r[2].should eq @sb2\r
699       end\r
700     end\r
701   end\r
702   describe 'コマ地に於いて' do\r
703     before do\r
704       #コマを作成しておく。\r
705       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
706       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
707       @sb = @panel.speech_balloons.create(\r
708         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
709       )\r
710       @gc = @panel.ground_colors.create(\r
711         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
712       )\r
713       @gp = @panel.ground_pictures.create(\r
714         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
715       )\r
716       @pc = @panel.panel_colors.create(\r
717         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
718       )\r
719       @panel.reload\r
720     end\r
721     it 'リストを返している' do\r
722       r = @panel.grounds\r
723       r.is_a?(Array).should be_true\r
724     end\r
725     it '景色素材と景色カラーと景色カラーコードを合わせている' do\r
726       r = @panel.grounds\r
727       r.include?(@gc).should be_true\r
728       r.include?(@gp).should be_true\r
729       r.include?(@pc).should be_true\r
730     end\r
731     it 'コマ絵とフキダシを含んでいない' do\r
732       r = @panel.grounds\r
733       r.include?(@pp).should_not be_true\r
734       r.include?(@sb).should_not be_true\r
735     end\r
736   end\r
737   describe 'コマ要素に於いて' do\r
738     before do\r
739       #コマを作成しておく。\r
740       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
741       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
742       @sb = @panel.speech_balloons.create(\r
743         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
744       )\r
745       @gc = @panel.ground_colors.create(\r
746         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
747       )\r
748       @gp = @panel.ground_pictures.create(\r
749         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
750       )\r
751       @pc = @panel.panel_colors.create(\r
752         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
753       )\r
754       @panel.reload\r
755     end\r
756     context 'つつがなく終わるとき' do\r
757       it 'コマ部品を利用している' do\r
758         Panel.any_instance.stub(:parts).with(any_args).and_return([])\r
759         Panel.any_instance.should_receive(:parts).with(any_args).exactly(1)\r
760         r = @panel.panel_elements\r
761       end\r
762       it 'コマ地を利用している' do\r
763         Panel.any_instance.stub(:grounds).with(any_args).and_return([])\r
764         Panel.any_instance.should_receive(:grounds).with(any_args).exactly(1)\r
765         r = @panel.panel_elements\r
766       end\r
767     end\r
768     it 'リストを返している' do\r
769       r = @panel.panel_elements\r
770       r.is_a?(Array).should be_true\r
771     end\r
772     it 'コマ絵とフキダシを合わせている' do\r
773       r = @panel.panel_elements\r
774       r.include?(@pp).should be_true\r
775       r.include?(@sb).should be_true\r
776     end\r
777     it '景色素材と景色カラーと景色カラーコードを合わせている' do\r
778       r = @panel.panel_elements\r
779       r.include?(@gc).should be_true\r
780       r.include?(@gp).should be_true\r
781       r.include?(@pc).should be_true\r
782     end\r
783     it 'tでソートしている[t順にソートできる部品の方が優先順位は高い。]' do\r
784       r = @panel.panel_elements\r
785       r[0].should eq @sb\r
786       r[1].should eq @pp\r
787     end\r
788   end\r
789   describe 'コマ要素のjson出力に於いて' do\r
790     before do\r
791       #コマを作成しておく。\r
792       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
793       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
794       @sb = @panel.speech_balloons.create(\r
795         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
796       )\r
797       @gc = @panel.ground_colors.create(\r
798         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
799       )\r
800       @gp = @panel.ground_pictures.create(\r
801         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
802       )\r
803       @pc = @panel.panel_colors.create(\r
804         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
805       )\r
806       @panel.reload\r
807     end\r
808     context 'つつがなく終わるとき' do\r
809       before do\r
810         Panel.stub(:elm_json_opt).with(@pp).and_return({})\r
811         Panel.stub(:elm_json_opt).with(@sb).and_return({})\r
812         Panel.stub(:elm_json_opt).with(@gp).and_return({})\r
813         Panel.stub(:elm_json_opt).with(@gc).and_return({})\r
814         Panel.stub(:elm_json_opt).with(@pc).and_return({})\r
815       end\r
816       it 'コマ要素のjson出力オプションにコマ絵json出力オプションを依頼している' do\r
817         Panel.should_receive(:elm_json_opt).with(@pp).exactly(1)\r
818         r = @panel.elements\r
819       end\r
820       it 'コマ要素のjson出力オプションにフキダシjson出力オプションを依頼している' do\r
821         Panel.should_receive(:elm_json_opt).with(@sb).exactly(1)\r
822         r = @panel.elements\r
823       end\r
824       it 'コマ要素のjson出力オプションに景色素材json出力オプションを依頼している' do\r
825         Panel.should_receive(:elm_json_opt).with(@gp).exactly(1)\r
826         r = @panel.elements\r
827       end\r
828       it 'コマ要素のjson出力オプションに景色カラーjson出力オプションを依頼している' do\r
829         Panel.should_receive(:elm_json_opt).with(@gc).exactly(1)\r
830         r = @panel.elements\r
831       end\r
832       it 'コマ要素のjson出力オプションに景色カラーコードjson出力オプションを依頼している' do\r
833         Panel.should_receive(:elm_json_opt).with(@pc).exactly(1)\r
834         r = @panel.elements\r
835       end\r
836     end\r
837     it 'リストを返している' do\r
838       r = @panel.elements\r
839       r.is_a?(Array).should be_true\r
840     end\r
841   end\r
842   describe 'コマのjson出力に於いて' do\r
843     before do\r
844       #コマを作成しておく。\r
845       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
846       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
847       @sb = @panel.speech_balloons.create(\r
848         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
849       )\r
850       @gc = @panel.ground_colors.create(\r
851         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
852       )\r
853       @gp = @panel.ground_pictures.create(\r
854         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
855       )\r
856       @pc = @panel.panel_colors.create(\r
857         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
858       )\r
859       @panel.reload\r
860     end\r
861     context 'つつがなく終わるとき' do\r
862       before do\r
863         Panel.any_instance.stub(:elements).with(any_args).and_return({})\r
864       end\r
865       it 'コマ要素のjson出力を依頼している' do\r
866         Panel.any_instance.should_receive(:elements).with(any_args).exactly(1)\r
867         r = @panel.panel_elements_as_json\r
868       end\r
869     end\r
870     it 'json textを返している' do\r
871       r = JSON.parse @panel.panel_elements_as_json\r
872       r.is_a?(Hash).should be_true\r
873     end\r
874     it 'author,コマ要素を含んでいる' do\r
875       r = JSON.parse @panel.panel_elements_as_json\r
876       r.has_key?('author').should be_true\r
877       r.has_key?('elements').should be_true\r
878       #t:0\r
879       sb = r['elements'].first\r
880       sb.has_key?('classname').should be_true\r
881       sb.has_key?('balloons').should be_true\r
882       sb.has_key?('speeches').should be_true\r
883       #t:1\r
884     end\r
885   end\r
886   describe '検証値収集に於いて' do\r
887     context 'つつがなく終わるとき' do\r
888       it '第一パラメータで指定された配列中から第二引数のカラム値を収集している' do\r
889         elements = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r
890           [{:panel_id => 3, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
891         r = Panel.collect_element_value elements, :panel_id\r
892         r.should eq [1, 2, 3, 4]\r
893       end\r
894       it '第一パラメータで指定された配列中から第二引数のカラム値を収集している' do\r
895         elements = [[{:t => 1, :a => 'a'}, {:t => 2, :a => 'a'}], \r
896           [{:t => 3, :a => 'a'}, {:t => 0, :a => 'a'}]]\r
897         r = Panel.collect_element_value elements, :t\r
898         r.should eq [1, 2, 3, 0]\r
899       end\r
900     end\r
901   end\r
902   describe 'シリアライズチェックに於いて' do\r
903     context 'つつがなく終わるとき' do\r
904       it '0からシリアライズされているならTrueを返す' do\r
905         r = Panel.validate_t [0, 1, 2]\r
906         r.should be_true\r
907       end\r
908       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
909         r = Panel.validate_t [0, 2, 1]\r
910         r.should be_true\r
911       end\r
912       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
913         r = Panel.validate_t [ 2, 1, 4, 3, 0]\r
914         r.should be_true\r
915       end\r
916     end\r
917     context '異常なとき' do\r
918       it '0から始まらないならFalseを返す' do\r
919         r = Panel.validate_t [1, 2, 3]\r
920         r.should be_false\r
921       end\r
922       it '連続していないならFalseを返す' do\r
923         r = Panel.validate_t [0, 1, 2, 4]\r
924         r.should be_false\r
925       end\r
926       it '連続していないならFalseを返す' do\r
927         r = Panel.validate_t [0, 1, 2, 4, 5]\r
928         r.should be_false\r
929       end\r
930     end\r
931   end\r
932   describe 'tチェック単体に於いて' do\r
933     before do\r
934     end\r
935     context 'つつがなく終わるとき' do\r
936       it '検証値収集を依頼している' do\r
937         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
938         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
939         Panel.stub(:validate_t).with(any_args).and_return(true)\r
940         r = Panel.validate_element_t [], :t\r
941       end\r
942       it 'シリアライズチェック依頼している' do\r
943         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
944         Panel.should_receive(:validate_t).with(any_args).exactly(1)\r
945         Panel.stub(:validate_t).with(any_args).and_return(true)\r
946         r = Panel.validate_element_t [], :t\r
947       end\r
948     end\r
949   end\r
950   describe '従属データの検証に於いて' do\r
951     context 'つつがなく終わるとき' do\r
952       it 'trueを返している' do\r
953         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
954         @panel.panel_pictures.build(\r
955           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 0)\r
956         )\r
957         @panel.panel_pictures.build(\r
958           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1)\r
959         )\r
960         sb1 = @panel.speech_balloons.build(\r
961           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
962         )\r
963         sb1.balloons.build(\r
964           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
965         )\r
966         sb1.speeches.build(\r
967           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
968         )\r
969         sb2 = @panel.speech_balloons.build(\r
970           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
971         )\r
972         sb2.balloons.build(\r
973           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
974         )\r
975         sb2.speeches.build(\r
976           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
977         )\r
978         r = @panel.validate_child\r
979         r.should be_true\r
980       end\r
981     end\r
982     context 'シリアライズされていないとき' do\r
983       it 'falseを返している' do\r
984         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
985         @panel.panel_pictures.build(\r
986           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 0)\r
987         )\r
988         @panel.panel_pictures.build(\r
989           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1)\r
990         )\r
991         sb1 = @panel.speech_balloons.build(\r
992           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
993         )\r
994         sb1.balloons.build(\r
995           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
996         )\r
997         sb1.speeches.build(\r
998           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
999         )\r
1000         sb2 = @panel.speech_balloons.build(\r
1001           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4)\r
1002         )\r
1003         sb2.balloons.build(\r
1004           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
1005         )\r
1006         sb2.speeches.build(\r
1007           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
1008         )\r
1009         r = @panel.validate_child\r
1010         r.should be_false\r
1011       end\r
1012     end\r
1013   end\r
1014   describe '保存に於いて' do\r
1015     before do\r
1016       @attr = FactoryGirl.attributes_for :panel\r
1017       @panel = Panel.new
1018       @panel.supply_default
1019     end\r
1020     context 'つつがなく終わるとき' do\r
1021       before do\r
1022         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1023         Panel.any_instance.stub(:save).with(any_args).and_return(true)\r
1024       end\r
1025       it 'コマモデルに上書き補充を依頼している' do\r
1026         Panel.any_instance.should_receive(:overwrite).exactly(1)\r
1027         r = @panel.store @attr, @author\r
1028       end\r
1029       it '従属データの検証を依頼している' do\r
1030         Panel.any_instance.should_receive(:validate_child).with(any_args).exactly(1)\r
1031         r = @panel.store @attr, @author\r
1032       end\r
1033       it '保存を依頼している' do\r
1034         Panel.any_instance.should_receive(:save).with(any_args).exactly(1)\r
1035         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1036         r = @panel.store @attr, @author\r
1037       end\r
1038     end\r
1039     context 'つつがなく終わるとき' do\r
1040       before do\r
1041         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1042       end\r
1043       it 'Trueを返す' do\r
1044         r = @panel.store @attr, @author\r
1045         r.should be_true\r
1046       end\r
1047       it '行が追加されている' do\r
1048         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1049         lambda {\r
1050           r = @panel.store @attr, @author\r
1051         }.should change(Panel, :count)\r
1052       end\r
1053     end\r
1054     context '従属データの検証に失敗したとき' do\r
1055       before do\r
1056         Panel.any_instance.stub(:validate_child).with(any_args).and_return(false)\r
1057       end\r
1058       it 'エラーメッセージがセットされている' do\r
1059         r = @panel.store @attr, @author\r
1060         @panel.errors.should_not be_empty\r
1061       end\r
1062     end\r
1063     context 'カラム値がFalseしたとき' do\r
1064       before do\r
1065         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1066       end\r
1067       it 'エラーメッセージがセットされている' do\r
1068         r = @panel.store false, @author\r
1069         @panel.errors.should_not be_empty\r
1070       end\r
1071     end\r
1072   end\r
1073 =begin\r
1074   describe 'id挿げ替え防止確認に於いて' do\r
1075     before do\r
1076       #コマを作成しておく。\r
1077       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1078       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
1079       @sb = @panel.speech_balloons.create(\r
1080         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
1081       )\r
1082       @gc = @panel.ground_colors.create(\r
1083         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
1084       )\r
1085       @gp = @panel.ground_pictures.create(\r
1086         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
1087       )\r
1088       @pc = @panel.panel_colors.create(\r
1089         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
1090       )\r
1091       @panel.reload\r
1092     end\r
1093     it 'author,コマ要素を含んでいる' do\r
1094       @panel2 = FactoryGirl.create :panel, :author_id => @author.id\r
1095       @panel2.panel_pictures.create(\r
1096         FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height)\r
1097       )\r
1098       @panel2.save!\r
1099       p @panel2\r
1100       p @panel2.panel_pictures\r
1101     end\r
1102   end\r
1103   describe 'id一致チェックに於いて' do\r
1104     #parent.idがNilのときはすべてNil。数値のときは全一致\r
1105     context '親が既存(idが数値)のとき' do\r
1106       it 'すべてid一致するときTrueを返す' do\r
1107         r = Panel.validate_id [1, 1, 1, 1], 1\r
1108         r.should be_true\r
1109       end\r
1110       it 'idが一致する中にNilが混じってもTrueを返す' do\r
1111         r = Panel.validate_id [1, 1, 1, 1, nil], 1\r
1112         r.should be_true\r
1113       end\r
1114       it 'すべて数値でも一致しないときFalseを返す' do\r
1115         r = Panel.validate_id [1, 1, 1, 1, 2], 1\r
1116         r.should be_false\r
1117       end\r
1118       it '数値とNilが混ざってもIDが一致しないときFalseを返す' do\r
1119         r = Panel.validate_id [1, 1, nil, 2], 1\r
1120         r.should be_false\r
1121       end\r
1122     end\r
1123     context '親が新規(idがNil)のとき' do\r
1124       it 'すべてNilはTrueを返す' do\r
1125         r = Panel.validate_id [ nil,nil,nil,nil], nil\r
1126         r.should be_true\r
1127       end\r
1128       it 'すべてnilでなければFalseを返す' do\r
1129         r = Panel.validate_id [nil,nil,nil,nil, 2], nil\r
1130         r.should be_false\r
1131       end\r
1132     end\r
1133   end\r
1134   describe 'idチェック単体に於いて' do\r
1135     before do\r
1136 #      @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1\r
1137     end\r
1138     context 'つつがなく終わるとき' do\r
1139       it 'idを収集依頼している' do\r
1140         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
1141         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1142         Panel.stub(:validate_id).with(any_args).and_return(true)\r
1143         r = Panel.validate_element_id [], :panel_id, nil\r
1144       end\r
1145       it '収集したidを一致チェック依頼している' do\r
1146         Panel.should_receive(:validate_id).with(any_args).exactly(1)\r
1147         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1148         Panel.stub(:validate_id).with(any_args).and_return(true)\r
1149         r = Panel.validate_element_id [], :panel_id, nil\r
1150       end\r
1151     end\r
1152     #実データでチェック\r
1153     #依頼チェックだけでは不安なので最低限のチェックを\r
1154     context 'コマ新規のとき' do\r
1155       it 'コマ絵で正常通過している' do\r
1156         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1157         @panel.panel_pictures.build(\r
1158           FactoryGirl.attributes_for(:panel_picture, :panel_id => nil, :picture_id => @p.id, :t => nil)\r
1159         )\r
1160         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1161         r.should be_true\r
1162       end\r
1163       it 'フキダシで正常通過している' do\r
1164         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1165         @panel.speech_balloons.build(\r
1166           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1167         )\r
1168         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1169         r.should be_true\r
1170       end\r
1171     end\r
1172     context 'コマ既存のとき' do\r
1173       it 'コマ絵で正常通過している' do\r
1174         @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1175         @panel.panel_pictures.build(\r
1176           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1177         )\r
1178         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1179         r.should be_true\r
1180       end\r
1181       it 'フキダシで正常通過している' do\r
1182         @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1183         @panel.speech_balloons.build(\r
1184           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1185         )\r
1186         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1187         r.should be_true\r
1188       end\r
1189     end\r
1190     context 'フキダシ新規のとき' do\r
1191       it 'バルーンで正常通過している' do\r
1192         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1193         @panel.speech_balloons.build(\r
1194           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1195         )\r
1196         @panel.speech_balloons.first.balloons.build(\r
1197           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => nil)\r
1198         )\r
1199         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
1200         r.should be_true\r
1201       end\r
1202       it 'セリフで正常通過している' do\r
1203         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1204         @panel.speech_balloons.build(\r
1205           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1206         )\r
1207         @panel.speech_balloons.first.speeches.build(\r
1208           FactoryGirl.attributes_for(:speech, :speech_balloon_id => nil)\r
1209         )\r
1210         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
1211         r.should be_true\r
1212       end\r
1213     end\r
1214   end\r
1215   describe 'idチェックリスト生成に於いて' do\r
1216     before do\r
1217       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1218     end\r
1219     context 'つつがなく終わるとき' do\r
1220       it 'コマ部品とフキダシ部品のトータル2を返す' do\r
1221         @panel.panel_pictures.build(\r
1222           FactoryGirl.attributes_for(:panel_picture, :panel_id => nil, :picture_id => @p.id, :t => nil)\r
1223         )\r
1224         @panel.speech_balloons.build(\r
1225           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1226         )\r
1227         @panel.speech_balloons.first.balloons.build(\r
1228           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => nil)\r
1229         )\r
1230         @panel.speech_balloons.first.speeches.build(\r
1231           FactoryGirl.attributes_for(:speech, :speech_balloon_id => nil)\r
1232         )\r
1233         r = @panel.validate_id_list\r
1234         r.should have(2).items\r
1235       end\r
1236       it 'コマ部品とフキダシ部品[複数:2]のケースでトータル3を返す' do\r
1237         @panel.panel_pictures.build(\r
1238           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1239         )\r
1240         sb1 = @panel.speech_balloons.build(\r
1241           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1242         )\r
1243         sb1.balloons.build(\r
1244           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1245         )\r
1246         sb1.speeches.build(\r
1247           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1248         )\r
1249         sb2 = @panel.speech_balloons.build(\r
1250           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1251         )\r
1252         sb2.balloons.build(\r
1253           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
1254         )\r
1255         sb2.speeches.build(\r
1256           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
1257         )\r
1258         r = @panel.validate_id_list\r
1259         r.should have(3).items\r
1260       end\r
1261     end\r
1262   end\r
1263   describe 'idチェック複合に於いて' do\r
1264     before do\r
1265       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1266     end\r
1267     context 'つつがなく終わるとき' do\r
1268       it 'コマ部品とフキダシ部品の二回チェック依頼している' do\r
1269         Panel.should_receive(:validate_element_id).with(any_args).exactly(2)\r
1270         Panel.stub(:validate_element_id).with(any_args).and_return(true)\r
1271         @panel.panel_pictures.build(\r
1272           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1273         )\r
1274         sb1 = @panel.speech_balloons.build(\r
1275           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1276         )\r
1277         sb1.balloons.build(\r
1278           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1279         )\r
1280         sb1.speeches.build(\r
1281           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1282         )\r
1283         r = Panel.validate_elements_id(@panel.validate_id_list)\r
1284       end\r
1285     end\r
1286   end\r
1287 =end\r
1288 end\r