OSDN Git Service

add: social button
[pettanr/pettanr.git] / spec / models / picture_spec.rb
index eb6e962..5ce8081 100644 (file)
@@ -4,12 +4,12 @@ require 'spec_helper'
 
 describe Picture do
   before do
-    FactoryGirl.create :admin
+    @admin = FactoryGirl.create :admin
     @user = FactoryGirl.create( :user_yas)
-    @author = @user.author
+    @author = FactoryGirl.create :author, :user_id => @user.id
     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
     @other_user = FactoryGirl.create( :user_yas)
-    @other_author = @other_user.author
+    @other_author = FactoryGirl.create :author, :user_id => @other_user.id
     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id
     @sp = FactoryGirl.create :system_picture
     @lg = FactoryGirl.create :license_group
@@ -201,6 +201,49 @@ describe Picture do
     end
   end
   
+  describe '文字コード検証に於いて' do
+    before do
+      @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
+    end
+    
+    context 'artist_nameを検証するとき' do
+      it 'Shift JISなら失敗する' do
+        @p.artist_name = "\x83G\x83r\x83]\x83D"
+        lambda{
+          @p.valid_encode
+        }.should raise_error(Pettanr::BadRequest)
+      end
+    end
+    
+    context 'classnameを検証するとき' do
+      it 'Shift JISなら失敗する' do
+        @p.classname = "\x83G\x83r\x83]\x83D"
+        lambda{
+          @p.valid_encode
+        }.should raise_error(Pettanr::BadRequest)
+      end
+    end
+    
+    context 'creditを検証するとき' do
+      it 'Shift JISなら失敗する' do
+        @p.credit = "\x83G\x83r\x83]\x83D"
+        lambda{
+          @p.valid_encode
+        }.should raise_error(Pettanr::BadRequest)
+      end
+    end
+    
+    context 'settingsを検証するとき' do
+      it 'Shift JISなら失敗する' do
+        @p.settings = "\x83G\x83r\x83]\x83D"
+        lambda{
+          @p.valid_encode
+        }.should raise_error(Pettanr::BadRequest)
+      end
+    end
+    
+  end
+  
   describe 'デフォルト値補充に於いて' do
     it 'defined' do
       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
@@ -250,28 +293,36 @@ describe Picture do
     before do
       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
     end
-    context 'パラメータが作家のとき' do
-      it '自作の実素材ならyes' do
-        @p.own?(@author).should == true
-      end
-      it '他人のならno' do
-        @p.own?(@other_author).should == false
+    context '事前チェックする' do
+      it '自身にロールリストからの絵師取得を依頼している' do
+        Picture.should_receive(:get_artist_from_roles).with(any_args).exactly(1)
+        r = @p.own?([@artist])
       end
     end
-    context 'パラメータが絵師のとき' do
-      it '自作の実素材ならyes' do
-        @p.own?(@artist).should == true
+    context 'ロール内絵師が取得できるとき' do
+      before do
+      end
+      it 'ロール内絵師のidが自身の絵師idと一致するなら許可する' do
+        Picture.stub(:get_artist_from_roles).with(any_args).and_return(@artist)
+        r = @p.own?([@artist])
+        r.should be_true
       end
-      it '他人のならno' do
-        @p.own?(@other_artist).should == false
+      it 'ロール内絵師のidが自身の絵師idと一致しないならno' do
+        Picture.stub(:get_artist_from_roles).with(any_args).and_return(@other_artist)
+        @p.own?(@other_artist).should be_false
       end
     end
-    context 'それ以外のとき' do
-      it 'no' do
-        @p.own?(nil).should == false
+    context 'ロール内絵師が取得できないとき' do
+      before do
+        Picture.stub(:get_artist_from_roles).with(any_args).and_return(nil)
+      end
+      it 'Falseを返す' do
+        r = @p.own?([@artist])
+        r.should be_false
       end
     end
   end
+  
   describe '閲覧許可に於いて' do
     before do
       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
@@ -286,6 +337,15 @@ describe Picture do
     before do
       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
     end
+    context '自身に原画がリンクしていないとき' do
+      before do
+        Picture.any_instance.stub(:original_picture).with(any_args).and_return(nil)
+      end
+      it 'Falseを返す' do
+        r = @p.showable?(@author)
+        r.should be_false
+      end
+    end
     it '自作の実素材ならyes' do
       Picture.any_instance.stub(:own?).with(any_args).and_return(true)
       @p.showable?(@artist).should == true
@@ -297,19 +357,19 @@ describe Picture do
       it '自身にhead判定と有効性判定を問い合わせ、両者がTrueならTrueを返す。' do
         Picture.any_instance.stub(:head?).with(any_args).and_return(true)
         Picture.any_instance.stub(:enable?).with(any_args).and_return(true)
