OSDN Git Service

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