1 # -*- encoding: utf-8 -*-
7 FactoryGirl.create :admin
8 @user = FactoryGirl.create( :user_yas)
10 @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
11 @other_user = FactoryGirl.create( :user_yas)
12 @other_author = @other_user.author
13 @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id
14 @sp = FactoryGirl.create :system_picture
15 @lg = FactoryGirl.create :license_group
16 @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
17 @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
24 it 'オーソドックスなデータなら通る' do
25 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
29 context 'original_picture_idを検証するとき' do
31 @p = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.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 = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
215 @p.should_not be_valid
218 context 'classnameを検証するとき' do
220 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
223 @p.classname = 'a'*50
228 @p.should_not be_valid
231 @p.classname = 'a'*51
232 @p.should_not be_valid
235 context 'creditを検証するとき' do
237 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
244 context 'settingsを検証するとき' do
246 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
256 describe '最新Revision取得に於いて' do
257 context '初めての原画を公開したとき' do
259 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
261 it 'Revisionは1となる' do
262 @p.new_revision.should eq 1
265 context 'HEADが1のとき' do
267 FactoryGirl.create :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
268 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
270 it 'Revisionは2となる' do
271 @p.new_revision.should eq 2
274 context 'HEADが5のとき' do
276 FactoryGirl.create :picture, :revision => 1, :original_picture_id => @op.id, :license_id => @license.id
277 FactoryGirl.create :picture, :revision => 5, :original_picture_id => @op.id, :license_id => @license.id
278 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
280 it 'Revisionは6となる' do
281 @p.new_revision.should eq 6
285 describe '素材からのコピーデータセットに於いて' do
287 @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
288 attr = {:ext => 'jpeg', :width => 264, :height => 265, :filesize => 266,
289 :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id,
290 :artist_name => 'tester', :classname => 'Tester', :credit => {:title => 'cap'}.to_json.to_s, :settings => {:set => 1}.to_json.to_s}
291 @rp = FactoryGirl.build :resource_picture, attr
292 @p = FactoryGirl.build :picture
294 it '素材オブジェクトから属性を取り出して対象実素材にセットしている' do
295 res = @p.copy_data(@rp)
296 @p.ext.should eq 'jpeg'
297 @p.width.should eq 264
298 @p.height.should eq 265
299 @p.filesize.should eq 266
300 @p.artist_id.should eq @artist.id
301 @p.license_id.should eq @license.id
302 @p.original_picture_id.should eq @op.id
303 @p.artist_name.should eq 'tester'
304 @p.classname.should eq 'Tester'
305 @p.credit.should match /title/
306 @p.settings.should match /set/
313 class Mgk ; class Image ; end ; end
315 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
316 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
317 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
318 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
319 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
320 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
321 #原画ファイル削除だけは必ず成功するものとしておく
322 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
326 #すべての処理が正常パターンで通過すれば、一番深い分岐まで通る。
327 #それで外部のメソッド呼び出しだけに着目してテストする。
328 Picture.any_instance.stub(:save).with(any_args).and_return(true)
329 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
330 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
331 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
332 @gifmgk = GifMgk.new #パラメータを二種類用意する。
333 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
334 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
336 it '最新Revisionを取得している' do
337 Picture.any_instance.should_receive(:new_revision).with(any_args).exactly(1)
338 res = @p.store(Mgk.new)
341 Picture.any_instance.should_receive(:save).with(any_args).exactly(1)
342 res = @p.store(Mgk.new)
344 it '画像ファイルの作成機能で画像を保存している' do
345 mgk = Mgk.new #一回目の本画像保存は与えたオブジェクトを使って保存する。
346 Picture.any_instance.stub(:filename).with(any_args).and_return('1.png')
347 Picture.any_instance.should_receive(:store_picture).with(mgk, '1.png').exactly(1)
350 it '自身にgifフォーマット変換対象かを問い合わせている' do
351 Picture.any_instance.should_receive(:to_gif?).with(any_args).exactly(1)
352 res = @p.store(Mgk.new)
354 it '自身にGifフォーマット変換を依頼している' do
355 Picture.should_receive(:png_to_gif).with(any_args).exactly(1)
356 res = @p.store(Mgk.new)
358 it '画像ファイルの作成機能でgif画像を保存している' do
360 Picture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')
361 Picture.any_instance.should_receive(:store_picture).with(@gifmgk, '1.gif').exactly(1)
362 res = @p.store(Mgk.new)
365 context 'つつがなく終わるとき' do
367 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
368 # Picture.any_instance.stub(:save).with(any_args).and_return(true)
369 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
370 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
371 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
372 @gifmgk = GifMgk.new #パラメータを二種類用意する。
373 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
374 @p = FactoryGirl.build :picture, :revision => nil, :original_picture_id => @op.id, :license_id => @license.id
377 res = @p.store(Mgk.new)
380 it 'Revisionに最新Revisionセット' do
381 res = @p.store(Mgk.new)
382 @p.revision.should eq 1
386 res = @p.store(Mgk.new)
387 }.should change Picture, :count
390 context 'gif変換なしで、つつがなく終わるとき' do
392 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
393 Picture.any_instance.stub(:save).with(any_args).and_return(true)
394 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
395 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(false)
396 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
399 res = @p.store(Mgk.new)
402 it 'gif保存は呼ばれていない' do
403 #二回目の画像作成が呼び出されないで1回こっきりならgif保存は呼ばれていないんだろう。
404 Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
405 res = @p.store(Mgk.new)
408 #以下から例外ケース。処理先頭から失敗させていく
409 context '自身の保存に失敗したとき' do
411 Picture.any_instance.stub(:save).with(any_args).and_return(false)
412 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
415 res = @p.store(Mgk.new)
420 @p.should be_a_new Picture
423 context '画像の保存に失敗したとき' do
425 Picture.any_instance.stub(:save).with(any_args).and_return(true)
426 Picture.any_instance.stub(:store_picture).with(any_args).and_return(false)
427 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
430 res = @p.store(Mgk.new)
433 it 'gif変換判定は呼ばれていない' do
434 Picture.any_instance.should_not_receive(:to_gif?).with(any_args)
435 res = @p.store(Mgk.new)
438 context 'gif変換に失敗したとき' do
440 Picture.any_instance.stub(:save).with(any_args).and_return(true)
441 Picture.any_instance.stub(:store_picture).with(any_args).and_return(true)
442 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
443 Picture.stub(:png_to_gif).with(any_args).and_return(false)
444 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
447 res = @p.store(Mgk.new)
450 it 'gif画像の保存は呼ばれていない' do
452 Picture.any_instance.should_receive(:store_picture).with(any_args).exactly(1)
453 res = @p.store(Mgk.new)
456 context 'gif画像の保存に失敗したとき' do
459 Picture.any_instance.stub(:filename).with(any_args).and_return('1.png')
460 Picture.any_instance.stub(:gifname).with(any_args).and_return('1.gif')
461 Picture.any_instance.stub(:save).with(any_args).and_return(true)
462 Picture.any_instance.stub(:store_picture).with(@mgk, '1.png').and_return(true)
463 Picture.any_instance.stub(:to_gif?).with(any_args).and_return(true)
464 class GifMgk < Mgk ; end #store_pictureは二回呼び出される。区別をつけるために
465 @gifmgk = GifMgk.new #パラメータを二種類用意する。
466 Picture.stub(:png_to_gif).with(any_args).and_return(@gifmgk)
467 Picture.any_instance.stub(:store_picture).with(@gifmgk, '1.gif').and_return(false)
468 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
477 describe '反転画像の保存先に於いて' do
479 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
482 it 'ベースディレクトリだけを返す' do
483 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
485 r.should have(1).item
487 it 'ベースディレクトリだけを返す' do
488 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(-1)
494 it 'ベースディレクトリと反転3種を返す' do
495 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
497 r.should have(4).item
499 it 'ベースディレクトリと反転3種を返す' do
500 Picture.any_instance.should_receive(:flag_reverse).with(any_args).and_return(1)
502 r.last.should eq 'vh'
507 describe '画像ファイルの作成に於いて' do
508 #PictureIo経由で画像を保存するための機能。ファイル名に自身のidを使うので事前に自身の保存が必要。
511 class Mgk ; class Image ; end ; end
513 Mgk::Image.stub(:from_blob).with(any_args).and_return([Mgk.new])
514 Mgk.any_instance.stub(:format).with(any_args).and_return('png')
515 Mgk.any_instance.stub(:rows).with(any_args).and_return(200)
516 Mgk.any_instance.stub(:columns).with(any_args).and_return(100)
517 Mgk.any_instance.stub(:filesize).with(any_args).and_return(@filesize)
518 Mgk.any_instance.stub(:to_blob).with(any_args).and_return('data')
519 #原画ファイル削除だけは必ず成功するものとしておく
520 PictureIO::LocalPicture.any_instance.stub(:delete).with(any_args).and_return(true)
522 Picture.any_instance.stub(:subdirs).with(any_args).and_return(['', 'v', 'h', 'vh'])
523 Picture.any_instance.stub(:h).with(any_args).and_return('data')
524 Picture.any_instance.stub(:v).with(any_args).and_return('data')
525 Picture.any_instance.stub(:vh).with(any_args).and_return('data')
526 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id
530 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
531 PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
533 it '画像ファイルの保存が4回呼ばれる' do
534 PictureIO.picture_io.should_receive(:put).with(any_args).exactly(4)
535 res = @p.store_picture(Mgk.new, '1.png')
537 it '画像ファイルのベースへの保存が1回呼ばれる' do
538 PictureIO.picture_io.should_receive(:put).with('data', '1.png', '').exactly(1)
539 res = @p.store_picture(Mgk.new, '1.png')
541 it '画像ファイルの垂直反転への保存が1回呼ばれる' do
542 PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'v').exactly(1)
543 res = @p.store_picture(Mgk.new, '1.png')
545 it '画像ファイルの水平反転への保存が1回呼ばれる' do
546 PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'h').exactly(1)
547 res = @p.store_picture(Mgk.new, '1.png')
549 it '画像ファイルの垂直水平反転への保存が1回呼ばれる' do
550 PictureIO.picture_io.should_receive(:put).with('data', '1.png', 'vh').exactly(1)
551 res = @p.store_picture(Mgk.new, '1.png')
554 Picture.any_instance.should_receive(:v).with(any_args).exactly(1)
555 res = @p.store_picture(Mgk.new, '1.png')
558 Picture.any_instance.should_receive(:h).with(any_args).exactly(1)
559 res = @p.store_picture(Mgk.new, '1.png')
561 it '垂直水平反転が1回呼ばれる' do
562 Picture.any_instance.should_receive(:vh).with(any_args).exactly(1)
563 res = @p.store_picture(Mgk.new, '1.png')
566 context 'つつがなく終わるとき' do
568 #すべての処理を正常パターンで通過させ、保存機能をチェックする。
569 PictureIO.picture_io.stub(:put).with(any_args).and_return(true)
572 res = @p.store_picture(Mgk.new, '1.png')
578 PictureIO.picture_io.stub(:put).with(any_args).and_return(false)
581 res = @p.store_picture(Mgk.new, '1.png')
588 describe 'フラグ展開に於いて' do
590 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id,
591 :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}"
593 context 'json展開チェック' do
594 it '展開してなければ展開して@flagsに保管する' do
595 @p.flags.should_not be_nil
599 @p.flags.is_a?(Hash).should be_true
600 @p.flags.empty?.should be_true
603 context 'openについて' do
604 it '@flag_openに保管する' do
605 @p.flag_open.should_not be_nil
607 it '本当にフラグHashからじゃなく、変数から取得してる?' do
610 @p.flag_open.should_not be_nil
613 @p.flag_open.should eq 1
616 context 'commercialについて' do
617 it '@flag_commercialに保管する' do
618 @p.flag_commercial.should_not be_nil
620 it '本当にフラグHashからじゃなく、変数から取得してる?' do
623 @p.flag_commercial.should_not be_nil
626 @p.flag_commercial.should eq 2
629 context 'officialについて' do
630 it '@flag_officialに保管する' do
631 @p.flag_official.should_not be_nil
633 it '本当にフラグHashからじゃなく、変数から取得してる?' do
636 @p.flag_official.should_not be_nil
639 @p.flag_official.should eq 3
642 context 'attributionについて' do
643 it '@flag_attributionに保管する' do
644 @p.flag_attribution.should_not be_nil
646 it '本当にフラグHashからじゃなく、変数から取得してる?' do
649 @p.flag_attribution.should_not be_nil
652 @p.flag_attribution.should eq 4
655 context 'deriveについて' do
656 it '@flag_deriveに保管する' do
657 @p.flag_derive.should_not be_nil
659 it '本当にフラグHashからじゃなく、変数から取得してる?' do
662 @p.flag_derive.should_not be_nil
665 @p.flag_derive.should eq 5
668 context 'thumbnailについて' do
669 it '@flag_thumbnailに保管する' do
670 @p.flag_thumbnail.should_not be_nil
672 it '本当にフラグHashからじゃなく、変数から取得してる?' do
675 @p.flag_thumbnail.should_not be_nil
678 @p.flag_thumbnail.should eq 6
681 context 'gif_convertについて' do
682 it '@flag_gif_convertに保管する' do
683 @p.flag_gif_convert.should_not be_nil
685 it '本当にフラグHashからじゃなく、変数から取得してる?' do
688 @p.flag_gif_convert.should_not be_nil
691 @p.flag_gif_convert.should eq 7
694 context 'reverseについて' do
695 it '@flag_reverseに保管する' do
696 @p.flag_reverse.should_not be_nil
698 it '本当にフラグHashからじゃなく、変数から取得してる?' do
701 @p.flag_reverse.should_not be_nil
704 @p.flag_reverse.should eq 8
707 context 'resizeについて' do
708 it '@flag_resizeに保管する' do
709 @p.flag_resize.should_not be_nil
711 it '本当にフラグHashからじゃなく、変数から取得してる?' do
714 @p.flag_resize.should_not be_nil
717 @p.flag_resize.should eq 9
720 context 'sync_vhについて' do
721 it '@flag_sync_vhに保管する' do
722 @p.flag_sync_vh.should_not be_nil
724 it '本当にフラグHashからじゃなく、変数から取得してる?' do
727 @p.flag_sync_vh.should_not be_nil
730 @p.flag_sync_vh.should eq 10
733 context 'overlapについて' do
734 it '@flag_overlapに保管する' do
735 @p.flag_overlap.should_not be_nil
737 it '本当にフラグHashからじゃなく、変数から取得してる?' do
740 @p.flag_overlap.should_not be_nil
743 @p.flag_overlap.should eq 11
748 describe 'クレジットデータに於いて' do
750 @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
751 @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :credit => '{"system_picture_id": 2}'
753 it 'system_picture_idが入っている' do
755 res["system_picture_id"].should eq 2