OSDN Git Service

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