OSDN Git Service

t#31470:create pager
[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?(:balloons).should be_true\r
588       end\r
589       it 'フキダシはセリフを含んでいる' do\r
590         r = Panel.list_opt\r
591         r[:speech_balloons].has_key?(:speeches).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?(:balloons).should be_true\r
727       end\r
728       it 'フキダシはセリフを含んでいる' do\r
729         r = Panel.show_opt[:include]\r
730         r[:speech_balloons].has_key?(:speeches).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)\r
769       )\r
770       @gp = @panel.ground_pictures.create(\r
771         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\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     end\r
784     it '絵地と色地を含んでいない' do\r
785       r = @panel.parts_element\r
786       r.include?(@gc).should_not be_true\r
787       r.include?(@gp).should_not be_true\r
788     end\r
789   end\r
790   describe 'コマ部品に於いて' do\r
791     before do\r
792       #コマを作成しておく。\r
793       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
794       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
795       @sb = @panel.speech_balloons.create(\r
796         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
797       )\r
798       @gc = @panel.ground_colors.create(\r
799         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
800       )\r
801       @gp = @panel.ground_pictures.create(\r
802         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
803       )\r
804       @panel.reload\r
805     end\r
806     context 'つつがなく終わるとき' do\r
807       it 'コマ部品集合を利用している' do\r
808         Panel.any_instance.stub(:parts_element).with(any_args).and_return([])\r
809         Panel.any_instance.should_receive(:parts_element).with(any_args).exactly(1)\r
810         r = @panel.parts\r
811       end\r
812     end\r
813     it 'リストを返している' do\r
814       r = @panel.parts\r
815       r.is_a?(Array).should be_true\r
816       r.size.should eq 2\r
817     end\r
818     it 'tでソートしている' do\r
819       r = @panel.parts\r
820       r[0].should eq @sb\r
821       r[1].should eq @pp\r
822     end\r
823     context 'さらに末尾にフキダシを追加したとき' do\r
824       before do\r
825         @sb2 = @panel.speech_balloons.create(\r
826           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
827         )\r
828         @panel.reload\r
829       end\r
830       it 'tでソートしている' do\r
831         r = @panel.parts\r
832         r[0].should eq @sb\r
833         r[1].should eq @pp\r
834         r[2].should eq @sb2\r
835       end\r
836     end\r
837   end\r
838   describe 'コマ地に於いて' do\r
839     before do\r
840       #コマを作成しておく。\r
841       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
842       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
843       @sb = @panel.speech_balloons.create(\r
844         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
845       )\r
846       @gc = @panel.ground_colors.create(\r
847         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
848       )\r
849       @gp = @panel.ground_pictures.create(\r
850         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
851       )\r
852       @panel.reload\r
853     end\r
854     it 'リストを返している' do\r
855       r = @panel.grounds\r
856       r.is_a?(Array).should be_true\r
857     end\r
858     it '絵地と色地を合わせている' do\r
859       r = @panel.grounds\r
860       r.include?(@gc).should be_true\r
861       r.include?(@gp).should be_true\r
862     end\r
863     it 'コマ絵とフキダシを含んでいない' do\r
864       r = @panel.grounds\r
865       r.include?(@pp).should_not be_true\r
866       r.include?(@sb).should_not be_true\r
867     end\r
868   end\r
869   describe 'コマ要素に於いて' do\r
870     before do\r
871       #コマを作成しておく。\r
872       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
873       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
874       @sb = @panel.speech_balloons.create(\r
875         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
876       )\r
877       @gc = @panel.ground_colors.create(\r
878         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
879       )\r
880       @gp = @panel.ground_pictures.create(\r
881         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
882       )\r
883       @panel.reload\r
884     end\r
885     context 'つつがなく終わるとき' do\r
886       it 'コマ部品を利用している' do\r
887         Panel.any_instance.stub(:parts).with(any_args).and_return([])\r
888         Panel.any_instance.should_receive(:parts).with(any_args).exactly(1)\r
889         r = @panel.panel_elements\r
890       end\r
891       it 'コマ地を利用している' do\r
892         Panel.any_instance.stub(:grounds).with(any_args).and_return([])\r
893         Panel.any_instance.should_receive(:grounds).with(any_args).exactly(1)\r
894         r = @panel.panel_elements\r
895       end\r
896     end\r
897     it 'リストを返している' do\r
898       r = @panel.panel_elements\r
899       r.is_a?(Array).should be_true\r
900     end\r
901     it 'コマ絵とフキダシを合わせている' do\r
902       r = @panel.panel_elements\r
903       r.include?(@pp).should be_true\r
904       r.include?(@sb).should be_true\r
905     end\r
906     it '絵地と色地を合わせている' do\r
907       r = @panel.panel_elements\r
908       r.include?(@gc).should be_true\r
909       r.include?(@gp).should be_true\r
910     end\r
911     it 'tでソートしている[t順にソートできる部品の方が優先順位は高い。]' do\r
912       r = @panel.panel_elements\r
913       r[0].should eq @sb\r
914       r[1].should eq @pp\r
915     end\r
916   end\r
917   describe 'コマ要素のjson出力に於いて' do\r
918     before do\r
919       #コマを作成しておく。\r
920       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
921       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
922       @sb = @panel.speech_balloons.create(\r
923         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
924       )\r
925       @gc = @panel.ground_colors.create(\r
926         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
927       )\r
928       @gp = @panel.ground_pictures.create(\r
929         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
930       )\r
931       @panel.reload\r
932     end\r
933     context 'つつがなく終わるとき' do\r
934       before do\r
935         Panel.stub(:elm_json_opt).with(@pp).and_return({})\r
936         Panel.stub(:elm_json_opt).with(@sb).and_return({})\r
937         Panel.stub(:elm_json_opt).with(@gp).and_return({})\r
938         Panel.stub(:elm_json_opt).with(@gc).and_return({})\r
939       end\r
940       it 'コマ要素のjson出力オプションにコマ絵json出力オプションを依頼している' do\r
941         Panel.should_receive(:elm_json_opt).with(@pp).exactly(1)\r
942         r = @panel.elements\r
943       end\r
944       it 'コマ要素のjson出力オプションにフキダシjson出力オプションを依頼している' do\r
945         Panel.should_receive(:elm_json_opt).with(@sb).exactly(1)\r
946         r = @panel.elements\r
947       end\r
948       it 'コマ要素のjson出力オプションに絵地json出力オプションを依頼している' do\r
949         Panel.should_receive(:elm_json_opt).with(@gp).exactly(1)\r
950         r = @panel.elements\r
951       end\r
952       it 'コマ要素のjson出力オプションに色地json出力オプションを依頼している' do\r
953         Panel.should_receive(:elm_json_opt).with(@gc).exactly(1)\r
954         r = @panel.elements\r
955       end\r
956     end\r
957     it 'リストを返している' do\r
958       r = @panel.elements\r
959       r.is_a?(Array).should be_true\r
960     end\r
961   end\r
962   describe 'コマのjson出力に於いて' do\r
963     before do\r
964       #コマを作成しておく。\r
965       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
966       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
967       @sb = @panel.speech_balloons.create(\r
968         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
969       )\r
970       @gc = @panel.ground_colors.create(\r
971         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
972       )\r
973       @gp = @panel.ground_pictures.create(\r
974         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
975       )\r
976       @panel.reload\r
977     end\r
978     context 'つつがなく終わるとき' do\r
979       before do\r
980         Panel.any_instance.stub(:elements).with(any_args).and_return({})\r
981       end\r
982       it 'コマ要素のjson出力を依頼している' do\r
983         Panel.any_instance.should_receive(:elements).with(any_args).exactly(1)\r
984         r = @panel.panel_elements_as_json\r
985       end\r
986     end\r
987     it 'json textを返している' do\r
988       r = JSON.parse @panel.panel_elements_as_json\r
989       r.is_a?(Hash).should be_true\r
990     end\r
991     it 'author,コマ要素を含んでいる' do\r
992       r = JSON.parse @panel.panel_elements_as_json\r
993       r.has_key?('author').should be_true\r
994       r.has_key?('elements').should be_true\r
995       #t:0\r
996       sb = r['elements'].first\r
997       sb.has_key?('classname').should be_true\r
998       sb.has_key?('balloons').should be_true\r
999       sb.has_key?('speeches').should be_true\r
1000       #t:1\r
1001     end\r
1002   end\r
1003   describe 'コマリストのjson出力に於いて' do\r
1004     before do\r
1005       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1006       Panel.any_instance.stub(:panel_elements_as_json).with(any_args).and_return('{"p": 5}')\r
1007     end\r
1008     context 'つつがなく終わるとき' do\r
1009       it 'コマのjson出力を依頼している' do\r
1010         Panel.any_instance.should_receive(:panel_elements_as_json).with(any_args).exactly(1)\r
1011         r = Panel.list_as_json_text [@panel]\r
1012       end\r
1013     end\r
1014     it 'json textを返している' do\r
1015       r = Panel.list_as_json_text [@panel]\r
1016       j = JSON.parse r\r
1017       j.is_a?(Array).should be_true\r
1018     end\r
1019     it 'コマを含んでいる' do\r
1020       r = Panel.list_as_json_text [@panel]\r
1021       j = JSON.parse r\r
1022       j.first.has_key?('p').should be_true\r
1023     end\r
1024   end\r
1025   \r
1026   describe 'ライセンス素材に於いて' do\r
1027     before do\r
1028       #コマを作成しておく。\r
1029       @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
1030       @p2 = FactoryGirl.create :picture, :original_picture_id => @op2.id, :license_id => @license.id, :artist_id => @artist.id\r
1031       @rp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op2.id, :picture_id => @p2.id\r
1032       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1033       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height, :picture_id => @p.id\r
1034       @sb = @panel.speech_balloons.create(\r
1035         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
1036       )\r
1037       @gc = @panel.ground_colors.create(\r
1038         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
1039       )\r
1040       @gp = @panel.ground_pictures.create(\r
1041         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p2.id)\r
1042       )\r
1043       @panel.reload\r
1044     end\r
1045     context '事前チェック' do\r
1046     end\r
1047     context 'つつがなく終わるとき' do\r
1048     end\r
1049     it '連想配列(値は実素材、キーは実素材id)を返している' do\r
1050       r = @panel.licensed_pictures\r
1051       r.is_a?(Hash).should be_true\r
1052       r.should have(2).items\r
1053       r[@pp.picture_id].should eq @p\r
1054       r[@gp.picture_id].should eq @p2\r
1055     end\r
1056   end\r
1057   \r
1058   describe '検証値収集に於いて' do\r
1059     context 'つつがなく終わるとき' do\r
1060       it '第一パラメータで指定された配列中から第二引数のカラム値を収集している' do\r
1061         elements = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r
1062           [{:panel_id => 3, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
1063         r = Panel.collect_element_value elements, :panel_id\r
1064         r.should eq [1, 2, 3, 4]\r
1065       end\r
1066       it '第一パラメータで指定された配列中から第二引数のカラム値を収集している' do\r
1067         elements = [[{:t => 1, :a => 'a'}, {:t => 2, :a => 'a'}], \r
1068           [{:t => 3, :a => 'a'}, {:t => 0, :a => 'a'}]]\r
1069         r = Panel.collect_element_value elements, :t\r
1070         r.should eq [1, 2, 3, 0]\r
1071       end\r
1072     end\r
1073   end\r
1074   describe 'シリアライズチェックに於いて' do\r
1075     context 'つつがなく終わるとき' do\r
1076       it '0からシリアライズされているならTrueを返す' do\r
1077         r = Panel.validate_t [0, 1, 2]\r
1078         r.should be_true\r
1079       end\r
1080       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
1081         r = Panel.validate_t [0, 2, 1]\r
1082         r.should be_true\r
1083       end\r
1084       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
1085         r = Panel.validate_t [ 2, 1, 4, 3, 0]\r
1086         r.should be_true\r
1087       end\r
1088     end\r
1089     context '異常なとき' do\r
1090       it '0から始まらないならFalseを返す' do\r
1091         r = Panel.validate_t [1, 2, 3]\r
1092         r.should be_false\r
1093       end\r
1094       it '連続していないならFalseを返す' do\r
1095         r = Panel.validate_t [0, 1, 2, 4]\r
1096         r.should be_false\r
1097       end\r
1098       it '連続していないならFalseを返す' do\r
1099         r = Panel.validate_t [0, 1, 2, 4, 5]\r
1100         r.should be_false\r
1101       end\r
1102     end\r
1103   end\r
1104   describe 'tチェック単体に於いて' do\r
1105     before do\r
1106     end\r
1107     context 'つつがなく終わるとき' do\r
1108       it '検証値収集を依頼している' do\r
1109         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
1110         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1111         Panel.stub(:validate_t).with(any_args).and_return(true)\r
1112         r = Panel.validate_element_t [], :t\r
1113       end\r
1114       it 'シリアライズチェック依頼している' do\r
1115         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1116         Panel.should_receive(:validate_t).with(any_args).exactly(1)\r
1117         Panel.stub(:validate_t).with(any_args).and_return(true)\r
1118         r = Panel.validate_element_t [], :t\r
1119       end\r
1120     end\r
1121   end\r
1122   describe '従属データの検証に於いて' do\r
1123     context 'つつがなく終わるとき' do\r
1124       it 'trueを返している' do\r
1125         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1126         @panel.panel_pictures.build(\r
1127           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 0)\r
1128         )\r
1129         @panel.panel_pictures.build(\r
1130           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1)\r
1131         )\r
1132         sb1 = @panel.speech_balloons.build(\r
1133           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
1134         )\r
1135         sb1.balloons.build(\r
1136           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1137         )\r
1138         sb1.speeches.build(\r
1139           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1140         )\r
1141         sb2 = @panel.speech_balloons.build(\r
1142           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
1143         )\r
1144         sb2.balloons.build(\r
1145           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
1146         )\r
1147         sb2.speeches.build(\r
1148           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
1149         )\r
1150         r = @panel.validate_child\r
1151         r.should be_true\r
1152       end\r
1153     end\r
1154     context 'シリアライズされていないとき' do\r
1155       it 'falseを返している' do\r
1156         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1157         @panel.panel_pictures.build(\r
1158           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 0)\r
1159         )\r
1160         @panel.panel_pictures.build(\r
1161           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1)\r
1162         )\r
1163         sb1 = @panel.speech_balloons.build(\r
1164           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
1165         )\r
1166         sb1.balloons.build(\r
1167           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1168         )\r
1169         sb1.speeches.build(\r
1170           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1171         )\r
1172         sb2 = @panel.speech_balloons.build(\r
1173           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4)\r
1174         )\r
1175         sb2.balloons.build(\r
1176           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
1177         )\r
1178         sb2.speeches.build(\r
1179           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
1180         )\r
1181         r = @panel.validate_child\r
1182         r.should be_false\r
1183       end\r
1184     end\r
1185   end\r
1186   describe '保存に於いて' do\r
1187     before do\r
1188       @attr = FactoryGirl.attributes_for :panel\r
1189       @panel = Panel.new\r
1190       @panel.supply_default\r
1191     end\r
1192     context 'つつがなく終わるとき' do\r
1193       before do\r
1194         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1195         Panel.any_instance.stub(:save).with(any_args).and_return(true)\r
1196       end\r
1197       it 'コマモデルに上書き補充を依頼している' do\r
1198         Panel.any_instance.should_receive(:overwrite).exactly(1)\r
1199         r = @panel.store @attr, @author\r
1200       end\r
1201       it '保存を依頼している' do\r
1202         Panel.any_instance.should_receive(:save).with(any_args).exactly(1)\r
1203         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1204         r = @panel.store @attr, @author\r
1205       end\r
1206       it '従属データの検証を依頼している' do\r
1207         Panel.any_instance.should_receive(:validate_child).with(any_args).exactly(1)\r
1208         r = @panel.store @attr, @author\r
1209       end\r
1210     end\r
1211     context 'つつがなく終わるとき' do\r
1212       before do\r
1213         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1214       end\r
1215       it 'Trueを返す' do\r
1216         r = @panel.store @attr, @author\r
1217         r.should be_true\r
1218       end\r
1219       it '行が追加されている' do\r
1220         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1221         lambda {\r
1222           r = @panel.store @attr, @author\r
1223         }.should change(Panel, :count)\r
1224       end\r
1225     end\r
1226     context '不正なjsonデータのとき' do\r
1227       before do\r
1228       end\r
1229       it 'エラーメッセージがセットされている' do\r
1230         r = @panel.store false, @author\r
1231         @panel.errors[:base].should_not be_blank\r
1232       end\r
1233     end\r
1234     context '従属データの検証に失敗したとき' do\r
1235       before do\r
1236         Panel.any_instance.stub(:save).with(any_args).and_return(true)\r
1237         Panel.any_instance.stub(:validate_child).with(any_args).and_return(false)\r
1238       end\r
1239       it 'エラーメッセージがセットされている' do\r
1240         r = @panel.store @attr, @author\r
1241         @panel.errors[:base].should_not be_blank\r
1242       end\r
1243     end\r
1244     context 'カラム値がFalseしたとき' do\r
1245       before do\r
1246         Panel.any_instance.stub(:validate_child).with(any_args).and_return(true)\r
1247       end\r
1248       it 'エラーメッセージがセットされている' do\r
1249         r = @panel.store false, @author\r
1250         @panel.errors.should_not be_empty\r
1251       end\r
1252     end\r
1253   end\r
1254   \r
1255   describe '削除に於いて' do\r
1256     before do\r
1257       @comic = FactoryGirl.create :comic, :author_id => @author.id\r
1258       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1\r
1259       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
1260       @sb = @panel.speech_balloons.create(\r
1261         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
1262       )\r
1263       @gc = @panel.ground_colors.create(\r
1264         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
1265       )\r
1266       @gp = @panel.ground_pictures.create(\r
1267         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
1268       )\r
1269     end\r
1270     context 'つつがなく終わるとき' do\r
1271       it '自身を削除する' do\r
1272         lambda {\r
1273           r = @panel.destroy_with_elements\r
1274         }.should change(Panel, :count).by(-1)\r
1275         lambda {\r
1276           r = Panel.find @panel.id\r
1277         }.should raise_error\r
1278       end\r
1279       it '自身にリンクしているコマ要素をすべて削除する' do\r
1280         lambda {\r
1281           r = @panel.destroy_with_elements\r
1282         }.should change(PanelPicture, :count).by(-1)\r
1283         lambda {\r
1284           r = PanelPicture.find @pp.id\r
1285         }.should raise_error \r
1286       end\r
1287       it '自身にリンクしているコマ要素をすべて削除する' do\r
1288         lambda {\r
1289           r = @panel.destroy_with_elements\r
1290         }.should change(GroundPicture, :count).by(-1)\r
1291         lambda {\r
1292           r = GroundPicture.find @gp.id\r
1293         }.should raise_error \r
1294       end\r
1295       it 'Trueを返す' do\r
1296         r = @panel.destroy_with_elements\r
1297         r.should be_true\r
1298       end\r
1299     end\r
1300     context '削除に失敗したとき' do\r
1301       before do\r
1302         PanelPicture.any_instance.stub(:destroy).with(any_args).and_return(false)\r
1303       end\r
1304       it 'Falseを返す' do\r
1305         r = @panel.destroy_with_elements\r
1306         r.should be_false\r
1307       end\r
1308       it 'ロールバックしている' do\r
1309         lambda {\r
1310           r = @panel.destroy_with_elements\r
1311         }.should_not change(Panel, :count)\r
1312         lambda {\r
1313           r = @panel.destroy_with_elements\r
1314         }.should_not change(PanelPicture, :count)\r
1315       end\r
1316     end\r
1317   end\r
1318 =begin\r
1319   describe 'id挿げ替え防止確認に於いて' do\r
1320     before do\r
1321       #コマを作成しておく。\r
1322       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1323       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
1324       @sb = @panel.speech_balloons.create(\r
1325         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
1326       )\r
1327       @gc = @panel.ground_colors.create(\r
1328         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :color_id => @color.id)\r
1329       )\r
1330       @gp = @panel.ground_pictures.create(\r
1331         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)\r
1332       )\r
1333       @pc = @panel.panel_colors.create(\r
1334         FactoryGirl.attributes_for(:panel_color, :panel_id => @panel.id, :code => 0xff0000)\r
1335       )\r
1336       @panel.reload\r
1337     end\r
1338     it 'author,コマ要素を含んでいる' do\r
1339       @panel2 = FactoryGirl.create :panel, :author_id => @author.id\r
1340       @panel2.panel_pictures.create(\r
1341         FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height)\r
1342       )\r
1343       @panel2.save!\r
1344     end\r
1345   end\r
1346   describe 'id一致チェックに於いて' do\r
1347     #parent.idがNilのときはすべてNil。数値のときは全一致\r
1348     context '親が既存(idが数値)のとき' do\r
1349       it 'すべてid一致するときTrueを返す' do\r
1350         r = Panel.validate_id [1, 1, 1, 1], 1\r
1351         r.should be_true\r
1352       end\r
1353       it 'idが一致する中にNilが混じってもTrueを返す' do\r
1354         r = Panel.validate_id [1, 1, 1, 1, nil], 1\r
1355         r.should be_true\r
1356       end\r
1357       it 'すべて数値でも一致しないときFalseを返す' do\r
1358         r = Panel.validate_id [1, 1, 1, 1, 2], 1\r
1359         r.should be_false\r
1360       end\r
1361       it '数値とNilが混ざってもIDが一致しないときFalseを返す' do\r
1362         r = Panel.validate_id [1, 1, nil, 2], 1\r
1363         r.should be_false\r
1364       end\r
1365     end\r
1366     context '親が新規(idがNil)のとき' do\r
1367       it 'すべてNilはTrueを返す' do\r
1368         r = Panel.validate_id [ nil,nil,nil,nil], nil\r
1369         r.should be_true\r
1370       end\r
1371       it 'すべてnilでなければFalseを返す' do\r
1372         r = Panel.validate_id [nil,nil,nil,nil, 2], nil\r
1373         r.should be_false\r
1374       end\r
1375     end\r
1376   end\r
1377   describe 'idチェック単体に於いて' do\r
1378     before do\r
1379 #      @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1\r
1380     end\r
1381     context 'つつがなく終わるとき' do\r
1382       it 'idを収集依頼している' do\r
1383         Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
1384         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1385         Panel.stub(:validate_id).with(any_args).and_return(true)\r
1386         r = Panel.validate_element_id [], :panel_id, nil\r
1387       end\r
1388       it '収集したidを一致チェック依頼している' do\r
1389         Panel.should_receive(:validate_id).with(any_args).exactly(1)\r
1390         Panel.stub(:collect_element_value).with(any_args).and_return([])\r
1391         Panel.stub(:validate_id).with(any_args).and_return(true)\r
1392         r = Panel.validate_element_id [], :panel_id, nil\r
1393       end\r
1394     end\r
1395     #実データでチェック\r
1396     #依頼チェックだけでは不安なので最低限のチェックを\r
1397     context 'コマ新規のとき' do\r
1398       it 'コマ絵で正常通過している' do\r
1399         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1400         @panel.panel_pictures.build(\r
1401           FactoryGirl.attributes_for(:panel_picture, :panel_id => nil, :picture_id => @p.id, :t => nil)\r
1402         )\r
1403         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1404         r.should be_true\r
1405       end\r
1406       it 'フキダシで正常通過している' do\r
1407         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1408         @panel.speech_balloons.build(\r
1409           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1410         )\r
1411         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1412         r.should be_true\r
1413       end\r
1414     end\r
1415     context 'コマ既存のとき' do\r
1416       it 'コマ絵で正常通過している' do\r
1417         @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1418         @panel.panel_pictures.build(\r
1419           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1420         )\r
1421         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1422         r.should be_true\r
1423       end\r
1424       it 'フキダシで正常通過している' do\r
1425         @panel = FactoryGirl.create :panel, :author_id => @author.id\r
1426         @panel.speech_balloons.build(\r
1427           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1428         )\r
1429         r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
1430         r.should be_true\r
1431       end\r
1432     end\r
1433     context 'フキダシ新規のとき' do\r
1434       it 'バルーンで正常通過している' do\r
1435         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1436         @panel.speech_balloons.build(\r
1437           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1438         )\r
1439         @panel.speech_balloons.first.balloons.build(\r
1440           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => nil)\r
1441         )\r
1442         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
1443         r.should be_true\r
1444       end\r
1445       it 'セリフで正常通過している' do\r
1446         @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1447         @panel.speech_balloons.build(\r
1448           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1449         )\r
1450         @panel.speech_balloons.first.speeches.build(\r
1451           FactoryGirl.attributes_for(:speech, :speech_balloon_id => nil)\r
1452         )\r
1453         r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
1454         r.should be_true\r
1455       end\r
1456     end\r
1457   end\r
1458   describe 'idチェックリスト生成に於いて' do\r
1459     before do\r
1460       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1461     end\r
1462     context 'つつがなく終わるとき' do\r
1463       it 'コマ部品とフキダシ部品のトータル2を返す' do\r
1464         @panel.panel_pictures.build(\r
1465           FactoryGirl.attributes_for(:panel_picture, :panel_id => nil, :picture_id => @p.id, :t => nil)\r
1466         )\r
1467         @panel.speech_balloons.build(\r
1468           FactoryGirl.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
1469         )\r
1470         @panel.speech_balloons.first.balloons.build(\r
1471           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => nil)\r
1472         )\r
1473         @panel.speech_balloons.first.speeches.build(\r
1474           FactoryGirl.attributes_for(:speech, :speech_balloon_id => nil)\r
1475         )\r
1476         r = @panel.validate_id_list\r
1477         r.should have(2).items\r
1478       end\r
1479       it 'コマ部品とフキダシ部品[複数:2]のケースでトータル3を返す' do\r
1480         @panel.panel_pictures.build(\r
1481           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1482         )\r
1483         sb1 = @panel.speech_balloons.build(\r
1484           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1485         )\r
1486         sb1.balloons.build(\r
1487           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1488         )\r
1489         sb1.speeches.build(\r
1490           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1491         )\r
1492         sb2 = @panel.speech_balloons.build(\r
1493           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1494         )\r
1495         sb2.balloons.build(\r
1496           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
1497         )\r
1498         sb2.speeches.build(\r
1499           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
1500         )\r
1501         r = @panel.validate_id_list\r
1502         r.should have(3).items\r
1503       end\r
1504     end\r
1505   end\r
1506   describe 'idチェック複合に於いて' do\r
1507     before do\r
1508       @panel = FactoryGirl.build :panel, :author_id => @author.id\r
1509     end\r
1510     context 'つつがなく終わるとき' do\r
1511       it 'コマ部品とフキダシ部品の二回チェック依頼している' do\r
1512         Panel.should_receive(:validate_element_id).with(any_args).exactly(2)\r
1513         Panel.stub(:validate_element_id).with(any_args).and_return(true)\r
1514         @panel.panel_pictures.build(\r
1515           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => nil)\r
1516         )\r
1517         sb1 = @panel.speech_balloons.build(\r
1518           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
1519         )\r
1520         sb1.balloons.build(\r
1521           FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
1522         )\r
1523         sb1.speeches.build(\r
1524           FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
1525         )\r
1526         r = Panel.validate_elements_id(@panel.validate_id_list)\r
1527       end\r
1528     end\r
1529   end\r
1530 =end\r
1531 end\r