OSDN Git Service

t#32046:
[pettanr/pettanr.git] / spec / models / author_spec.rb
1 # -*- encoding: utf-8 -*-
2 #作家
3 require 'spec_helper'
4
5 describe Author do
6   before do
7     SpeechBalloonTemplate.delete_all
8     @admin = FactoryGirl.create :admin
9     @user = FactoryGirl.create( :user_yas)
10     @author = FactoryGirl.create :author, :user_id => @user.id
11   end
12
13   describe '検証に於いて' do
14     before do
15     end
16     
17     context 'オーソドックスなデータのとき' do
18       it '下限データが通る' do
19         @author.name = 'a'
20         @author.working_panel_id = 0
21         @author.should be_valid
22       end
23       it '上限データが通る' do
24         @author.name = 'a'*30
25         @author.should be_valid
26       end
27     end
28     
29     context 'nameを検証するとき' do
30       it 'nullなら失敗する' do
31         @author.name = nil
32         @author.should_not be_valid
33       end
34       it '30文字以上なら失敗する' do
35         @author.name = 'a'*31
36         @author.should_not be_valid
37       end
38     end
39     context 'working_panel_idを検証するとき' do
40       it '数値でなければ失敗する' do
41         @author.working_panel_id = 'a'
42         @author.should_not be_valid
43       end
44     end
45     context 'user_idを検証するとき' do
46       it 'nullなら失敗する' do
47         @author.user_id = nil
48         @author.should_not be_valid
49       end
50       it '数値でなければ失敗する' do
51         @author.user_id = 'a'
52         @author.should_not be_valid
53       end
54       it '存在するアカウントでなければ失敗する' do
55         @author.user_id = 0
56         @author.should_not be_valid
57       end
58     end
59   end
60   
61   describe '文字コード検証に於いて' do
62     before do
63     end
64     
65     context 'nameを検証するとき' do
66       it 'Shift JISなら失敗する' do
67         @author.name = "\x83G\x83r\x83]\x83D"
68         lambda{
69           @author.valid_encode
70         }.should raise_error(Pettanr::BadRequest)
71       end
72     end
73     
74   end
75   
76   describe 'デフォルト値補充に於いて' do
77     it '名前がno nameになっている' do
78       @author = FactoryGirl.build :author, :name => nil
79       @author.supply_default
80       @author.name.should eq 'no name'
81     end
82   end
83   
84   describe '上書き補充に於いて' do
85   end
86   
87   describe '所持判定に於いて' do
88     before do
89       @other_user = FactoryGirl.create :user_yas
90       @other_author = @other_user.author
91     end
92     context '事前チェックする' do
93       it '自身にロールリストからの作家取得を依頼している' do
94         Author.should_receive(:get_author_from_roles).with(any_args).exactly(1)
95         r = @author.own?([@author])
96       end
97     end
98     context 'ロール内作家が取得できるとき' do
99       before do
100       end
101       it 'ロール内作家のidが自身の作家idと一致するなら許可する' do
102         Author.stub(:get_author_from_roles).with(any_args).and_return(@author)
103         r = @author.own?([@author])
104         r.should be_true
105       end
106       it 'ロール内作家のidが自身の作家idと一致しないならno' do
107         Author.stub(:get_author_from_roles).with(any_args).and_return(@other_author)
108         @author.own?(@other_author).should be_false
109       end
110     end
111     context 'ロール内作家が取得できないとき' do
112       before do
113         Author.stub(:get_author_from_roles).with(any_args).and_return(nil)
114       end
115       it 'Falseを返す' do
116         r = @author.own?([@author])
117         r.should be_false
118       end
119     end
120   end
121   
122   describe '閲覧許可に於いて' do
123     before do
124     end
125     context 'オープンモードのとき' do
126       before do
127         MagicNumber['run_mode'] = 0
128       end
129       it '自身にゲスト用ロールチェックを問い合わせしている' do
130         Author.any_instance.stub(:guest_role_check).and_return(true)
131         Author.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)
132         r = @author.visible?([@author])
133       end
134       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do
135         Author.any_instance.stub(:guest_role_check).and_return(false)
136         r = @author.visible?([@author])
137         r.should be_false
138       end
139     end
140     context 'クローズドモードのとき' do
141       before do
142         MagicNumber['run_mode'] = 1
143       end
144       it '自身に読者用ロールチェックを問い合わせしている' do
145         Author.any_instance.stub(:reader_role_check).and_return(true)
146         Author.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)
147         r = @author.visible?([@author])
148       end
149       it '読者用ロールチェックが失敗したとき、falseを返す' do
150         Author.any_instance.stub(:reader_role_check).and_return(false)
151         r = @author.visible?([@author])
152         r.should be_false
153       end
154     end
155     context '事前チェックする' do
156       before do
157         MagicNumber['run_mode'] = 1
158         Author.any_instance.stub(:reader_role_check).and_return(true)
159       end
160     end
161     context 'つつがなく終わるとき' do
162       before do
163         MagicNumber['run_mode'] = 1
164         Author.any_instance.stub(:reader_role_check).and_return(true)
165       end
166       it '許可する' do
167         r = @author.visible?([@author])
168         r.should be_true
169       end
170     end
171   end
172   
173   describe '絵師作家判定に於いて' do
174     before do
175     end
176     context 'Trueのケース' do
177       it 'リンクされた絵師がある' do
178         artist = FactoryGirl.create :artist, :author_id => @author.id
179         @author.artist?.should eq true
180       end
181     end
182     context 'Falseのケース' do
183       it 'リンクされた絵師がない' do
184         @author.artist?.should eq false
185       end
186     end
187   end
188   
189   describe '一覧取得に於いて' do
190     before do
191     end
192     context 'page補正について' do
193       it '文字列から数値に変換される' do
194         Author.page('8').should eq 8
195       end
196       it 'nilの場合は1になる' do
197         Author.page().should eq 1
198       end
199       it '0以下の場合は1になる' do
200         Author.page('0').should eq 1
201       end
202     end
203     context 'page_size補正について' do
204       it '文字列から数値に変換される' do
205         Author.page_size('7').should eq 7
206       end
207       it 'nilの場合はAuthor.default_page_sizeになる' do
208         Author.page_size().should eq Author.default_page_size
209       end
210       it '0以下の場合はAuthor.default_page_sizeになる' do
211         Author.page_size('0').should eq Author.default_page_size
212       end
213       it 'Author.max_page_sizeを超えた場合はAuthor.max_page_sizeになる' do
214         Author.page_size('1000').should eq Author.max_page_size
215       end
216     end
217     context 'つつがなく終わるとき' do
218       it '一覧取得オプションを利用している' do
219         Author.stub(:list_opt).with(any_args).and_return({})
220         Author.should_receive(:list_opt).with(any_args).exactly(1)
221         r = Author.list
222       end
223     end
224     it 'リストを返す' do
225       r = Author.list
226       r.should eq [@author]
227     end
228     it '作成時系列で並んでいる' do
229       @other_user = FactoryGirl.create :user_yas
230       @other_author = FactoryGirl.create :author, :user_id => @other_user.id
231       n = @other_user.author
232       n.created_at = Time.now + 100
233       n.save
234       l = Author.list
235       l.should eq [n, @author]
236     end
237     context 'DBに5件あって1ページの件数を2件に変えたとして' do
238       before do
239         @other_user2 = FactoryGirl.create :user_yas
240         @author2 = FactoryGirl.create :author, :user_id => @other_user2.id
241         @author2.created_at = Time.now + 100
242         @author2.save
243         @other_user3 = FactoryGirl.create :user_yas
244         @author3 = FactoryGirl.create :author, :user_id => @other_user3.id
245         @author3.created_at = Time.now + 200
246         @author3.save
247         @other_user4 = FactoryGirl.create :user_yas
248         @author4 = FactoryGirl.create :author, :user_id => @other_user4.id
249         @author4.created_at = Time.now + 300
250         @author4.save
251         @other_user5 = FactoryGirl.create :user_yas
252         @author5 = FactoryGirl.create :author, :user_id => @other_user5.id
253         @author5.created_at = Time.now + 400
254         @author5.save
255         Author.stub(:default_page_size).and_return(2)
256       end
257       it '通常は2件を返す' do
258         r = Author.list
259         r.should have(2).items 
260       end
261       it 'page=1なら末尾2件を返す' do
262         #時系列で並んでいる
263         r = Author.list(1)
264         r.should eq [@author5, @author4]
265       end
266       it 'page=2なら中間2件を返す' do
267         r = Author.list(2)
268         r.should eq [@author3, @author2]
269       end
270       it 'page=3なら先頭1件を返す' do
271         r = Author.list(3)
272         r.should eq [@author]
273       end
274     end
275   end
276   
277   describe '一覧ページ制御に於いて' do
278     before do
279       Author.stub(:count).with(any_args).and_return(100)
280     end
281     it 'ページ制御を返す' do
282       r = Author.list_paginate
283       r.is_a?(Kaminari::PaginatableArray).should be_true
284     end
285     it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do
286       r = Author.list_paginate 3, 10
287       r.limit_value.should eq 10
288       r.offset_value.should eq 20
289     end
290   end
291   
292   describe '一覧取得オプションに於いて' do
293     it '1つの項目を含んでいる' do
294       r = Author.list_opt
295       r.should have(1).items
296     end
297     it '絵師を含んでいる' do
298       r = Author.list_opt
299       r.has_key?(:artist).should be_true
300     end
301   end
302   describe 'json一覧出力オプションに於いて' do
303     before do
304       @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
305     end
306     it '絵師を含んでいる' do
307       r = Author.list.to_json Author.list_json_opt
308       j = JSON.parse r
309       i = j.first
310       i.has_key?('artist').should be_true
311     end
312   end
313   
314   describe '単体取得に於いて' do
315     before do
316     end
317     context 'つつがなく終わるとき' do
318       it '単体取得オプションを利用している' do
319         Author.stub(:show_opt).with(any_args).and_return({})
320         Author.should_receive(:show_opt).with(any_args).exactly(1)
321         r = Author.show @author.id, @author
322       end
323       it '閲覧許可を問い合わせている' do
324         Author.any_instance.stub(:visible?).with(any_args).and_return(true)
325         Author.any_instance.should_receive(:visible?).with(any_args).exactly(1)
326         r = Author.show @author.id, @author
327       end
328     end
329     it '指定の作家を返す' do
330       r = Author.show @author.id, @author
331       r.should eq @author
332     end
333     context '閲覧許可が出なかったとき' do
334       it '403Forbidden例外を返す' do
335         Author.any_instance.stub(:visible?).and_return(false)
336         lambda{
337           Author.show @author.id, @author
338         }.should raise_error(ActiveRecord::Forbidden)
339       end
340     end
341     context '存在しない作家を開こうとしたとき' do
342       it '404RecordNotFound例外を返す' do
343         lambda{
344           Author.show 110, @author
345         }.should raise_error(ActiveRecord::RecordNotFound)
346       end
347     end
348   end
349   describe '編集取得に於いて' do
350     before do
351     end
352     context 'つつがなく終わるとき' do
353       it '単体取得オプションを利用している' do
354         Author.stub(:show_opt).with(any_args).and_return({})
355         Author.should_receive(:show_opt).with(any_args).exactly(1)
356         r = Author.edit @author.id, @author
357       end
358       it '所持判定を問い合わせている' do
359         Author.any_instance.stub(:own?).with(any_args).and_return(true)
360         Author.any_instance.should_receive(:own?).with(any_args).exactly(1)
361         r = Author.edit @author.id, @author
362       end
363     end
364     it '指定の作家を返す' do
365       Author.any_instance.stub(:own?).and_return(true)
366       r = Author.edit @author.id, @author.id
367       r.should eq @author
368     end
369     context '他人の作家を開こうとしたとき' do
370       it '403Forbidden例外を返す' do
371         Author.any_instance.stub(:own?).and_return(false)
372         lambda{
373           Author.edit @author.id, @author
374         }.should raise_error(ActiveRecord::Forbidden)
375       end
376     end
377     context '存在しない作家を開こうとしたとき' do
378       it '404RecordNotFound例外を返す' do
379         lambda{
380           Author.edit 110, @author
381         }.should raise_error(ActiveRecord::RecordNotFound)
382       end
383     end
384   end
385   describe '単体取得オプションに於いて' do
386     it 'includeキーを含んでいる' do
387       r = Author.show_opt
388       r.has_key?(:include).should be_true
389     end
390     it '1つの項目を含んでいる' do
391       r = Author.show_opt[:include]
392       r.should have(1).items
393     end
394     it '絵師を含んでいる' do
395       r = Author.show_opt[:include]
396       r.has_key?(:artist).should be_true
397     end
398   end
399   describe 'json単体出力オプションに於いて' do
400     before do
401       @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
402     end
403     it '絵師を含んでいる' do
404       r = Author.show(@author.id, @author).to_json Author.show_json_opt
405       j = JSON.parse r
406       i = j
407       i.has_key?('artist').should be_true
408     end
409   end
410   
411   describe 'マイリストページ制御パラメータに於いて' do
412     before do
413     end
414     context 'スクロールpage_size補正について' do
415       it '文字列から数値に変換される' do
416         Author.scroll_page_size('7').should eq 7
417       end
418       it 'nilの場合はAuthor.default_scroll_page_sizeになる' do
419         Author.scroll_page_size().should eq Author.default_scroll_page_size
420       end
421       it '0以下の場合はAuthor.default_scroll_page_sizeになる' do
422         Author.scroll_page_size('0').should eq Author.default_scroll_page_size
423       end
424       it 'Author.scroll_max_page_sizeを超えた場合はAuthor.scroll_max_page_sizeになる' do
425         Author.scroll_page_size('1000').should eq Author.scroll_max_page_size
426       end
427     end
428     context 'スクコマpage_size補正について' do
429       it '文字列から数値に変換される' do
430         Author.scroll_panel_page_size('7').should eq 7
431       end
432       it 'nilの場合はAuthor.default_scroll_panel_page_sizeになる' do
433         Author.scroll_panel_page_size().should eq Author.default_scroll_panel_page_size
434       end
435       it '0以下の場合はAuthor.default_scroll_panel_page_sizeになる' do
436         Author.scroll_panel_page_size('0').should eq Author.default_scroll_panel_page_size
437       end
438       it 'Author.scroll_panel_max_page_sizeを超えた場合はAuthor.scroll_panel_max_page_sizeになる' do
439         Author.scroll_panel_page_size('1000').should eq Author.scroll_panel_max_page_size
440       end
441     end
442     context 'コミックpage_size補正について' do
443       it '文字列から数値に変換される' do
444         Author.comic_page_size('7').should eq 7
445       end
446       it 'nilの場合はAuthor.default_comic_page_sizeになる' do
447         Author.comic_page_size().should eq Author.default_comic_page_size
448       end
449       it '0以下の場合はAuthor.default_comic_page_sizeになる' do
450         Author.comic_page_size('0').should eq Author.default_comic_page_size
451       end
452       it 'Author.comic_max_page_sizeを超えた場合はAuthor.comic_max_page_sizeになる' do
453         Author.comic_page_size('1000').should eq Author.comic_max_page_size
454       end
455     end
456     context 'ストーリーpage_size補正について' do
457       it '文字列から数値に変換される' do
458         Author.story_page_size('7').should eq 7
459       end
460       it 'nilの場合はAuthor.default_story_page_sizeになる' do
461         Author.story_page_size().should eq Author.default_story_page_size
462       end
463       it '0以下の場合はAuthor.default_story_page_sizeになる' do
464         Author.story_page_size('0').should eq Author.default_story_page_size
465       end
466       it 'Author.story_max_page_sizeを超えた場合はAuthor.story_max_page_sizeになる' do
467         Author.story_page_size('1000').should eq Author.story_max_page_size
468       end
469     end
470     context 'スト紙page_size補正について' do
471       it '文字列から数値に変換される' do
472         Author.story_sheet_page_size('7').should eq 7
473       end
474       it 'nilの場合はAuthor.default_story_sheet_page_sizeになる' do
475         Author.story_sheet_page_size().should eq Author.default_story_sheet_page_size
476       end
477       it '0以下の場合はAuthor.default_story_sheet_page_sizeになる' do
478         Author.story_sheet_page_size('0').should eq Author.default_story_sheet_page_size
479       end
480       it 'Author.story_sheet_max_page_sizeを超えた場合はAuthor.story_sheet_max_page_sizeになる' do
481         Author.story_sheet_page_size('1000').should eq Author.story_sheet_max_page_size
482       end
483     end
484     context '用紙page_size補正について' do
485       it '文字列から数値に変換される' do
486         Author.sheet_page_size('7').should eq 7
487       end
488       it 'nilの場合はAuthor.default_sheet_page_sizeになる' do
489         Author.sheet_page_size().should eq Author.default_sheet_page_size
490       end
491       it '0以下の場合はAuthor.default_sheet_page_sizeになる' do
492         Author.sheet_page_size('0').should eq Author.default_sheet_page_size
493       end
494       it 'Author.sheet_max_page_sizeを超えた場合はAuthor.sheet_max_page_sizeになる' do
495         Author.sheet_page_size('1000').should eq Author.sheet_max_page_size
496       end
497     end
498     context '紙コマpage_size補正について' do
499       it '文字列から数値に変換される' do
500         Author.sheet_panel_page_size('7').should eq 7
501       end
502       it 'nilの場合はAuthor.default_sheet_panel_page_sizeになる' do
503         Author.sheet_panel_page_size().should eq Author.default_sheet_panel_page_size
504       end
505       it '0以下の場合はAuthor.default_sheet_panel_page_sizeになる' do
506         Author.sheet_panel_page_size('0').should eq Author.default_sheet_panel_page_size
507       end
508       it 'Author.sheet_panel_max_page_sizeを超えた場合はAuthor.sheet_panel_max_page_sizeになる' do
509         Author.sheet_panel_page_size('1000').should eq Author.sheet_panel_max_page_size
510       end
511     end
512     context 'コマpage_size補正について' do
513       it '文字列から数値に変換される' do
514         Author.panel_page_size('7').should eq 7
515       end
516       it 'nilの場合はAuthor.default_panel_page_sizeになる' do
517         Author.panel_page_size().should eq Author.default_panel_page_size
518       end
519       it '0以下の場合はAuthor.default_panel_page_sizeになる' do
520         Author.panel_page_size('0').should eq Author.default_panel_page_size
521       end
522       it 'Author.panel_max_page_sizeを超えた場合はAuthor.panel_max_page_sizeになる' do
523         Author.panel_page_size('1000').should eq Author.panel_max_page_size
524       end
525     end
526     context 'コマ素材page_size補正について' do
527       it '文字列から数値に変換される' do
528         Author.panel_picture_page_size('7').should eq 7
529       end
530       it 'nilの場合はAuthor.default_panel_picture_page_sizeになる' do
531         Author.panel_picture_page_size().should eq Author.default_panel_picture_page_size
532       end
533       it '0以下の場合はAuthor.default_panel_picture_page_sizeになる' do
534         Author.panel_picture_page_size('0').should eq Author.default_panel_picture_page_size
535       end
536       it 'Author.panel_picture_max_page_sizeを超えた場合はAuthor.panel_picture_max_page_sizeになる' do
537         Author.panel_picture_page_size('1000').should eq Author.panel_picture_max_page_size
538       end
539     end
540     context 'フキダシpage_size補正について' do
541       it '文字列から数値に変換される' do
542         Author.speech_balloon_page_size('7').should eq 7
543       end
544       it 'nilの場合はAuthor.default_speech_balloon_page_sizeになる' do
545         Author.speech_balloon_page_size().should eq Author.default_speech_balloon_page_size
546       end
547       it '0以下の場合はAuthor.default_speech_balloon_page_sizeになる' do
548         Author.speech_balloon_page_size('0').should eq Author.default_speech_balloon_page_size
549       end
550       it 'Author.speech_balloon_max_page_sizeを超えた場合はAuthor.speech_balloon_max_page_sizeになる' do
551         Author.speech_balloon_page_size('1000').should eq Author.speech_balloon_max_page_size
552       end
553     end
554     context '景色カラーpage_size補正について' do
555       it '文字列から数値に変換される' do
556         Author.ground_picture_page_size('7').should eq 7
557       end
558       it 'nilの場合はAuthor.default_ground_picture_page_sizeになる' do
559         Author.ground_picture_page_size().should eq Author.default_ground_picture_page_size
560       end
561       it '0以下の場合はAuthor.default_ground_picture_page_sizeになる' do
562         Author.ground_picture_page_size('0').should eq Author.default_ground_picture_page_size
563       end
564       it 'Author.ground_picture_max_page_sizeを超えた場合はAuthor.ground_picture_max_page_sizeになる' do
565         Author.ground_picture_page_size('1000').should eq Author.ground_picture_max_page_size
566       end
567     end
568     context '景色カラーコードpage_size補正について' do
569       it '文字列から数値に変換される' do
570         Author.ground_color_page_size('7').should eq 7
571       end
572       it 'nilの場合はAuthor.default_ground_color_page_sizeになる' do
573         Author.ground_color_page_size().should eq Author.default_ground_color_page_size
574       end
575       it '0以下の場合はAuthor.default_ground_color_page_sizeになる' do
576         Author.ground_color_page_size('0').should eq Author.default_ground_color_page_size
577       end
578       it 'Author.ground_color_max_page_sizeを超えた場合はAuthor.ground_color_max_page_sizeになる' do
579         Author.ground_color_page_size('1000').should eq Author.ground_color_max_page_size
580       end
581     end
582     context '素材page_size補正について' do
583       it '文字列から数値に変換される' do
584         Author.resource_picture_page_size('7').should eq 7
585       end
586       it 'nilの場合はAuthor.default_resource_picture_page_sizeになる' do
587         Author.resource_picture_page_size().should eq Author.default_resource_picture_page_size
588       end
589       it '0以下の場合はAuthor.default_resource_picture_page_sizeになる' do
590         Author.resource_picture_page_size('0').should eq Author.default_resource_picture_page_size
591       end
592       it 'Author.resource_picture_max_page_sizeを超えた場合はAuthor.resource_picture_max_page_sizeになる' do
593         Author.resource_picture_page_size('1000').should eq Author.resource_picture_max_page_size
594       end
595     end
596   end
597 end