-        r = @p.showable?(@artist)
+        r = @p.showable?(@author)
         r.should be_true
       end
       it 'head判定がFalseならFalseを返す。' do
         Picture.any_instance.stub(:head?).with(any_args).and_return(false)
         Picture.any_instance.stub(:enable?).with(any_args).and_return(true)
-        r = @p.showable?(@artist)
+        r = @p.showable?(@author)
         r.should be_false
       end
       it '有効性判定がFalseならFalseを返す。' do
         Picture.any_instance.stub(:enable?).with(any_args).and_return(false)
         Picture.any_instance.stub(:head?).with(any_args).and_return(true)
-        r = @p.showable?(@artist)
+        r = @p.showable?(@author)
         r.should be_false
       end
     end
@@ -530,35 +590,6 @@ describe Picture do
     end
   end
   
-  describe 'md5検索に於いて' do
-    before do
-      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
-      @p = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 0,
-        :original_picture_id => @op.id, :md5 => 'a' * 32
-      @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
-      @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id
-      @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 0,
-        :original_picture_id => @op2.id, :md5 => 'b' * 32
-      @op3 = FactoryGirl.create :original_picture, :artist_id => @artist.id
-    end
-    it 'リストを返す' do
-      res = Picture.find_by_md5(@p.md5)
-      res.is_a?(Array).should be_true
-    end
-    it 'md5が違えば含まない' do
-      res = Picture.find_by_md5(@p.md5)
-      res.include?(@p2).should be_false
-    end
-    it '更新日時順' do
-      @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op2.id, :md5 => 'C' * 32
-      @p4 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op3.id, :md5 => @p3.md5, :updated_at => Time.now + 100
-      res = Picture.find_by_md5(@p3.md5)
-      res.should eq [@p4, @p3]
-    end
-  end
-  
   describe 'md5重複リストに於いて' do
     before do
       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
@@ -570,43 +601,63 @@ describe Picture do
         :original_picture_id => @op2.id, :md5 => 'b' * 32
       @op3 = FactoryGirl.create :original_picture, :artist_id => @artist.id
     end
-    it 'リストを返す' do
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.is_a?(Array).should be_true
-    end
-    it 'md5が違えば含まない' do
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.include?(@p2).should be_false
-    end
-    it '同一原画は含まない' do
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.empty?.should be_true
-    end
-    it '同一原画は旧版でも含まない' do
-      @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op.id, :md5 => 'a' * 32
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.empty?.should be_true
-    end
-    it '他所の原画なら含む' do
-      @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op2.id, :md5 => 'a' * 32
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.should eq [@p3]
-    end
-    it '他所の原画でもmd5が違えば含まない' do
-      @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op2.id, :md5 => 'c' * 32
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.empty?.should be_true
-    end
-    it '更新日時順' do
-      @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op2.id, :md5 => 'a' * 32
-      @p4 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
-        :original_picture_id => @op3.id, :md5 => 'a' * 32, :updated_at => Time.now + 100
-      res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
-      res.should eq [@p4, @p3]
+    context '除外する原画idで指定されていないとき' do
+      it 'リストを返す' do
+        res = Picture.list_by_md5(@p.md5)
+        res.is_a?(Array).should be_true
+      end
+      it 'md5が違えば含まない' do
+        res = Picture.list_by_md5(@p.md5)
+        res.include?(@p2).should be_false
+      end
+      it '更新日時順' do
+        @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op2.id, :md5 => 'C' * 32
+        @p4 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op3.id, :md5 => @p3.md5, :updated_at => Time.now + 100
+        res = Picture.find_by_md5(@p3.md5)
+        res.should eq [@p4, @p3]
+      end
+    end
+    context '除外する原画idで指定されたとき' do
+      it 'リストを返す' do
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.is_a?(Array).should be_true
+      end
+      it 'md5が違えば含まない' do
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.include?(@p2).should be_false
+      end
+      it '同一原画は含まない' do
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.empty?.should be_true
+      end
+      it '同一原画は旧版でも含まない' do
+        @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op.id, :md5 => 'a' * 32
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.empty?.should be_true
+      end
+      it '他所の原画なら含む' do
+        @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op2.id, :md5 => 'a' * 32
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.should eq [@p3]
+      end
+      it '他所の原画でもmd5が違えば含まない' do
+        @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op2.id, :md5 => 'c' * 32
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.empty?.should be_true
+      end
+      it '更新日時順' do
+        @p3 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op2.id, :md5 => 'a' * 32
+        @p4 = FactoryGirl.create :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
+          :original_picture_id => @op3.id, :md5 => 'a' * 32, :updated_at => Time.now + 100
+        res = Picture.list_by_md5(@p.md5, @p.original_picture_id)
+        res.should eq [@p4, @p3]
+      end
     end
   end
   
@@ -861,6 +912,55 @@ describe Picture do
     
   end
   
