1 # -*- encoding: utf-8 -*-
8 @user = Factory( :user_yas)
10 @artist = Factory :artist_yas, :author_id => @author.id
11 @other_user = Factory( :user_yas)
12 @other_author = @other_user.author
13 @other_artist = Factory :artist_yas, :author_id => @other_author.id
14 @sp = Factory :system_picture
15 @lg = Factory :license_group
16 @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
17 @op = Factory :original_picture, :artist_id => @artist.id
24 it 'オーソドックスなデータなら通る' do
25 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
29 context 'original_picture_idを検証するとき' do
31 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
34 @p.original_picture_id = @op.id
38 @p.original_picture_id = nil
39 @p.should_not be_valid
42 @p.original_picture_id = 'a'
43 @p.should_not be_valid
45 it '存在する原画でなければ失敗する' do
46 @p.original_picture_id = 0
47 @p.should_not be_valid
50 context 'revisionを検証するとき' do
52 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
60 @p.should_not be_valid
64 @p.should_not be_valid
67 context 'extを検証するとき' do
69 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
77 @p.should_not be_valid
81 @p.should_not be_valid
83 it 'png,gif,jpeg以外なら失敗する' do
85 @p.should_not be_valid
88 context 'widthを検証するとき' do
90 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
98 @p.should_not be_valid
102 @p.should_not be_valid
106 @p.should_not be_valid
110 @p.should_not be_valid
113 context 'heightを検証するとき' do
115 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
123 @p.should_not be_valid
127 @p.should_not be_valid
131 @p.should_not be_valid
135 @p.should_not be_valid
138 context 'filesizeを検証するとき' do
140 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
148 @p.should_not be_valid
152 @p.should_not be_valid
156 @p.should_not be_valid
159 @p.filesize = 2000000+1
160 @p.should_not be_valid
163 context 'artist_idを検証するとき' do
165 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
168 @p.artist_id = @artist.id
173 @p.should_not be_valid
177 @p.should_not be_valid
179 it '存在する絵師でなければ失敗する' do
181 @p.should_not be_valid
184 context 'license_idを検証するとき' do
186 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
189 @p.license_id = @license.id
194 @p.should_not be_valid
198 @p.should_not be_valid
200 it '存在するライセンスグループでなければ失敗する' do
202 @p.should_not be_valid
205 context 'artist_nameを検証するとき' do
207 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
215 @p.should_not be_valid
218 context 'creditを検証するとき' do
220 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
227 context 'settingsを検証するとき' do
229 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
239 describe '最新Revision取得に於いて' do
240 context '初めての原画を公開したとき' do
242 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
244 it 'Revisionは1となる' do
245 @p.new_revision.should eq 1
248 context 'HEADが1のとき' do
250 Factory :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
251 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
253 it 'Revisionは2となる' do
254 @p.new_revision.should eq 2
257 context 'HEADが5のとき' do
259 Factory :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
260 Factory :picture, :revision => 5, :original_picture_id => @op.id, :license_id => @license.id
261 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
263 it 'Revisionは6となる' do
264 @p.new_revision.should eq 6
271 class Mgk ; class Image ; end ; end
273 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
274 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
275 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
276 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
277 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
278 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
279 #原画ファイル削除だけは必ず成功するものとしておく
280 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
284 #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
285 #それで外部のメソッド呼び出しだけに着目してテストする。
286 Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
287 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
\r
288 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
\r
289 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
\r
290 @gifmgk = GifMgk.new #パラメータを二種類用意する。
\r
291 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
292 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
294 it '最新Revisionを取得している' do
295 Picture.any_instance.should_receive(:new_revision).with(any_args).exactly(1)
296 res = @p.store(Mgk.new)
\r
299 Picture.any_instance.should_receive(:save).with(any_args).exactly(1)
300 res = @p.store(Mgk.new)
\r
302 it '画像ファイルの作成機能で画像を保存している' do
\r
303 mgk = Mgk.new #一回目の本画像保存は与えたオブジェクトを使って保存する。
304 Picture.any_instance.should_receive(:store_picture).with(mgk).exactly(1)
305 res = @p.store(mgk)
\r
307 it '自身にgifフォーマット変換対象かを問い合わせている' do
308 Picture.any_instance.should_receive(:to_gif?).with(any_args).exactly(1)
309 res = @p.store(Mgk.new)
\r
311 it '自身にGifフォーマット変換を依頼している' do
312 Picture.should_receive(:png_to_gif).with(any_args).exactly(1)
313 res = @p.store(Mgk.new)
\r
315 it '画像ファイルの作成機能でgif画像を保存している' do
\r
317 Picture.any_instance.should_receive(:store_picture).with(@gifmgk).exactly(1)
318 res = @p.store(Mgk.new)
\r
321 context 'つつがなく終わるとき' do
323 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
324 # Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
325 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
\r
326 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
\r
327 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
\r
328 @gifmgk = GifMgk.new #パラメータを二種類用意する。
\r
329 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
330 @p = Factory.build :picture, :revision => nil, :original_picture_id => @op.id, :license_id => @license.id
333 res = @p.store(Mgk.new)
\r
336 it 'Revisionに最新Revisionセット' do
337 res = @p.store(Mgk.new)
\r
338 @p.revision.should eq 1
\r
342 res = @p.store(Mgk.new)
\r
343 }.should change Picture, :count
\r
346 context 'gif変換なしで、つつがなく終わるとき' do
348 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
349 Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
350 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
\r
351 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(false)
\r
352 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
355 res = @p.store(Mgk.new)
\r
358 it 'gif保存は呼ばれていない' do
359 #二回目の画像作成が呼び出されないで1回こっきりならgif保存は呼ばれていないんだろう。
\r
360 Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
361 res = @p.store(Mgk.new)
\r
364 #以下から例外ケース。処理先頭から失敗させていく
365 context '自身の保存に失敗したとき' do
367 Picture.any_instance.stub(:save).with(any_args).and_return(false)
\r
368 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
371 res = @p.store(Mgk.new)
\r
372 res.should be_false
\r
376 @p.should be_a_new Picture
\r
379 context '画像の保存に失敗したとき' do
381 Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
382 Picture.any_instance.stub(:store_picture).with(any_args).and_return(false)
\r
383 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
386 res = @p.store(Mgk.new)
\r
387 res.should be_false
\r
389 it 'gif変換判定は呼ばれていない' do
\r
390 Picture.any_instance.should_not_receive(:to_gif?).with(any_args)
391 res = @p.store(Mgk.new)
\r
394 context 'gif変換に失敗したとき' do
396 Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
397 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
\r
398 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
\r
399 Picture.stub(:png_to_gif).with(any_args).and_return(false)
400 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
403 res = @p.store(Mgk.new)
\r
404 res.should be_false
\r
406 it 'gif画像の保存は呼ばれていない' do
\r
407 #本画像の保存があるので、一度は呼ばれる
\r
408 Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
409 res = @p.store(Mgk.new)
\r
412 context 'gif画像の保存に失敗したとき' do
415 Picture.any_instance.stub(:save).with(any_args).and_return(true)
\r
416 Picture.any_instance.stub(:store_picture).with(@mgk).and_return(true)
\r
417 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
\r
418 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
\r
419 @gifmgk = GifMgk.new #パラメータを二種類用意する。
\r
420 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
421 Picture.any_instance.stub(:store_picture).with(@gifmgk).and_return(false)
\r
422 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
425 res = @p.store(@mgk)
\r
426 res.should be_false
\r
431 describe '反転画像の保存先に於いて' do
\r
433 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
436 it 'ベースディレクトリだけを返す' do
437 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
439 r.should have(1).item
\r
441 it 'ベースディレクトリだけを返す' do
442 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
444 r.first.should eq ''
\r
448 it 'ベースディレクトリと反転3種を返す' do
449 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
451 r.should have(4).item
\r
453 it 'ベースディレクトリと反転3種を返す' do
454 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
456 r.last.should eq 'vh'
\r
461 describe '画像ファイルの作成に於いて' do
\r
462 #PictureIo経由で画像を保存するための機能。ファイル名に自身のidを使うので事前に自身の保存が必要。
\r
465 class Mgk ; class Image ; end ; end
467 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
468 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
469 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
470 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
471 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
472 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
473 #原画ファイル削除だけは必ず成功するものとしておく
474 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
476 Picture.any_instance.stub(:subdirs).with(any_args).and_return(['', 'v', 'h', 'vh'])
\r
477 Picture.any_instance.stub(:h).with(any_args).and_return('data')
478 Picture.any_instance.stub(:v).with(any_args).and_return('data')
479 Picture.any_instance.stub(:vh).with(any_args).and_return('data')
480 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id
484 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
485 PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
487 it '画像ファイルの保存が4回呼ばれる' do
\r
488 PictureIO.picture_io.should_receive(:put).with(any_args).exactly(4)
489 res = @p.store_picture(Mgk.new)
\r
491 it '画像ファイルのベースへの保存が1回呼ばれる' do
\r
492 PictureIO.picture_io.should_receive(:put).with('data', @p.filename, '').exactly(1)
493 res = @p.store_picture(Mgk.new)
\r
495 it '画像ファイルの垂直反転への保存が1回呼ばれる' do
\r
496 PictureIO.picture_io.should_receive(:put).with('data', @p.filename, 'v').exactly(1)
497 res = @p.store_picture(Mgk.new)
\r
499 it '画像ファイルの水平反転への保存が1回呼ばれる' do
\r
500 PictureIO.picture_io.should_receive(:put).with('data', @p.filename, 'h').exactly(1)
501 res = @p.store_picture(Mgk.new)
\r
503 it '画像ファイルの垂直水平反転への保存が1回呼ばれる' do
\r
504 PictureIO.picture_io.should_receive(:put).with('data', @p.filename, 'vh').exactly(1)
505 res = @p.store_picture(Mgk.new)
\r
507 it '垂直反転が1回呼ばれる' do
\r
508 Picture.any_instance.should_receive(:v).with(any_args).exactly(1)
509 res = @p.store_picture(Mgk.new)
\r
511 it '水平反転が1回呼ばれる' do
\r
512 Picture.any_instance.should_receive(:h).with(any_args).exactly(1)
513 res = @p.store_picture(Mgk.new)
\r
515 it '垂直水平反転が1回呼ばれる' do
\r
516 Picture.any_instance.should_receive(:vh).with(any_args).exactly(1)
517 res = @p.store_picture(Mgk.new)
\r
520 context 'つつがなく終わるとき' do
522 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
\r
523 PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
526 res = @p.store_picture(Mgk.new)
\r
532 PictureIO.picture_io.stub(:put).with(any_args).and_return(false)
535 res = @p.store_picture(Mgk.new)
\r
536 res.should be_false
\r
542 describe 'フラグ展開に於いて' do
544 @p = Factory.build :picture, :original_picture_id => @op.id, :license_id => @license.id,
545 :settings => "{\"open\": 1, \"commercial\": 2, \"official\": 3, \"attribution\": 4, \"derive\": 5, \"thumbnail\": 6, \"gif_convert\": 7, \"reverse\": 8, \"resize\": 9, \"sync_vh\": 10, \"overlap\": 11}"
547 context 'json展開チェック' do
548 it '展開してなければ展開して@flagsに保管する' do
549 @p.flags.should_not be_nil
551 it '展開できなければnilのまま' do
553 @p.flags.should be_nil
556 context 'openについて' do
557 it '@flag_openに保管する' do
558 @p.flag_open.should_not be_nil
560 it '本当にフラグHashからじゃなく、変数から取得してる?' do
563 @p.flag_open.should_not be_nil
566 @p.flag_open.should eq 1
569 context 'commercialについて' do
570 it '@flag_commercialに保管する' do
571 @p.flag_commercial.should_not be_nil
573 it '本当にフラグHashからじゃなく、変数から取得してる?' do
576 @p.flag_commercial.should_not be_nil
579 @p.flag_commercial.should eq 2
582 context 'officialについて' do
583 it '@flag_officialに保管する' do
584 @p.flag_official.should_not be_nil
586 it '本当にフラグHashからじゃなく、変数から取得してる?' do
589 @p.flag_official.should_not be_nil
592 @p.flag_official.should eq 3
595 context 'attributionについて' do
596 it '@flag_attributionに保管する' do
597 @p.flag_attribution.should_not be_nil
599 it '本当にフラグHashからじゃなく、変数から取得してる?' do
602 @p.flag_attribution.should_not be_nil
605 @p.flag_attribution.should eq 4
608 context 'deriveについて' do
609 it '@flag_deriveに保管する' do
610 @p.flag_derive.should_not be_nil
612 it '本当にフラグHashからじゃなく、変数から取得してる?' do
615 @p.flag_derive.should_not be_nil
618 @p.flag_derive.should eq 5
621 context 'thumbnailについて' do
622 it '@flag_thumbnailに保管する' do
623 @p.flag_thumbnail.should_not be_nil
625 it '本当にフラグHashからじゃなく、変数から取得してる?' do
628 @p.flag_thumbnail.should_not be_nil
631 @p.flag_thumbnail.should eq 6
634 context 'gif_convertについて' do
635 it '@flag_gif_convertに保管する' do
636 @p.flag_gif_convert.should_not be_nil
638 it '本当にフラグHashからじゃなく、変数から取得してる?' do
641 @p.flag_gif_convert.should_not be_nil
644 @p.flag_gif_convert.should eq 7
647 context 'reverseについて' do
648 it '@flag_reverseに保管する' do
649 @p.flag_reverse.should_not be_nil
651 it '本当にフラグHashからじゃなく、変数から取得してる?' do
654 @p.flag_reverse.should_not be_nil
657 @p.flag_reverse.should eq 8
660 context 'resizeについて' do
661 it '@flag_resizeに保管する' do
662 @p.flag_resize.should_not be_nil
664 it '本当にフラグHashからじゃなく、変数から取得してる?' do
667 @p.flag_resize.should_not be_nil
670 @p.flag_resize.should eq 9
673 context 'sync_vhについて' do
674 it '@flag_sync_vhに保管する' do
675 @p.flag_sync_vh.should_not be_nil
677 it '本当にフラグHashからじゃなく、変数から取得してる?' do
680 @p.flag_sync_vh.should_not be_nil
683 @p.flag_sync_vh.should eq 10
686 context 'overlapについて' do
687 it '@flag_overlapに保管する' do
688 @p.flag_overlap.should_not be_nil
690 it '本当にフラグHashからじゃなく、変数から取得してる?' do
693 @p.flag_overlap.should_not be_nil
696 @p.flag_overlap.should eq 11