OSDN Git Service

merge v04
[pettanr/pettanr.git] / spec / models / comic_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3
4 describe Comic do
5   before do
6     Factory :admin
7     @sp = Factory :system_picture
8     @lg = Factory :license_group
9     @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
10     @user = Factory( :user_yas)
11     @author = @user.author
12     @artist = Factory :artist_yas, :author_id => @author.id
13   end
14   
15   describe '検証に於いて' do
16     before do
17     end
18     
19     it 'オーソドックスなデータなら通る' do
20       @comic = Factory.build :comic, :author_id => @author.id
21       @comic.should be_valid
22     end
23     
24     context 'titleを検証するとき' do
25       it 'nullなら失敗する' do
26         @comic = Factory.build :comic, :author_id => @author.id, :title => nil
27         @comic.should_not be_valid
28       end
29       it '100文字以上なら失敗する' do
30         @comic = Factory.build :comic, :author_id => @author.id, :title => 'a'*101
31         @comic.should_not be_valid
32       end
33     end
34     context 'widthを検証するとき' do
35       it 'nullなら失敗する' do
36         @comic = Factory.build :comic, :author_id => @author.id, :width => nil
37         @comic.should_not be_valid
38       end
39       it '0なら失敗する' do
40         @comic = Factory.build :comic, :author_id => @author.id, :width => 0
41         @comic.should_not be_valid
42       end
43       it '負でも失敗する' do
44         @comic = Factory.build :comic, :author_id => @author.id, :width => -1
45         @comic.should_not be_valid
46       end
47       it '正なら通る' do
48         @comic = Factory.build :comic, :author_id => @author.id, :width => 1
49         @comic.should be_valid
50       end
51     end
52     context 'heightを検証するとき' do
53       it 'nullなら失敗する' do
54         @comic = Factory.build :comic, :author_id => @author.id, :height => nil
55         @comic.should_not be_valid
56       end
57       it '0なら失敗する' do
58         @comic = Factory.build :comic, :author_id => @author.id, :height => 0
59         @comic.should_not be_valid
60       end
61       it '負でも失敗する' do
62         @comic = Factory.build :comic, :author_id => @author.id, :height => -1
63         @comic.should_not be_valid
64       end
65       it '正なら通る' do
66         @comic = Factory.build :comic, :author_id => @author.id, :height => 1
67         @comic.should be_valid
68       end
69     end
70     context 'visibleを検証するとき' do
71       it 'nullなら失敗する' do
72         @comic = Factory.build :comic, :author_id => @author.id, :visible => nil
73         @comic.should_not be_valid
74       end
75       it '負なら失敗する' do
76         @comic = Factory.build :comic, :author_id => @author.id, :visible => -1
77         @comic.should_not be_valid
78       end
79       it '4以上なら失敗する' do
80         @comic = Factory.build :comic, :author_id => @author.id, :visible => 4
81         @comic.should_not be_valid
82       end
83     end
84   end
85   
86   describe 'データ補充に於いて' do
87     before do
88       @comic = Comic.new
89     end
90     
91     context '初期値を補充するとき' do
92       it '空なら0が補充される' do
93         @comic.supply_default
94         @comic.visible.should == 0
95       end
96       it 'visibleが空でないなら変化なし' do
97         @comic.visible = 1
98         lambda{@comic.supply_default}.should_not change(@comic, :visible)
99       end
100     end
101   end
102   
103   describe '作者判定に於いて' do
104     before do
105     end
106     it '自作のコミックならyes' do
107       comic = Factory :comic, :author_id => @author.id
108       comic.own?(@author).should == true
109     end
110     it '他人のコミックならno' do
111       comic = Factory :comic, :author_id => 0
112       comic.own?(@author).should == false
113     end
114     it '作家が不明ならno' do
115       comic = Factory :comic, :author_id => @author.id
116       comic.own?(nil).should == false
117     end
118   end
119   describe '閲覧許可に於いて' do
120     before do
121     end
122     it '自作の公開コミックを見るときは許可する' do
123       Comic.any_instance.stub(:own?).and_return(true)
124       comic = Factory :comic, :author_id => @author.id, :visible => 3
125       comic.visible?(@author).should == true
126     end
127     it '自作のコミックは非公開でも許可する' do
128       Comic.any_instance.stub(:own?).and_return(true)
129       comic = Factory :comic, :author_id => @author.id, :visible => 0
130       comic.visible?(@author).should == true
131     end
132     it '他人のコミックでも公開コミックなら許可する' do
133       Comic.any_instance.stub(:own?).and_return(false)
134       comic = Factory :comic, :author_id => 0, :visible => 3
135       comic.visible?(@author).should == true
136     end
137     it '他人のコミックで非公開コミックなら許可しない' do
138       Comic.any_instance.stub(:own?).and_return(false)
139       comic = Factory :comic, :author_id => 0, :visible => 0
140       comic.visible?(@author).should == false
141     end
142   end
143   describe '単体取得に於いて' do
144     before do
145       @comic = Factory :comic, :author_id => @author.id
146     end
147     it '指定のコミックを返す' do
148       c = Comic.show @comic.id, @author.id
149       c.should eq @comic
150     end
151   end
152   describe '関連テーブルプションに於いて' do
153     context 'オプションがないとき' do
154       it '2つの項目を含んでいる' do
155         r = Comic.show_include_opt
156         r.should have(2).items
157       end
158       it '作家を含んでいる' do
159         r = Comic.show_include_opt
160         r.has_key?(:author).should be_true
161       end
162       it 'ストーリーを含んでいる' do
163         r = Comic.show_include_opt
164         r.has_key?(:stories).should be_true
165       end
166         it 'ストーリーはコマを含んでいる' do
167           r = Comic.show_include_opt
168           r[:stories].has_key?(:panel).should be_true
169         end
170     end
171   end
172   describe 'json単体出力オプションに於いて' do
173     it 'includeキーを含んでいる' do
174       r = Comic.show_json_include_opt
175       r.has_key?(:include).should be_true
176     end
177     it '2つの項目を含んでいる' do
178       r = Comic.show_json_include_opt[:include]
179       r.should have(2).items
180     end
181     it '作家を含んでいる' do
182       r = Comic.show_json_include_opt[:include]
183       r.has_key?(:author).should be_true
184     end
185     it 'ストーリーを含んでいる' do
186       r = Comic.show_json_include_opt[:include]
187       r.has_key?(:stories).should be_true
188     end
189       it 'ストーリーはコマを含んでいる' do
190         r = Comic.show_json_include_opt[:include]
191         r[:stories].has_key?(:panel).should be_true
192       end
193   end
194   describe '一覧取得に於いて' do
195     before do
196       @comic = Factory :comic, :author_id => @author.id
197     end
198     context 'page補正について' do
199       it '文字列から数値に変換される' do
200         Comic.page('8').should eq 8
201       end
202       it 'nilの場合は1になる' do
203         Comic.page().should eq 1
204       end
205       it '0以下の場合は1になる' do
206         Comic.page('0').should eq 1
207       end
208     end
209     context 'page_size補正について' do
210       it '文字列から数値に変換される' do
211         Comic.page_size('7').should eq 7
212       end
213       it 'nilの場合はComic.default_page_sizeになる' do
214         Comic.page_size().should eq Comic.default_page_size
215       end
216       it '0以下の場合はComic.default_page_sizeになる' do
217         Comic.page_size('0').should eq Comic.default_page_size
218       end
219       it 'Comic.max_page_sizeを超えた場合はComic.max_page_sizeになる' do
220         Comic.page_size('1000').should eq Comic.max_page_size
221       end
222     end
223     it 'リストを返す' do
224       c = Comic.list
225       c.should eq [@comic]
226     end
227     it '非公開コミックは(自分のコミックであっても)含んでいない' do
228       Factory :comic, :author_id => @author.id, :visible => 0
229       c = Comic.list
230       c.should eq [@comic]
231     end
232     it '時系列で並んでいる' do
233       v = Factory :comic, :author_id => @author.id, :updated_at => Time.now + 100
234       c = Comic.list
235       c.should eq [v, @comic]
236     end
237     context 'DBに5件あって1ページの件数を2件に変えたとして' do
238       before do
239         @comic2 = Factory :comic, :author_id => @author.id, :updated_at => Time.now + 100
240         @comic3 = Factory :comic, :author_id => @author.id, :updated_at => Time.now + 200
241         @comic4 = Factory :comic, :author_id => @author.id, :updated_at => Time.now + 300
242         @comic5 = Factory :comic, :author_id => @author.id, :updated_at => Time.now + 400
243         Comic.stub(:default_page_size).and_return(2)
244       end
245       it '通常は2件を返す' do
246         c = Comic.list
247         c.should have(2).items 
248       end
249       it 'page=1なら末尾2件を返す' do
250         #時系列で並んでいる
251         c = Comic.list({}, 1)
252         c.should eq [@comic5, @comic4]
253       end
254       it 'page=2なら中間2件を返す' do
255         c = Comic.list({}, 2)
256         c.should eq [@comic3, @comic2]
257       end
258       it 'page=3なら先頭1件を返す' do
259         c = Comic.list({}, 3)
260         c.should eq [@comic]
261       end
262     end
263   end
264   describe 'list関連テーブルプションに於いて' do
265     it 'includeキーを含んでいる' do
266       r = Comic.list_opt
267       r.has_key?(:include).should be_true
268     end
269     it '2つの項目を含んでいる' do
270       r = Comic.list_opt[:include]
271       r.should have(2).items
272     end
273     it 'ストーリーを含んでいる' do
274       r = Comic.list_opt[:include]
275       r.has_key?(:stories).should be_true
276     end
277       it 'ストーリーはコマを含んでいる' do
278         r = Comic.list_opt[:include]
279         r[:stories].has_key?(:panel).should be_true
280       end
281     it '作家を含んでいる' do
282       r = Comic.list_opt[:include]
283       r.has_key?(:author).should be_true
284     end
285   end
286   describe 'json一覧出力オプションに於いて' do
287     it 'includeキーを含んでいる' do
288       r = Comic.list_json_opt
289       r.has_key?(:include).should be_true
290     end
291     it '2つの項目を含んでいる' do
292       r = Comic.list_json_opt[:include]
293       r.should have(2).items
294     end
295     it 'ストーリーを含んでいる' do
296       r = Comic.list_json_opt[:include]
297       r.has_key?(:stories).should be_true
298     end
299       it 'ストーリーはコマを含んでいる' do
300         r = Comic.list_json_opt[:include]
301         r[:stories].has_key?(:panel).should be_true
302       end
303     it '作家を含んでいる' do
304       r = Comic.list_json_opt[:include]
305       r.has_key?(:author).should be_true
306     end
307   end
308 end