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, @artist
200 context '関連テーブルオプションがないとき' do
201 it 'ライセンスと素材を含んでいる' do
202 r = OriginalPicture.show_include_opt
203 r.should eq [:license, :resource_picture]
206 context '関連テーブルオプションで絵師を含ませたとき' do
207 it 'ライセンスと素材と作者データを含んでいる' do
208 r = OriginalPicture.show_include_opt(:include => :artist)
209 r.should eq [:license, :resource_picture, :artist]
212 context '他人の原画を開こうとしたとき' do
213 it '403Forbidden例外を返す' do
215 pic = OriginalPicture.show @op.id, @other_artist
216 }.should raise_error(ActiveRecord::Forbidden)
219 context '存在しない原画を開こうとしたとき' do
220 it '404RecordNotFound例外を返す' do
222 pic = OriginalPicture.show 0, @artist
223 }.should raise_error(ActiveRecord::RecordNotFound)
227 describe '編集取得に於いて' do
229 @op = Factory :original_picture, :artist_id => @artist.id
232 pic = OriginalPicture.edit @op.id, @artist
235 context '関連テーブルオプションがないとき' do
236 it 'ライセンスと素材を含んでいる' do
237 r = OriginalPicture.show_include_opt
238 r.should eq [:license, :resource_picture]
241 context '関連テーブルオプションで絵師を含ませたとき' do
242 it 'ライセンスと素材と作者データを含んでいる' do
243 r = OriginalPicture.show_include_opt(:include => :artist)
244 r.should eq [:license, :resource_picture, :artist]
247 context '他人の原画を開こうとしたとき' do
248 it '403Forbidden例外を返す' do
250 pic = OriginalPicture.edit @op.id, @other_artist
251 }.should raise_error(ActiveRecord::Forbidden)
254 context '存在しない原画を開こうとしたとき' do
255 it '404RecordNotFound例外を返す' do
257 pic = OriginalPicture.edit 0, @artist
258 }.should raise_error(ActiveRecord::RecordNotFound)
262 describe 'json単体出力オプションに於いて' do
263 it 'includeキーがライセンスと素材を含んでいる' do
264 r = OriginalPicture.show_json_include_opt
265 r[:include].should eq [:license, :resource_picture]
268 describe '一覧取得に於いて' do
270 @op = Factory :original_picture, :artist_id => @artist.id
272 context 'page補正について' do
273 it '文字列から数値に変換される' do
274 OriginalPicture.page('8').should eq 8
277 OriginalPicture.page().should eq 1
280 OriginalPicture.page('0').should eq 1
283 context 'page_size補正について' do
284 it '文字列から数値に変換される' do
285 OriginalPicture.page_size('7').should eq 7
287 it 'nilの場合はOriginalPicture.default_page_sizeになる' do
288 OriginalPicture.page_size().should eq OriginalPicture.default_page_size
290 it '0以下の場合はOriginalPicture.default_page_sizeになる' do
291 OriginalPicture.page_size('0').should eq OriginalPicture.default_page_size
293 it 'OriginalPicture.max_page_sizeを超えた場合はOriginalPicture.max_page_sizeになる' do
294 OriginalPicture.page_size('1000').should eq OriginalPicture.max_page_size
298 pic = OriginalPicture.list @artist.id
302 Factory :original_picture, :artist_id => @other_artist.id
303 pic = OriginalPicture.list @artist.id
307 newpic = Factory :original_picture, :artist_id => @artist.id, :updated_at => Time.now + 100
308 pic = OriginalPicture.list @artist.id
309 pic.should eq [newpic, @op]
311 context 'DBに5件あって1ページの件数を2件に変えたとして' do
313 @op2 = Factory :original_picture, :artist_id => @artist.id, :updated_at => Time.now + 100
314 @op3 = Factory :original_picture, :artist_id => @artist.id, :updated_at => Time.now + 200
315 @op4 = Factory :original_picture, :artist_id => @artist.id, :updated_at => Time.now + 300
316 @op5 = Factory :original_picture, :artist_id => @artist.id, :updated_at => Time.now + 400
317 OriginalPicture.stub(:default_page_size).and_return(2)
320 pic = OriginalPicture.list @artist.id
321 pic.should have(2).items
323 it 'page=1なら末尾2件を返す' do
325 pic = OriginalPicture.list( @artist.id, {}, 1)
326 pic.should eq [@op5, @op4]
328 it 'page=2なら中間2件を返す' do
329 pic = OriginalPicture.list( @artist.id, {}, 2)
330 pic.should eq [@op3, @op2]
332 it 'page=3なら先頭1件を返す' do
333 pic = OriginalPicture.list( @artist.id, {}, 3)
338 describe 'json一覧出力オプションに於いて' do
339 it 'includeキーがライセンスと素材を含んでいる' do
340 r = OriginalPicture.list_json_opt
341 r[:include].should eq [:license, :resource_picture]
344 describe 'RMagick変換に於いて' do
346 @op = Factory.build :original_picture, :artist_id => @artist.id
348 context 'つつがなく終わるとき' do
349 it '画像データをオブジェクト化している' do
350 Magick::Image.stub(:from_blob).and_return(['mgkobj'])
351 @op.data_to_mgk('mgkbin').should eq 'mgkobj'
356 Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
357 @op.data_to_mgk('mgkbin').should be_false
359 it '全体エラーがセットされている' do
360 Magick::Image.should_receive(:from_blob).with(any_args).and_raise('StandardError')
362 @op.data_to_mgk('mgkbin')
363 }.should change(@op.errors[:base], :count)
367 describe '作成・更新に於いて' do
369 @op = Factory.build :original_picture, :artist_id => @artist.id
371 class Mgk ; class Image ; end ; end
373 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
374 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
375 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
376 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
377 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
378 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
379 #原画ファイル削除だけは必ず成功するものとしておく
380 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
381 #素材取得は新規作成ケースでテストしておく
382 ResourcePicture.stub(:update_picture).with(any_args).and_return(
383 Factory.build :resource_picture, :artist_id => @artist.id
388 #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
389 #それで外部のメソッド呼び出しだけに着目してテストする。
390 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
391 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
392 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
393 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
395 it 'RMagick変換を依頼している' do
396 OriginalPicture.any_instance.should_receive(:data_to_mgk).exactly(1)
397 @op.store 'bindata', @artist, @license.id
\r
399 it '自身に属性をセットしている' do
400 OriginalPicture.any_instance.should_receive(:attributes=).exactly(1)
401 @op.store 'bindata', @artist, @license.id
\r
404 OriginalPicture.any_instance.should_receive(:save).exactly(1)
\r
405 @op.store 'bindata', @artist, @license.id
\r
407 it 'PictureIoに画像データの保存を依頼している' do
408 PictureIO::LocalPicture.any_instance.should_receive(:put).with(any_args).exactly(1)
409 @op.store 'bindata', @artist, @license.id
\r
411 it '素材モデルに対象素材を問い合わせている' do
412 ResourcePicture.should_receive(:update_picture).with(any_args).exactly(1)
413 @op.store 'bindata', @artist, @license.id
\r
415 it '対象素材オブジェクトに保存を依頼している' do
416 ResourcePicture.any_instance.should_receive(:store).with(any_args).exactly(1)
417 @op.store 'bindata', @artist, @license.id
\r
420 context 'つつがなく終わるとき' do
422 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
423 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
424 # OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
425 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
426 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
428 it '自身に属性をセットしている' do
430 @op.store 'bindata', @artist, @license.id
\r
431 }.should change @op, :filesize
433 it '原画モデルが作成されている' do
435 @op.store 'bindata', @artist, @license.id
436 }.should change OriginalPicture, :count
439 @op.store 'bindata', @artist, @license.id
440 OriginalPicture.find(@op).should_not be_nil
\r
443 @op.store('bindata', @artist, @license.id).should eq true
\r
446 #以下から例外ケース。処理先頭から失敗させていく
447 context 'RMagick変換が失敗したとき' do
449 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(false)
452 @op.store('bindata', @artist, @license.id).should be_false
\r
454 it '自身の保存は呼ばれていない' do
455 OriginalPicture.any_instance.should_not_receive(:save)
\r
458 context '自身の保存に失敗したとき' do
460 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
461 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(false)
\r
464 @op.store('bindata', @artist, @license.id).should be_false
\r
467 @op.store('bindata', @artist, @license.id)
468 @op.should be_a_new OriginalPicture
\r
470 it '原画の保存は呼ばれていない' do
471 PictureIO::LocalPicture.any_instance.should_not_receive(:put)
\r
474 context '原画の保存に失敗したとき' do
476 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
477 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
478 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(false)
481 @op.store('bindata', @artist, @license.id).should be_false
\r
484 @op.store('bindata', @artist, @license.id)
\r
485 @op.should be_a_new OriginalPicture
\r
487 it '対象素材オブジェクトの保存は呼ばれていない' do
488 ResourcePicture.any_instance.should_not_receive(:save)
\r
489 @op.store('bindata', @artist, @license.id)
\r
491 it '全体エラーメッセージがセットされている' do
493 @op.store('bindata', @artist, @license.id)
\r
494 }.should change(@op.errors[:base], :count)
497 context '対象素材オブジェクトの保存に失敗したとき' do
499 OriginalPicture.any_instance.stub(:data_to_mgk).with(any_args).and_return(Mgk.new)
500 OriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
\r
501 PictureIO::LocalPicture.any_instance.stub(:put).with(any_args).and_return(true)
502 ResourcePicture.any_instance.stub(:store).with(any_args).and_return(false)
505 @op.store('bindata', @artist, @license.id).should be_false
\r
508 @op.store('bindata', @artist, @license.id)
\r
509 @op.should be_a_new OriginalPicture
\r
511 it '全体エラーメッセージがセットされている' do
513 @op.store('bindata', @artist, @license.id)
\r
514 }.should change(@op.errors[:base], :count)