+  describe '墨塗に於いて' do
+    before do
+      @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :ext => 'png'
+    end
+    context '事前チェック' do
+      before do
+        @imager = ImagerTest.load "abc\ndef\nghi"
+        Picture.any_instance.stub(:store).with(any_args).and_return(true)
+        PettanImager.stub(:load).with(any_args).and_return(@imager)
+      end
+      it '画像ライブラリにロードを依頼している' do
+        PettanImager.should_receive(:load).with(any_args).exactly(1)
+        r = @p.unpublish
+      end
+      it '自身に作成を依頼している' do
+        Picture.any_instance.should_receive(:store).with(any_args).exactly(1)
+        r = @p.unpublish
+      end
+    end
+    context 'つつがなく終わるとき' do
+      before do
+        Picture.any_instance.stub(:store).with(any_args).and_return(true)
+      end
+      it 'Trueを返す' do
+        r = @p.unpublish
+        r.should be_true
+      end
+    end
+    #例外ケース
+    context '画像ライブラリのロードに失敗したとき' do
+      before do
+        PettanImager.stub(:load).and_return(false)
+      end
+      it 'Falseを返す' do
+        r = @p.unpublish
+        r.should be_false
+      end
+    end
+    context '作成に失敗したとき' do
+      before do
+        Picture.any_instance.stub(:store).with(any_args).and_return(false)
+      end
+      it 'Falseを返す' do
+        r = @p.unpublish
+        r.should be_false
+      end
+    end
+  end
+  
   describe 'フラグ展開に於いて' do
     before do
       @p = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id,
@@ -1032,4 +1132,67 @@ describe Picture do
     end
   end
   
+  describe 'エクスポートに於いて' do
+    before do
+      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
+      @p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 0
+      @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
+      @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 1, :updated_at => Time.now + 1000
+      #開始日時以前の実素材
+      @old_op = FactoryGirl.create :original_picture, :artist_id => @artist.id
+      @old_p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @old_op.id, :license_id => @license.id, :revision => 0, :updated_at => Time.now - 1000
+      @old_rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @old_op.id, :license_id => @license.id, :picture_id => @old_p.id
+      #他人の実素材
+      @other_op = FactoryGirl.create :original_picture, :artist_id => @other_artist.id
+      @other_p = FactoryGirl.create :picture, :artist_id => @other_artist.id, :original_picture_id => @other_op.id, :license_id => @license.id, :revision => 0, :updated_at => Time.now + 100
+      @other_rp = FactoryGirl.create :resource_picture, :artist_id => @other_artist.id, :original_picture_id => @other_op.id, :license_id => @license.id, :picture_id => @other_p.id
+      #貸手からの実素材排除
+      @outer_artist = FactoryGirl.create :artist_yas, :author_id => nil
+      @outer_op = FactoryGirl.create :original_picture, :artist_id => @outer_artist.id
+      @outer_p = FactoryGirl.create :picture, :artist_id => @outer_artist.id, :original_picture_id => @outer_op.id, :license_id => @license.id, :revision => 0
+      @outer_rp = FactoryGirl.create :resource_picture, :artist_id => @outer_artist.id, :original_picture_id => @outer_op.id, :license_id => @license.id, :picture_id => @outer_p.id
+    end
+    context 'つつがなく終わるとき' do
+      it '開始日時が省略された場合はすべての内実素材を返す' do
+        r = Picture.export 
+        r.should eq [@p2, @other_p, @p, @old_p]
+      end
+      it '開始日時以降に更新された内実素材を返す' do
+        r = Picture.export @p.updated_at - 100
+        r.should eq [@p2, @other_p, @p]
+      end
+    end
+  end
+  
+  describe 'リストのjson化に於いて' do
+    before do
+      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
+      @p = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :revision => 0
+      @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
+      @other_op = FactoryGirl.create :original_picture, :artist_id => @other_artist.id
+      @other_p = FactoryGirl.create :picture, :artist_id => @other_artist.id, :original_picture_id => @other_op.id, :license_id => @license.id, :revision => 0, :updated_at => Time.now + 100
+      @other_rp = FactoryGirl.create :resource_picture, :artist_id => @other_artist.id, :original_picture_id => @other_op.id, :license_id => @license.id, :picture_id => @other_p.id
+      Picture.any_instance.stub(:restore).with(any_args).and_return('picture binary data')
+    end
+    context 'つつがなく終わるとき' do
+      it 'json文字列を返す' do
+        r = Picture.list_as_json_text Picture.all 
+        lambda {
+          j = JSON.parse r
+        }.should_not raise_error(JSON::ParserError)
+      end
+      it '実素材リストを返す' do
+        r = Picture.list_as_json_text Picture.all 
+        j = JSON.parse r
+        j.size.should eq 2
+      end
+      it '各実素材に画像データを添えて返す' do
+        r = Picture.list_as_json_text Picture.all 
+        j = JSON.parse r
+        j.first['picture_data'].should_not be_nil
+        j.last['picture_data'].should_not be_nil
+      end
+    end
+  end
+  
 end