OSDN Git Service

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