1 # -*- encoding: utf-8 -*-
4 describe OriginalPicture do
7 @user = Factory( :user_yas)
9 @artist = Factory :artist_yas, :author_id => @author.id
10 @other_user = Factory( :user_yas)
11 @other_author = @other_user.author
12 @other_artist = Factory :artist_yas, :author_id => @other_author.id
13 @license = Factory :license
20 it 'オーソドックスなデータなら通る' do
21 @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
25 context 'extを検証するとき' do
27 @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
35 @op.should_not be_valid
39 @op.should_not be_valid
41 it 'png,gif,jpeg以外なら失敗する' do
43 @op.should_not be_valid
46 context 'widthを検証するとき' do
48 @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
56 @op.should_not be_valid
60 @op.should_not be_valid
64 @op.should_not be_valid
68 @op.should_not be_valid
71 context 'heightを検証するとき' do
73 @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
81 @op.should_not be_valid
85 @op.should_not be_valid
89 @op.should_not be_valid
93 @op.should_not be_valid
96 context 'filesizeを検証するとき' do
98 @op = Factory.build :original_picture, :artist_id => @artist.id, :license_id => @license.id
106 @op.should_not be_valid
110 @op.should_not be_valid
114 @op.should_not be_valid
117 @op.filesize = 2000000+1
118 @op.should_not be_valid
121 context 'artist_idを検証するとき' do
123 @op = Factory.build :original_picture, :license_id => @license.id
126 @op.artist_id = @artist.id
131 @op.should_not be_valid
135 @op.should_not be_valid
137 it '存在する絵師でなければ失敗する' do
139 @op.should_not be_valid
142 context 'license_idを検証するとき' do
144 @op = Factory.build :original_picture, :artist_id => @artist.id
147 @op.license_id = @license.id
152 @op.should_not be_valid
156 @op.should_not be_valid
158 it '存在するlicenseでなければ失敗する' do
160 @op.should_not be_valid
165 describe 'データ補充に於いて' do
171 describe '作者判定に於いて' do
175 op = Factory :original_picture, :artist_id => @artist.id
176 op.own?(@author).should == true
179 op = Factory :original_picture, :artist_id => @other_artist.id
180 op.own?(@author).should == false
183 op = Factory :original_picture, :artist_id => @artist.id
184 op.own?(nil).should == false
187 other_user = Factory( :user_yas)
188 op = Factory :original_picture, :artist_id => @artist.id
189 op.own?(@other_author).should == false
192 describe '単体取得に於いて' do
194 @op = Factory :original_picture, :artist_id => @artist.id
197 pic = OriginalPicture.show @op.id, @author
200 context '関連テーブルオプションがないとき' do
201 it 'ライセンスデータだけを含んでいる' do
202 r = OriginalPicture.show_include_opt
203 r.should eq [:license]
206 context '関連テーブルオプションで絵師を含ませたとき' do
207 it 'ライセンスデータと作者データを含んでいる' do
208 r = OriginalPicture.show_include_opt(:include => :artist)
209 r.should eq [:license, :artist]
213 describe '一覧取得に於いて' do
215 @op = Factory :original_picture, :artist_id => @artist.id
217 context 'page補正について' do
218 it '文字列から数値に変換される' do
219 OriginalPicture.page('8').should eq 8
222 OriginalPicture.page().should eq 1
225 OriginalPicture.page('0').should eq 1
228 context 'page_size補正について' do
229 it '文字列から数値に変換される' do
230 OriginalPicture.page_size('7').should eq 7
232 it 'nilの場合はOriginalPicture.default_page_sizeになる' do
233 OriginalPicture.page_size().should eq OriginalPicture.default_page_size
235 it '0以下の場合はOriginalPicture.default_page_sizeになる' do
236 OriginalPicture.page_size('0').should eq OriginalPicture.default_page_size
238 it 'OriginalPicture.max_page_sizeを超えた場合はOriginalPicture.max_page_sizeになる' do
239 OriginalPicture.page_size('1000').should eq OriginalPicture.max_page_size
243 pic = OriginalPicture.list @artist.id
247 Factory :original_picture, :artist_id => @other_artist.id
248 pic = OriginalPicture.list @artist.id
252 newpic = Factory :original_picture, :artist_id => @artist.id
253 pic = OriginalPicture.list @artist.id
254 pic.should eq [newpic, @op]
256 context 'DBに5件あって1ページの件数を2件に変えたとして' do
258 @op2 = Factory :original_picture, :artist_id => @artist.id
259 @op3 = Factory :original_picture, :artist_id => @artist.id
260 @op4 = Factory :original_picture, :artist_id => @artist.id
261 @op5 = Factory :original_picture, :artist_id => @artist.id
262 OriginalPicture.stub(:default_page_size).and_return(2)
265 pic = OriginalPicture.list @artist.id
266 pic.should have(2).items
268 it 'page=1なら末尾2件を返す' do
270 pic = OriginalPicture.list( @artist.id, {}, 1)
271 pic.should eq [@op5, @op4]
273 it 'page=2なら中間2件を返す' do
274 pic = OriginalPicture.list( @artist.id, {}, 2)
275 pic.should eq [@op3, @op2]
277 it 'page=3なら先頭1件を返す' do
278 pic = OriginalPicture.list( @artist.id, {}, 3)
283 describe 'RMagick変換に於いて' do
285 @op = Factory.build :original_picture, :artist_id => @artist.id
287 context 'つつがなく終わるとき' do
288 it '画像データをオブジェクト化している' do
289 Magick::Image.stub(:from_blob).and_return(['mgkobj'])
290 @op.data_to_mgk('mgkbin').should eq 'mgkobj'
295 Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
296 @op.data_to_mgk('mgkbin').should be_false
298 it '全体エラーがセットされている' do
299 Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
301 @op.data_to_mgk('mgkbin')
302 }.should change(@op.errors[:base], :count)
306 describe '作成・更新に於いて' do
308 @op = Factory.build :original_picture, :artist_id => @artist.id
310 class Mgk ; class Image ; end ; end
312 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
313 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
314 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
315 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
316 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
317 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
318 #原画ファイル削除だけは必ず成功するものとしておく
319 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
320 #素材取得は新規作成ケースでテストしておく
321 ResourcePicture.stub(:update_picture).with(any_args).and_return(
322 Factory.build :resource_picture, :artist_id => @artist.id
327 #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
328 #それで外部のメソッド呼び出しだけに着目してテストする。
329 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
330 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
331 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
332 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
334 it 'RMagick変換を依頼している' do
335 OriginalPicture.any_instance.should_receive(:data_to_mgk).exactly(1)
336 @op.store 'bindata', @artist, @license.id
\r
338 it '自身に属性をセットしている' do
339 OriginalPicture.any_instance.should_receive(:attributes=).exactly(1)
340 @op.store 'bindata', @artist, @license.id
\r
343 OriginalPicture.any_instance.should_receive(:save).exactly(1)
\r
344 @op.store 'bindata', @artist, @license.id
\r
346 it 'PictureIoに画像データの保存を依頼している' do
347 PictureIO::LocalPicture.any_instance.should_receive(:put).with(any_args).exactly(1)
348 @op.store 'bindata', @artist, @license.id
\r
350 it '素材モデルに対象素材を問い合わせている' do
351 ResourcePicture.should_receive(:update_picture).with(any_args).exactly(1)
352 @op.store 'bindata', @artist, @license.id
\r
354 it '対象素材オブジェクトに保存を依頼している' do
355 ResourcePicture.any_instance.should_receive(:store).with(any_args).exactly(1)
356 @op.store 'bindata', @artist, @license.id
\r
359 context 'つつがなく終わるとき' do
361 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
362 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
363 # OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
364 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
365 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
367 it '自身に属性をセットしている' do
369 @op.store 'bindata', @artist, @license.id
\r
370 }.should change @op, :filesize
372 it '原画モデルが作成されている' do
374 @op.store 'bindata', @artist, @license.id
375 }.should change OriginalPicture, :count
378 @op.store 'bindata', @artist, @license.id
379 OriginalPicture.find(@op).should_not be_nil
\r
382 @op.store('bindata', @artist, @license.id).should eq true
\r
385 #以下から例外ケース。処理先頭から失敗させていく
386 context 'RMagick変換が失敗したとき' do
388 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(false)
391 @op.store('bindata', @artist, @license.id).should be_false
\r
393 it '自身の保存は呼ばれていない' do
394 OriginalPicture.any_instance.should_not_receive(:save)
\r
397 context '自身の保存に失敗したとき' do
399 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
400 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(false)
\r
403 @op.store('bindata', @artist, @license.id).should be_false
\r
406 @op.store('bindata', @artist, @license.id)
407 @op.should be_a_new OriginalPicture
\r
409 it '原画の保存は呼ばれていない' do
410 PictureIO::LocalPicture.any_instance.should_not_receive(:put)
\r
413 context '原画の保存に失敗したとき' do
415 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
416 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
417 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(false)
420 @op.store('bindata', @artist, @license.id).should be_false
\r
423 @op.store('bindata', @artist, @license.id)
\r
424 @op.should be_a_new OriginalPicture
\r
426 it '対象素材オブジェクトの保存は呼ばれていない' do
427 ResourcePicture.any_instance.should_not_receive(:save)
\r
428 @op.store('bindata', @artist, @license.id)
\r
430 it '全体エラーメッセージがセットされている' do
432 @op.store('bindata', @artist, @license.id)
\r
433 }.should change(@op.errors[:base], :count)
436 context '対象素材オブジェクトの保存に失敗したとき' do
438 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
439 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
440 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
441 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(false)
444 @op.store('bindata', @artist, @license.id).should be_false
\r
447 @op.store('bindata', @artist, @license.id)
\r
448 @op.should be_a_new OriginalPicture
\r
450 it '全体エラーメッセージがセットされている' do
452 @op.store('bindata', @artist, @license.id)
\r
453 }.should change(@op.errors[:base], :count)