OSDN Git Service

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