OSDN Git Service

t#30328:create op import ...and pull
authoryasushiito <yas@pen-chan.jp>
Mon, 14 Jan 2013 07:54:00 +0000 (16:54 +0900)
committeryasushiito <yas@pen-chan.jp>
Mon, 14 Jan 2013 07:54:00 +0000 (16:54 +0900)
30 files changed:
1  2 
Gemfile
app/controllers/application_controller.rb
app/controllers/demanders_controller.rb
app/controllers/provider_original_pictures_controller.rb
app/controllers/provider_statuses_controller.rb
app/helpers/provider_original_pictures_helper.rb
app/models/demander.rb
app/models/license.rb
app/models/original_picture.rb
app/models/picture.rb
app/models/provider_license.rb
app/models/provider_original_picture.rb
app/models/resource_picture.rb
app/views/artists/list.html.erb
app/views/layouts/test.html.erb
app/views/provider_statuses/original_pictures_import.html.erb
app/views/provider_statuses/show.html.erb
app/views/providers/show.html.erb
config/locales/pettanr.ja.yml
config/routes.rb
db/migrate/20130112061016_create_provider_original_pictures.rb
spec/controllers/demanders_controller_spec.rb
spec/controllers/licenses_controller_spec.rb
spec/controllers/provider_original_pictures_controller_spec.rb
spec/controllers/provider_statuses_controller_spec.rb
spec/factories.rb
spec/helpers/provider_original_pictures_helper_spec.rb
spec/models/original_picture_spec.rb
spec/models/picture_spec.rb
spec/models/provider_original_picture_spec.rb

diff --cc Gemfile
Simple merge
@@@ -87,29 -89,6 +89,35 @@@ class ApplicationController < ActionCon
      end
    end
    
 +  def ymd_to_time ymd_str
 +    return nil if ymd_str.blank?
 +    date = nil
 +    begin
 +      date = Time.parse(ymd_str[0..3] + '/' + ymd_str[4..5] + '/' + ymd_str[6..7])
 +    rescue
 +      date = nil
 +    end
 +    date
 +  end
 +  
 +  def export_url demander_url, action, token, date
 +    u = demander_url + (demander_url[-1] == '/' ? '' : '/')
 +    u = URI.join(u, action + '.json?auth_token=' + token)
 +    u = URI.join(u, '&date=' + date) unless date.blank?
 +    u.to_s
 +  end
 +  
 +  def export_from_provider url
 +    json = RestClient.get url
 +    JSON.parse json
 +  end
 +  
++  def export_by action, provider_status, ymd
++    t = ymd_to_time ymd
++    url = export_url provider_status.provider.demander_url, action, provider_status.token, t
++    export_from_provider(url)
++  end
++  
  =begin
    rescue_from ActiveRecord::RecordNotFound, :with => :render_404
  
index 0000000,0000000..7fd854e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++class ProviderOriginalPicturesController < ApplicationController
++end
@@@ -1,6 -1,6 +1,6 @@@
  class ProviderStatusesController < ApplicationController
    layout 'test' if MagicNumber['test_layout']
-   before_filter :authenticate_admin!, :only => [:index, :show, :edit, :update, :destroy, :licenses_import, :artists_import]
 -  before_filter :authenticate_admin!, :only => [:index, :show, :edit, :update, :destroy]
++  before_filter :authenticate_admin!, :only => [:index, :show, :edit, :update, :destroy, :licenses_import, :artists_import, :original_pictures_import]
  
    def index
      @page = ProviderStatus.page params[:page]
  
    def destroy
      @provider_status = ProviderStatus.edit(params[:id], @admin)
-     @provider_status.destroy
      respond_to do |format|
-       format.html { redirect_to comics_url }
-       format.json { head :ok }
+       if @provider_status.stop
+         flash[:notice] = I18n.t('provider_statuses.flash.notice.stopped')
+         format.html { redirect_to provider_statuses_url }
+         format.json { head :ok }
+       else
+         flash[:notice] = I18n.t('provider_statuses.flash.notice.not_stopped')
+         format.html { render action: "edit" }
+         format.json { render json: @provider_status.errors, status: :unprocessable_entity }
+       end
      end
    end
 +  
 +  def licenses_import
 +    @provider_status = ProviderStatus.show(params[:id], @admin)
 +    raise ActiveRecord::Forbidden if @provider_status.status == 0
 +    t = ymd_to_time params[:date]
 +    url = export_url @provider_status.provider.demander_url, 'licenses_export', @provider_status.token, t
 +    @failures = ProviderLicense.import @provider_status.provider.id, export_from_provider(url)
 +    respond_to do |format|
 +      format.html # show.html.erb
 +      format.json { render :json => @failures.to_json() }
 +    end
 +  end
 +  
 +  def artists_import
 +    @provider_status = ProviderStatus.show(params[:id], @admin)
 +    raise ActiveRecord::Forbidden if @provider_status.status == 0
 +    t = ymd_to_time params[:date]
 +    url = export_url @provider_status.provider.demander_url, 'artists_export', @provider_status.token, t
 +    @failures = ProviderArtist.import @provider_status.provider.id, export_from_provider(url)
 +    respond_to do |format|
 +      format.html # show.html.erb
 +      format.json { render :json => @failures.to_json() }
 +    end
 +  end
 +  
++  def original_pictures_import
++    @provider_status = ProviderStatus.show(params[:id], @admin)
++    raise ActiveRecord::Forbidden if @provider_status.status == 0
++    original_pictures = export_by('original_pictures_export', @provider_status, params[:date])
++    pictures = export_by('pictures_export', @provider_status, params[:date])
++    @failures = ProviderOriginalPicture.import @provider_status.provider.id, original_pictures, pictures
++    respond_to do |format|
++      format.html # show.html.erb
++      format.json { render :json => @failures.to_json() }
++    end
++  end
++  
  end
index 0000000,0000000..e62eaf7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++module ProviderOriginalPicturesHelper
++end
Simple merge
Simple merge
@@@ -150,24 -160,33 +160,47 @@@ class OriginalPicture < ActiveRecord::B
      PictureIO.original_picture_io.get self.filename, subdir
    end
    
 -  def self.export ar
 -    l = LicenseGroup.list
 -    op = OriginalPicture.list ar.id
 -    {:license_groups => l, :original_pictures => op}
 -  end
 -  
 +  def self.export(dt = nil)
 +    opt = {}
 +    cond = if dt
 +      ['artists.author_id is not null and original_pictures.updated_at >= ?', dt]
 +    else
 +      'artists.author_id is not null'
 +    end
 +    opt.merge!({:conditions => cond}) 
 +    opt.merge!({:include => {:resource_picture => {}, :artist => {}}, :order => 'original_pictures.id'})
 +    OriginalPicture.find(:all, opt)
 +  end
 +  
 +  def list_as_json_with_resource_picture
 +    self.to_json({:include => {:resource_picture => {:methods => :picture_data}}})
 +  end
 +  
 +  def self.list_as_json_text ary
 +    '[' + ary.map {|i| i.list_as_json_with_resource_picture }.join(',') + ']'
 +  end
 +  
+   def destroy_with_resource_picture
+     res = false
+     OriginalPicture.transaction do
+       begin
+         PictureIO.original_picture_io.delete(self.filename) if PictureIO.original_picture_io.exist?(self.filename)
+       rescue PictureIO::Error
+         res = false
+         raise ActiveRecord::Rollback
+       end
+       if self.resource_picture
+         res = self.resource_picture.unpublish
+         raise ActiveRecord::Rollback unless res
+       end
+       self.pictures.each do |picture|
+         res = picture.unpublish
+         raise ActiveRecord::Rollback unless res
+       end
+       res = self.destroy
+       raise ActiveRecord::Rollback unless res
+     end
+     res
+   end
+   
  end
@@@ -83,8 -92,8 +92,12 @@@ class Picture < ActiveRecord::Bas
      r ? true : false
    end
    
++  def self.head opid
++    Picture.find(:first, :conditions => ['original_picture_id = ?', opid], :order => 'pictures.revision desc')
++  end
++  
    def head
--    Picture.find(:first, :conditions => ['original_picture_id = ?', self.original_picture_id], :order => 'pictures.revision desc')
++    Picture.head(self.original_picture_id)
    end
    
    def head?
      PictureIO.picture_io.get self.filename, subdir
    end
    
 +  def self.export(dt = nil)
 +    opt = {}
 +    cond = if dt
 +      ['artists.author_id is not null and pictures.updated_at >= ?', dt]
 +    else
 +      'artists.author_id is not null'
 +    end
 +    opt.merge!({:conditions => cond}) 
 +    opt.merge!({:include => {:artist => {}}, :order => 'pictures.updated_at desc'})
 +    Picture.find(:all, opt)
 +  end
 +  
 +  def self.list_as_json_text ary
 +    '[' + ary.map {|i| i.to_json_with_picture_data }.join(',') + ']'
 +  end
 +  
 +  def picture_data
 +    Base64.encode64(self.restore)
 +  end
 +  
 +  def to_json_with_picture_data
 +    self.to_json({:methods => :picture_data})
 +  end
 +  
+   def unpublish
+     imager = PettanImager.load(File.open(Rails.root + 'app/assets/images/error.png', 'rb').read)
+     return false unless imager
+     self.store imager
+   end
+   
    def credit_template
      "#{self.classname.tableize}/attributes/credit"
    end
index 7c8efed,0000000..8f1b541
mode 100644,000000..100644
--- /dev/null
@@@ -1,33 -1,0 +1,38 @@@
 +class ProviderLicense < ActiveRecord::Base
 +  belongs_to :provider
++  belongs_to :license, :foreign_key => :demanders_license_id
 +  
 +  validates :provider_id, :presence => true, :numericality => true, :existence => true
 +  validates :providers_license_id, :presence => true, :numericality => true
 +  validates :demanders_license_id, :presence => true, :numericality => true
 +  
++  def self.get_one pid, plid
++    ProviderLicense.find_by_provider_id_and_providers_license_id(pid, plid) || ProviderLicense.new
++  end
++  
 +  def self.exist_license pid, plid
 +    ProviderLicense.find_by_provider_id_and_providers_license_id(pid, plid) != nil
 +  end
 +  
 +  def self.import pid, providers_licenses
 +    res = []
 +    ProviderLicense.transaction do
 +      providers_licenses.each do |providers_license|
 +        if ProviderLicense.exist_license(pid, providers_license['id'])
 +        else
 +          if demander_license = License.find_by_name(providers_license['name'])
 +            pl = ProviderLicense.new :provider_id => pid, :providers_license_id => providers_license['id'], :demanders_license_id => demander_license.id
 +            unless pl.save
 +              res << providers_license
 +            end
 +          else
 +            res << providers_license
 +          end
 +        end
 +      end
 +      raise ActiveRecord::Rollback if res.any?
 +    end
 +    res
 +  end
 +  
 +end
index 0000000,0000000..3178a45
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,148 @@@
++class ProviderOriginalPicture < ActiveRecord::Base
++  belongs_to :provider
++  belongs_to :original_picture, :foreign_key => :demanders_original_picture_id
++  
++  validates :provider_id, :presence => true, :numericality => true, :existence => true
++  validates :providers_original_picture_id, :presence => true, :numericality => true
++  validates :demanders_original_picture_id, :presence => true, :numericality => true
++  
++  def self.get_one pid, popid
++    ProviderOriginalPicture.find_by_provider_id_and_providers_original_picture_id(pid, popid) || ProviderOriginalPicture.new
++  end
++  
++  def modify_original_picture attr
++    op = if self.original_picture
++      self.original_picture
++    else
++      OriginalPicture.new
++    end
++    op.attributes = attr
++    op.save
++    op
++  end
++  
++  def self.modify_picture attr
++    p = Picture.find_by_original_picture_id_and_revision(attr['original_picture_id'], attr['revision']) || Picture.new
++    p.attributes = attr
++    p
++  end
++  
++  def self.modify_resource_picture attr
++    rp = ResourcePicture.find_by_original_picture_id(attr['original_picture_id']) || ResourcePicture.new
++    rp.attributes = attr
++    rp
++  end
++  
++  def self.replace_artist pid, attr
++    pa = ProviderArtist.get_one pid, attr['artist_id'].to_i
++    if pa.artist
++      attr['artist_id'] = pa.artist.id
++      true
++    else
++      false
++    end
++  end
++  
++  def self.replace_license pid, attr
++    pl = ProviderLicense.get_one pid, attr['license_id'].to_i
++    if pl.license
++      attr['license_id'] = pl.license.id
++      true
++    else
++      false
++    end
++  end
++  
++  def self.replace_original_picture pid, attr
++    pop = ProviderOriginalPicture.get_one pid, attr['original_picture_id'].to_i
++    if pop.original_picture
++      attr['original_picture_id'] = pop.original_picture.id
++      true
++    else
++      false
++    end
++  end
++  
++  def self.import_original_picture pid, providers_original_pictures
++    res = []
++    providers_original_pictures.each do |providers_original_picture_attr|
++      provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
++      demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
++      if demander_original_picture.valid?
++        provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => providers_original_picture_attr['id'], :demanders_original_picture_id => demander_original_picture.id}
++        unless provider_original_picture.save
++          res << providers_original_picture_attr
++        end
++      else
++        res << providers_original_picture_attr
++      end
++    end
++    res
++  end
++  
++  def self.import_picture pid, providers_pictures
++    res = []
++    providers_pictures.each do |providers_picture_attr|
++      if ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr) and
++        ProviderOriginalPicture.replace_artist(pid, providers_picture_attr) and
++        ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
++        picture_data = Base64.decode64 providers_picture_attr['picture_data']
++        providers_picture_attr.delete 'picture_data'
++        if imager = PettanImager.load(picture_data)
++          picture = ProviderOriginalPicture.modify_picture providers_picture_attr
++          if picture.store(imager)
++          else
++            res << providers_picture_attr
++          end
++        else
++          res << providers_picture_attr
++        end
++      else
++        res << providers_picture_attr
++      end
++    end
++    res
++  end
++  
++  def self.import_resource_picture pid, providers_original_pictures
++    res = []
++    providers_original_pictures.each do |providers_original_picture_attr|
++      providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
++      if ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr) and
++        ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr) and
++        ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
++        picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
++        providers_resource_picture_attr.delete 'picture_data'
++        if imager = PettanImager.load(picture_data)
++          resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
++          if resource_picture.store(imager)
++          else
++            res << providers_resource_picture_attr
++          end
++        else
++          res << providers_resource_picture_attr
++        end
++      else
++        res << providers_resource_picture_attr
++      end
++    end
++    res
++  end
++  
++  def self.import pid, original_pictures, pictures
++    res = {:original_pictures => [], :pictures => [], :resource_pictures => []}
++    ProviderOriginalPicture.transaction do
++      r = ProviderOriginalPicture.import_original_picture(pid, original_pictures)
++      res[:original_pictures] = r
++      raise ActiveRecord::Rollback if r.any?
++      r = ProviderOriginalPicture.import_picture(pid, pictures)
++      res[:pictures] = r
++      raise ActiveRecord::Rollback if r.any?
++      r = ProviderOriginalPicture.import_resource_picture(pid, original_pictures)
++      res[:resource_pictures] = r
++      raise ActiveRecord::Rollback if r.any?
++    end
++    res
++  end
++  
++end
Simple merge
@@@ -3,8 -3,8 +3,9 @@@
  <table>
    <tr>
      <th><%= t_m 'Artist.id' -%></th>
+     <th><%= t_m 'Artist.author_id' -%></th>
      <th><%= t_m 'Artist.name' -%></th>
 +    <th><%= t_m 'Artist.author_id' -%></th>
      <th><%= t_m 'Artist.created_at' -%></th>
      <th><%= t_m 'Artist.updated_at' -%></th>
    </tr>
    <% @artists.each do |artist| %>
      <tr>
        <td><%= link_to artist.id, browse_artist_path(artist) %></td>
+       <td><%= link_to artist.author_id, browse_author_path(artist.author) %></td>
        <td><%= h(truncate(artist.name, :length => 12)) %></td>
 +      <td>
 +        <% if artist.author_id %>
 +          <%= link_to artist.author_id, browse_author_path(artist.author) %>
 +        <% end %>
 +      </td>
        <td><%= l artist.created_at %></td>
        <td><%= l artist.updated_at %></td>
      </tr>
@@@ -12,7 -19,7 +19,7 @@@
  <table class="no-border">\r
    <tr>\r
      <td width="80%">\r
-       <h3>PettanR</h3>\r
 -      <h3><%= link_to MagicNumber['profile']['caption'], root_path %></h3>\r
++      <h3><%= link_to MagicNumber['profile']['caption'], main_app.root_path %></h3>\r
      </td>\r
      <td>\r
        <div>\r
index 0000000,0000000..0f96f7b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,29 @@@
++<h1><%= t('.title') %></h1>
++<p id="notice"><%= notice %></p>
++
++<% if @failures.empty? %>
++  <h2>
++    <%= t('provider_statuses.artists_import.success') %>
++  </h2>
++<% else %>
++  <h2>
++    <%= t('provider_statuses.artists_import.fail', :size => @failures.size) %>
++  </h2>
++  <table>
++    <tr>
++      <th><%= t_m 'License.caption' -%></th>
++      <th><%= t_m 'License.name' -%></th>
++    </tr>
++    <% @failures.each do |artist| %>
++      <tr>
++        <td>
++          <%= link_to h(artist['caption']), artist['url'] %>
++        </td>
++        <td>
++          <%= h(artist['name']) %>
++        </td>
++      </tr>
++    <% end %>
++  </table>
++  <%= link_to t('provider_statuses.artists_import.to_show'), provider_status_path(@provider_status) %>
++<% end %>
  </p>
  <p>
    <%= link_to t('provider_statuses.show.demander_open'), @provider_status.provider.demander_url %>
 -<p>
 -
 -<p>
 -  <%= t('provider_statuses.show.receive_announce') %>
  </p>
 -<p>
 -  <% if @provider_status.status == 0 %>
 -    <%= link_to t('provider_statuses.show.receive_start'), edit_provider_status_path(@provider_status) %>
 -  <% else %>
 +<% if @provider_status.status == 0 %>
 +  <p>
 +    <%= t('provider_statuses.show.receive_announce') %>
 +  </p>
 +  <%= link_to t('provider_statuses.show.receive_start'), edit_provider_status_path(@provider_status) %>
 +<% else %>
 +  <p>
 +    <%= link_to t('provider_statuses.show.licenses_import'), licenses_import_provider_status_path(@provider_status), :method => :post %>
 +  </p>
 +  <p>
 +    <%= link_to t('provider_statuses.show.artists_import'), artists_import_provider_status_path(@provider_status), :method => :post %>
 +  </p>
 +  <p>
++    <%= link_to t('provider_statuses.show.original_pictures_import'), original_pictures_import_provider_status_path(@provider_status), :method => :post %>
++  </p>
++  <p>
      <%= link_to t('provider_statuses.show.receive_stop'), provider_status_path(@provider_status), :method => :delete %>
 -  <% end %>
 -</p>
 +  </p>
 +<% end %>
  <%= link_to t('link.back'), provider_statuses_path %>
  
    <%= h(@provider.name) %>
  </p>
  <p>
++  <%= t_m 'Provider.demander_url' -%>
++  <%= @provider.demander_url %>
++</p>
++<p>
    <%= t_m 'Provider.url' -%>
    <%= @provider.url %>
  </p>
@@@ -628,7 -727,6 +733,9 @@@ ja
        receive_announce: 借受するには借手となって借受申請する。
        receive_start: この貸手からの借受を開始する
        receive_stop: 借受を停止する
 +      licenses_import: ライセンスをインポートする
++      artists_import: 絵師をインポートする
++      original_pictures_import: 素材をインポートする
      new:
        title: 借受状況登録
      edit:
@@@ -298,8 -299,6 +299,9 @@@ Pettanr::Application.routes.draw d
        get :edit
        put :update
        delete :destroy
 +      post :licenses_import
 +      post :artists_import
++      post :original_pictures_import
      end
    end
    resources :demanders do
index 0000000,0000000..3abd52a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,11 @@@
++class CreateProviderOriginalPictures < ActiveRecord::Migration
++  def change
++    create_table :provider_original_pictures do |t|
++      t.integer :provider_id, :null => false, :default => 0
++      t.integer :providers_original_picture_id, :null => false, :default => 0
++      t.integer :demanders_original_picture_id, :null => false, :default => 0
++
++      t.timestamps
++    end
++  end
++end
index 0000000,0000000..fad7147
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++require 'spec_helper'
++
++describe ProviderOriginalPicturesController do
++
++end
@@@ -358,239 -357,5 +358,354 @@@ describe ProviderStatusesController d
        end
      end
    end
 -
 +  
 +  describe 'ライセンスインポートに於いて' do
 +    before do
 +      @ps = FactoryGirl.create :provider_status, :token => 'aaaaaaaaaaaaaaaaa'
 +      @provider = FactoryGirl.create :provider, :provider_status_id => @ps.id
 +      ProviderStatus.stub(:show).and_return(@ps)
 +      sign_in @admin
 +    end
 +    context '事前チェックしておく' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with(any_args).and_return(nil)
 +        ProviderStatusesController.any_instance.stub(:export_url).with(any_args).and_return('http://localhost:3000/demanders/licenses_export/1.json')
 +        ProviderStatusesController.any_instance.stub(:export_from_provider).with(any_args).and_return([@license.attributes])
 +        ProviderLicense.stub(:import).with(any_args).and_return([])
 +      end
 +      it '借受状況モデルに単体取得を問い合わせている' do
 +        ProviderStatus.should_receive(:show).exactly(1)
 +        get :licenses_import, :id => @ps.id
 +      end
 +      it '日付文字列変換を依頼している' do
 +        ProviderStatusesController.any_instance.should_receive(:ymd_to_time).with('20111010').exactly(1)
 +        get :licenses_import, :id => @ps.id, :date => '20111010'
 +      end
 +      it 'エクスポートurl取得を依頼している' do
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with('20111010').and_return(Time.parse('2011/10/10'))
 +        ProviderStatusesController.any_instance.should_receive(:export_url).with(@provider.demander_url, 'licenses_export', @ps.token, Time.parse('2011/10/10')).exactly(1)
 +        get :licenses_import, :id => @ps.id, :date => '20111010'
 +      end
 +      it '貸手からのエクスポートを依頼している' do
 +        ProviderStatusesController.any_instance.should_receive(:export_from_provider).exactly(1)
 +        get :licenses_import, :id => @ps.id
 +      end
 +      it 'ライセンス対照表モデルにインポートを依頼している' do
 +        ProviderLicense.should_receive(:import).exactly(1)
 +        get :licenses_import, :id => @ps.id
 +      end
 +    end
 +    context 'つつがなく終わるとき' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with('20111010').and_return(Time.parse('2011/10/10'))
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with(any_args).and_return(nil)
 +        ProviderStatusesController.any_instance.stub(:export_url).with(any_args).and_return('http://localhost:3000/demanders/licenses_export/1.json')
 +        ProviderStatusesController.any_instance.stub(:export_from_provider).with(any_args).and_return([@license.attributes])
 +        ProviderLicense.stub(:import).with(any_args).and_return([])
 +      end
 +      it 'ステータスコード200 OKを返す' do
 +        get :licenses_import, :id => @ps.id
 +        response.should be_success
 +      end
 +      it '@provider_statusに借受状況を取得している' do
 +        get :licenses_import, :id => @ps.id
 +        assigns(:provider_status).should eq(@ps)
 +      end
 +      it '@failuresにインポート失敗リストを取得している' do
 +        get :licenses_import, :id => @ps.id
 +        assigns(:failures).should eq([])
 +      end
 +      context 'html形式' do
 +        it 'licenses_importテンプレートを描画する' do
 +          get :licenses_import, :id => @ps.id
 +          response.should render_template("licenses_import")
 +        end
 +      end
 +      context 'json形式' do
 +        it 'jsonデータを返す' do
 +          get :licenses_import, :id => @ps.id, :format => :json
 +          lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
 +        end
 +      end
 +    end
 +    context '管理者権限がないとき' do
 +      before do
 +        sign_out @admin
 +      end
 +      context 'html形式' do
 +        it 'ステータスコード302 Foundを返す' do
 +          get :licenses_import, :id => @ps.id
 +          response.status.should eq 302
 +        end
 +        it 'サインインページへ遷移する' do
 +          get :licenses_import, :id => @ps.id
 +          response.body.should redirect_to '/admins/sign_in'
 +        end
 +      end
 +      context 'json形式' do
 +        it 'ステータスコード401 Unauthorizedを返す' do
 +          get :licenses_import, :id => @ps.id, :format => :json
 +          response.status.should eq 401
 +        end
 +        it '応答メッセージにUnauthorizedを返す' do
 +          get :licenses_import, :id => @ps.id, :format => :json
 +          response.message.should match(/Unauthorized/)
 +        end
 +      end
 +    end
 +    context '借受権限がないとき' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).and_return(0)
 +      end
 +      context 'html形式' do
 +        it '例外403 forbiddenを返す' do
 +          lambda{
 +            get :licenses_import, :id => @ps.id
 +          }.should raise_error(ActiveRecord::Forbidden)
 +        end
 +      end
 +      context 'json形式' do
 +        it '例外403 forbiddenを返す' do
 +          lambda{
 +            get :licenses_import, :id => @ps.id, :format => :json
 +          }.should raise_error(ActiveRecord::Forbidden)
 +        end
 +      end
 +    end
 +  end
 +  
 +  describe '絵師インポートに於いて' do
 +    before do
 +      @ps = FactoryGirl.create :provider_status, :token => 'aaaaaaaaaaaaaaaaa'
 +      @provider = FactoryGirl.create :provider, :provider_status_id => @ps.id
 +      ProviderStatus.stub(:show).and_return(@ps)
 +      sign_in @admin
 +    end
 +    context '事前チェックしておく' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with(any_args).and_return(nil)
 +        ProviderStatusesController.any_instance.stub(:export_url).with(any_args).and_return('http://localhost:3000/demanders/artists_export/1.json')
 +        ProviderStatusesController.any_instance.stub(:export_from_provider).with(any_args).and_return([@artist.attributes])
 +        ProviderArtist.stub(:import).with(any_args).and_return([])
 +      end
 +      it '借受状況モデルに単体取得を問い合わせている' do
 +        ProviderStatus.should_receive(:show).exactly(1)
 +        get :artists_import, :id => @ps.id
 +      end
 +      it '日付文字列変換を依頼している' do
 +        ProviderStatusesController.any_instance.should_receive(:ymd_to_time).with('20111010').exactly(1)
 +        get :licenses_import, :id => @ps.id, :date => '20111010'
 +      end
 +      it 'エクスポートurl取得を依頼している' do
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with('20111010').and_return(Time.parse('2011/10/10'))
 +        ProviderStatusesController.any_instance.should_receive(:export_url).with(@provider.demander_url, 'artists_export', @ps.token, Time.parse('2011/10/10')).exactly(1)
 +        get :artists_import, :id => @ps.id, :date => '20111010'
 +      end
 +      it '貸手からのエクスポートを依頼している' do
 +        ProviderStatusesController.any_instance.should_receive(:export_from_provider).exactly(1)
 +        get :artists_import, :id => @ps.id
 +      end
 +      it '絵師対照表モデルにインポートを依頼している' do
 +        ProviderArtist.should_receive(:import).exactly(1)
 +        get :artists_import, :id => @ps.id
 +      end
 +    end
 +    context 'つつがなく終わるとき' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with('20111010').and_return(Time.parse('2011/10/10'))
 +        ProviderStatusesController.any_instance.stub(:ymd_to_time).with(any_args).and_return(nil)
 +        ProviderStatusesController.any_instance.stub(:export_url).with(any_args).and_return('http://localhost:3000/demanders/artists_export/1.json')
 +        ProviderStatusesController.any_instance.stub(:export_from_provider).with(any_args).and_return([@artist.attributes])
-         ProviderLicense.stub(:import).with(any_args).and_return([])
++        ProviderArtist.stub(:import).with(any_args).and_return([])
 +      end
 +      it 'ステータスコード200 OKを返す' do
 +        get :artists_import, :id => @ps.id
 +        response.should be_success
 +      end
 +      it '@provider_statusに借受状況を取得している' do
 +        get :artists_import, :id => @ps.id
 +        assigns(:provider_status).should eq(@ps)
 +      end
 +      it '@failuresにインポート失敗リストを取得している' do
 +        get :artists_import, :id => @ps.id
 +        assigns(:failures).should eq([])
 +      end
 +      context 'html形式' do
 +        it 'artists_importテンプレートを描画する' do
 +          get :artists_import, :id => @ps.id
 +          response.should render_template("artists_import")
 +        end
 +      end
 +      context 'json形式' do
 +        it 'jsonデータを返す' do
 +          get :artists_import, :id => @ps.id, :format => :json
 +          lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
 +        end
 +      end
 +    end
 +    context '管理者権限がないとき' do
 +      before do
 +        sign_out @admin
 +      end
 +      context 'html形式' do
 +        it 'ステータスコード302 Foundを返す' do
 +          get :artists_import, :id => @ps.id
 +          response.status.should eq 302
 +        end
 +        it 'サインインページへ遷移する' do
 +          get :artists_import, :id => @ps.id
 +          response.body.should redirect_to '/admins/sign_in'
 +        end
 +      end
 +      context 'json形式' do
 +        it 'ステータスコード401 Unauthorizedを返す' do
 +          get :artists_import, :id => @ps.id, :format => :json
 +          response.status.should eq 401
 +        end
 +        it '応答メッセージにUnauthorizedを返す' do
 +          get :artists_import, :id => @ps.id, :format => :json
 +          response.message.should match(/Unauthorized/)
 +        end
 +      end
 +    end
 +    context '借受権限がないとき' do
 +      before do
 +        ProviderStatus.any_instance.stub(:status).and_return(0)
 +      end
 +      context 'html形式' do
 +        it '例外403 forbiddenを返す' do
 +          lambda{
 +            get :artists_import, :id => @ps.id
 +          }.should raise_error(ActiveRecord::Forbidden)
 +        end
 +      end
 +      context 'json形式' do
 +        it '例外403 forbiddenを返す' do
 +          lambda{
 +            get :artists_import, :id => @ps.id, :format => :json
 +          }.should raise_error(ActiveRecord::Forbidden)
 +        end
 +      end
 +    end
 +  end
 +  
++  describe '素材インポートに於いて' do
++    before do
++      @ps = FactoryGirl.create :provider_status, :token => 'aaaaaaaaaaaaaaaaa'
++      @provider = FactoryGirl.create :provider, :provider_status_id => @ps.id
++      ProviderStatus.stub(:show).and_return(@ps)
++      sign_in @admin
++      @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
++      @opattr = @op.attributes
++      @pattr = @p.attributes
++      @pattr['picture_data'] =  "abc\ndef\nghi"
++      @rpattr = {:original_picture_id => @op.id, :picture_id => @p.id, :license_id => @license.id, :artist_id => @artist.id, :artist_name => 'tester', 
++        :credit => '{}', :settings => {:reverse => 1, :gif_convert => 1}.to_json.to_s}
++      @opattr['resource_picture'] =  @rpattr
++      @opattr['resource_picture']['picture_data'] =  "abc\ndef\nghi"
++    end
++    context '事前チェックしておく' do
++      before do
++        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
++        ProviderStatusesController.any_instance.stub(:export_by).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import).with(any_args).and_return({:original_pictures => [], :pictures => [], :resource_pictures => []})
++      end
++      it '借受状況モデルに単体取得を問い合わせている' do
++        ProviderStatus.should_receive(:show).exactly(1)
++        get :original_pictures_import, :id => @ps.id
++      end
++      it '貸手からの原画エクスポート,実素材エクスポートを依頼している' do
++        ProviderStatusesController.any_instance.should_receive(:export_by).with(any_args).exactly(2)
++        get :original_pictures_import, :id => @ps.id
++      end
++      it '原画対照表モデルにインポートを依頼している' do
++        ProviderOriginalPicture.should_receive(:import).exactly(1)
++        get :original_pictures_import, :id => @ps.id
++      end
++    end
++    context 'つつがなく終わるとき' do
++      before do
++        ProviderStatus.any_instance.stub(:status).with(any_args).and_return(1)
++        ProviderStatusesController.any_instance.stub(:export_by).with(any_args).and_return([@opattr])
++        ProviderOriginalPicture.stub(:import).with(any_args).and_return({:original_pictures => [], :pictures => [], :resource_pictures => []})
++      end
++      it 'ステータスコード200 OKを返す' do
++        get :original_pictures_import, :id => @ps.id
++        response.should be_success
++      end
++      it '@provider_statusに借受状況を取得している' do
++        get :original_pictures_import, :id => @ps.id
++        assigns(:provider_status).should eq(@ps)
++      end
++      it '@failuresにインポート失敗リストを取得している' do
++        get :original_pictures_import, :id => @ps.id
++        assigns(:failures).should_not be_nil
++        assigns(:failures)[:original_pictures].should be_empty
++        assigns(:failures)[:pictures].should be_empty
++        assigns(:failures)[:resource_pictures].should be_empty
++      end
++      context 'html形式' do
++        it 'artists_importテンプレートを描画する' do
++          get :original_pictures_import, :id => @ps.id
++          response.should render_template("original_pictures_import")
++        end
++      end
++      context 'json形式' do
++        it 'jsonデータを返す' do
++          get :original_pictures_import, :id => @ps.id, :format => :json
++          lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
++        end
++      end
++    end
++    context '管理者権限がないとき' do
++      before do
++        sign_out @admin
++      end
++      context 'html形式' do
++        it 'ステータスコード302 Foundを返す' do
++          get :original_pictures_import, :id => @ps.id
++          response.status.should eq 302
++        end
++        it 'サインインページへ遷移する' do
++          get :original_pictures_import, :id => @ps.id
++          response.body.should redirect_to '/admins/sign_in'
++        end
++      end
++      context 'json形式' do
++        it 'ステータスコード401 Unauthorizedを返す' do
++          get :original_pictures_import, :id => @ps.id, :format => :json
++          response.status.should eq 401
++        end
++        it '応答メッセージにUnauthorizedを返す' do
++          get :original_pictures_import, :id => @ps.id, :format => :json
++          response.message.should match(/Unauthorized/)
++        end
++      end
++    end
++    context '借受権限がないとき' do
++      before do
++        ProviderStatus.any_instance.stub(:status).and_return(0)
++      end
++      context 'html形式' do
++        it '例外403 forbiddenを返す' do
++          lambda{
++            get :original_pictures_import, :id => @ps.id
++          }.should raise_error(ActiveRecord::Forbidden)
++        end
++      end
++      context 'json形式' do
++        it '例外403 forbiddenを返す' do
++          lambda{
++            get :original_pictures_import, :id => @ps.id, :format => :json
++          }.should raise_error(ActiveRecord::Forbidden)
++        end
++      end
++    end
++  end
++  
  end
@@@ -100,7 -100,7 +100,7 @@@ FactoryGirl.define d
  
    factory :picture, :class => Picture do |p|
      p.original_picture_id 1
--    p.revision 1
++    p.revision 0
      p.ext 'png'
      p.width 222
      p.height 111
      demander_status.receive_hour1 nil
      demander_status.receive_hour2 nil
    end
 +
 +  factory :provider_license, :class => ProviderLicense do |provider_license|
 +    provider_license.provider_id nil
 +    provider_license.providers_license_id nil
 +    provider_license.demanders_license_id nil
 +  end
 +
 +  factory :provider_artist, :class => ProviderArtist do |provider_artist|
 +    provider_artist.provider_id nil
 +    provider_artist.providers_artist_id nil
 +    provider_artist.demanders_artist_id nil
 +  end
 +
++  factory :provider_original_picture, :class => ProviderOriginalPicture do |provider_original_picture|
++    provider_original_picture.provider_id nil
++    provider_original_picture.providers_original_picture_id nil
++    provider_original_picture.demanders_original_picture_id nil
++  end
++
  end
index 0000000,0000000..c85cf17
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++require 'spec_helper'
++
++# Specs in this file have access to a helper object that includes
++# the ProviderOriginalPicturesHelper. For example:
++#
++# describe ProviderOriginalPicturesHelper do
++#   describe "string concat" do
++#     it "concats two strings with spaces" do
++#       helper.concat_strings("this","that").should == "this that"
++#     end
++#   end
++# end
++describe ProviderOriginalPicturesHelper do
++  pending "add some examples to (or delete) #{__FILE__}"
++end
@@@ -672,6 -783,142 +783,141 @@@ describe OriginalPicture d
      end
    end
    
 -=begin
+   describe '削除に於いて' do
+     before do
+       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
+     end
+     context '事前チェックしておく' do
+       before do
+         OriginalPicture.any_instance.stub(:destroy).and_return(true)
+         ResourcePicture.any_instance.stub(:unpublish).and_return(true)
+         Picture.any_instance.stub(:unpublish).with(any_args).and_return(true)
+         PictureIO.original_picture_io.stub(:delete).with(any_args).and_return(true)
+       end
+       it '原画モデルに削除を依頼している' do
+         OriginalPicture.any_instance.should_receive(:destroy).exactly(1)
+         r = @op.destroy_with_resource_picture
+       end
+       it '保管庫に原画の画像データ削除を依頼している' do
+         PictureIO.original_picture_io.should_receive(:delete).with(@op.filename).exactly(1)
+         r = @op.destroy_with_resource_picture
+       end
+       context '自身にリンクされた素材があるとき' do
+         it '素材モデルに削除を依頼している' do
+           @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 0
+           @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
+           ResourcePicture.any_instance.should_receive(:unpublish).exactly(1)
+           r = @op.destroy_with_resource_picture
+         end
+       end
+       context '自身にリンクされた素材がないとき' do
+         it '素材モデルに削除を依頼しない' do
+           ResourcePicture.any_instance.should_not_receive(:unpublish)
+           r = @op.destroy_with_resource_picture
+         end
+       end
+       context '自身にリンクされた実素材があるとき' do
+         it 'すべての実素材に墨塗を依頼している' do
+           @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 0
+           Picture.any_instance.should_receive(:unpublish).with(any_args).exactly(1)
+           r = @op.destroy_with_resource_picture
+         end
+       end
+       context '自身にリンクされた実素材がないとき' do
+         it '実素材に墨塗を依頼しない' do
+           Picture.any_instance.should_not_receive(:unpublish)
+           r = @op.destroy_with_resource_picture
+         end
+       end
+     end
+     context 'つつがなく終わるとき' do
+       before do
+         PictureIO.original_picture_io.stub(:delete).with(any_args).and_return(true)
+         @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 0
+         @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
+       end
+       it '自身を削除する' do
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should change(OriginalPicture, :count).by(-1)
+         lambda {
+           r = OriginalPicture.find @op.id
+         }.should raise_error
+       end
+       it 'Trueを返す' do
+         r = @op.destroy_with_resource_picture
+         r.should be_true
+       end
+     end
+     context '自身の削除に失敗したとき' do
+       before do
+         OriginalPicture.any_instance.stub(:destroy).with(any_args).and_return(false)
+       end
+       it 'Falseを返す' do
+         r = @op.destroy_with_resource_picture
+         r.should be_false
+       end
+       it 'ロールバックしている' do
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(OriginalPicture, :count)
+       end
+     end
+     context '画像の削除に失敗したとき' do
+       before do
+         PictureIO.original_picture_io.stub(:exist?).with(@op.filename).and_return(true)
+         PictureIO.original_picture_io.stub(:delete).with(@op.filename).and_raise(PictureIO::Error)
+       end
+       it 'Falseを返す' do
+         r = @op.destroy_with_resource_picture
+         r.should be_false
+       end
+       it 'ロールバックしている' do
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(OriginalPicture, :count)
+       end
+     end
+     context '素材の削除に失敗とき' do
+       before do
+         @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 0
+         @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
+         ResourcePicture.any_instance.stub(:unpublish).with(any_args).and_return(false)
+       end
+       it 'Falseを返す' do
+         r = @op.destroy_with_resource_picture
+         r.should be_false
+       end
+       it 'ロールバックしている' do
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(OriginalPicture, :count)
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(ResourcePicture, :count)
+       end
+     end
+     context '実素材の墨塗に失敗とき' do
+       before do
+         @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 0
+         @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
+         Picture.any_instance.stub(:unpublish).with(any_args).and_return(false)
+       end
+       it 'Falseを返す' do
+         r = @op.destroy_with_resource_picture
+         r.should be_false
+       end
+       it 'ロールバックしている' do
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(OriginalPicture, :count)
+         lambda {
+           r = @op.destroy_with_resource_picture
+         }.should_not change(ResourcePicture, :count)
+       end
+     end
+   end
+   
    describe 'エクスポートに於いて' do
      before do
        @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
Simple merge
index 0000000,0000000..50f27df
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,706 @@@
++# -*- encoding: utf-8 -*-
++#原画対照表
++require 'spec_helper'
++
++describe ProviderOriginalPicture do
++  before do
++    @admin = FactoryGirl.create :admin
++    @sp = FactoryGirl.create :system_picture
++    @lg = FactoryGirl.create :license_group
++    @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
++    @user = FactoryGirl.create :user_yas
++    @author = FactoryGirl.create :author, :user_id => @user.id
++    @artist = FactoryGirl.create :artist, :author_id => @author.id
++    @other_user = FactoryGirl.create :user_yas
++    @other_author = FactoryGirl.create :author, :user_id => @other_user.id
++    @other_artist = FactoryGirl.create :artist, :author_id => @other_author.id
++    @provider_status = FactoryGirl.create :provider_status
++    @provider = FactoryGirl.create :provider, :provider_status_id => @provider_status.id
++  end
++  describe '検証に於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @pop = FactoryGirl.build :provider_original_picture, :provider_id => @provider.id, :providers_original_picture_id => 2, :demanders_original_picture_id => @op.id
++    end
++    
++    context 'オーソドックスなデータのとき' do
++      it '下限データが通る' do
++        @pop.should be_valid
++      end
++      it '上限データが通る' do
++        @pop.should be_valid
++      end
++    end
++    
++    context 'provider_idを検証するとき' do
++      it 'nullなら失敗する' do
++        @pop.provider_id = nil
++        @pop.should_not be_valid
++      end
++      it '数値でなければ失敗する' do
++        @pop.provider_id = 'a'
++        @pop.should_not be_valid
++      end
++      it '存在する貸手でなければ失敗する' do
++        @pop.provider_id = 0
++        @pop.should_not be_valid
++      end
++    end
++    context 'providers_original_picture_idを検証するとき' do
++      it 'nullなら失敗する' do
++        @pop.providers_original_picture_id = nil
++        @pop.should_not be_valid
++      end
++      it '数値でなければ失敗する' do
++        @pop.providers_original_picture_id = 'a'
++        @pop.should_not be_valid
++      end
++    end
++    context 'demanders_original_picture_idを検証するとき' do
++      it 'nullなら失敗する' do
++        @pop.demanders_original_picture_id = nil
++        @pop.should_not be_valid
++      end
++      it '数値でなければ失敗する' do
++        @pop.demanders_original_picture_id = 'a'
++        @pop.should_not be_valid
++      end
++    end
++  end
++  
++  describe '対照表取得に於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @pop = FactoryGirl.create :provider_original_picture, :provider_id => @provider.id, :providers_original_picture_id => 2, :demanders_original_picture_id => @op.id
++    end
++    it '取得した対照表を返す' do
++      r = ProviderOriginalPicture.get_one @provider.id, 2
++      r.should be_true
++    end
++    it '該当する対照表が存在しなかったら、新規に興した対照表オブジェクトを返す' do
++      r = ProviderOriginalPicture.get_one @provider.id, 1
++      r.should be_a_new ProviderOriginalPicture
++      r = ProviderOriginalPicture.get_one 0, 2
++      r.should be_a_new ProviderOriginalPicture
++    end
++  end
++  
++  describe '貸手側原画同期に於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @pop = FactoryGirl.create :provider_original_picture, :provider_id => @provider.id, :providers_original_picture_id => 2, :demanders_original_picture_id => @op.id
++      @newpop = ProviderOriginalPicture.new
++    end
++    context '自身に原画がリンクしてないとき' do
++      before do
++      end
++      it '原画オブジェクトを新規に興す' do
++        lambda {
++          r = @newpop.modify_original_picture @op.attributes
++        }.should change OriginalPicture, :count
++      end
++    end
++    context '自身に原画がリンクしているとき' do
++      it '自身から原画を取得する' do
++        lambda {
++          r = @pop.modify_original_picture @op.attributes
++        }.should_not change OriginalPicture, :count
++      end
++    end
++    it '貸手側原画カラム値からカラム値をセットする 原画オブジェクトを保存する' do
++      r = @pop.modify_original_picture :filesize => 3346
++      @op.reload
++      @op.filesize.should eq 3346
++    end
++    it '原画オブジェクトを返す' do
++      r = @pop.modify_original_picture @op.attributes
++      r.should eq @op
++    end
++  end
++
++  describe '貸手側実素材同期に於いて' 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
++      @p2 = FactoryGirl.build :picture, :artist_id => @artist.id, :license_id => @license.id, :revision => 1,
++        :original_picture_id => @op.id
++    end
++    context '実素材が取得できないとき' do
++      before do
++      end
++      it '実素材オブジェクトを新規に興す' do
++        r = ProviderOriginalPicture.modify_picture @p2.attributes
++        r.should be_a_new Picture
++      end
++    end
++    context '実素材が取得できるとき' do
++      it '実素材に原画idRevision取得を依頼して、実素材を取得している' do
++        r = ProviderOriginalPicture.modify_picture @p.attributes
++        r.should_not be_a_new Picture
++        r.should eq @p
++      end
++    end
++    it '実素材にカラム値をセットする' do
++      r = ProviderOriginalPicture.modify_picture({:original_picture_id => @p.id, :revision => 0, :filesize => 3346})
++      r.filesize.should eq 3346
++    end
++    it '実素材を返す' do
++      r = ProviderOriginalPicture.modify_picture @p.attributes
++      r.should eq @p
++    end
++  end
++
++  describe '貸手側素材同期に於いて' 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
++      @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :original_picture_id => @op.id, :license_id => @license.id, :picture_id => @p.id
++      @attr = FactoryGirl.attributes_for :resource_picture, :artist_id => @artist.id, :original_picture_id => 111, :license_id => @license.id, :picture_id => @p.id, :filesize => 36225
++    end
++    context '素材が取得できないとき' do
++      before do
++      end
++      it '素材オブジェクトを新規に興す' do
++        r = ProviderOriginalPicture.modify_resource_picture @attr
++        r.should be_a_new ResourcePicture
++      end
++    end
++    context '素材が取得できるとき' do
++      it '素材に原画id取得を依頼して、素材を取得している' do
++        r = ProviderOriginalPicture.modify_resource_picture @rp.attributes
++        r.should_not be_a_new ResourcePicture
++        r.should eq @rp
++      end
++    end
++    it '素材にカラム値をセットする' do
++      r = ProviderOriginalPicture.modify_resource_picture @attr
++      r.filesize.should eq 36225
++    end
++    it '素材を返す' do
++      r = ProviderOriginalPicture.modify_resource_picture @rp.attributes
++      r.should eq @rp
++    end
++  end
++  
++  describe '絵師id置換に於いて' do
++    before do
++      @pa = FactoryGirl.create :provider_artist, :provider_id => @provider.id, :providers_artist_id => 5, :demanders_artist_id => @artist.id
++      @pa2 = FactoryGirl.create :provider_artist, :provider_id => @provider.id, :providers_artist_id => 3, :demanders_artist_id => @other_artist.id
++    end
++    context 'つつがなく終わるとき' do
++      before do
++      end
++      it 'trueを返す' do
++        @attr5 = {'artist_id' => 5}
++        r = ProviderOriginalPicture.replace_artist @provider.id, @attr5
++        r.should be_true
++      end
++      it 'カラム値の絵師idを借手側の絵師のidで置き換える' do
++        @attr5 = {'artist_id' => 5}
++        r = ProviderOriginalPicture.replace_artist @provider.id, @attr5
++        @attr5['artist_id'].should eq @artist.id
++        @attr3 = {'artist_id' => 3}
++        r = ProviderOriginalPicture.replace_artist @provider.id, @attr3
++        @attr3['artist_id'].should eq @other_artist.id
++      end
++    end
++    context '借手側の絵師がなかったとき' do
++      before do
++      end
++      it 'falseを返す' do
++        @attr = {'artist_id' => 1}
++        r = ProviderOriginalPicture.replace_artist @provider.id, @attr
++        r.should be_false
++      end
++    end
++  end
++  
++  describe 'ライセンスid置換に於いて' do
++    before do
++      @other_license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id, :url => 'http://other.license', :name => 'other_license'
++      @pl = FactoryGirl.create :provider_license, :provider_id => @provider.id, :providers_license_id => 4, :demanders_license_id => @license.id
++      @pl2 = FactoryGirl.create :provider_license, :provider_id => @provider.id, :providers_license_id => 2, :demanders_license_id => @other_license.id
++    end
++    context 'つつがなく終わるとき' do
++      before do
++      end
++      it 'trueを返す' do
++        @attr5 = {'license_id' => 4}
++        r = ProviderOriginalPicture.replace_license @provider.id, @attr5
++        r.should be_true
++      end
++      it 'カラム値のライセンスidを借手側のライセンスのidで置き換える' do
++        @attr4 = {'license_id' => 4}
++        r = ProviderOriginalPicture.replace_license @provider.id, @attr4
++        @attr4['license_id'].should eq @license.id
++        @attr2 = {'license_id' => 2}
++        r = ProviderOriginalPicture.replace_license @provider.id, @attr2
++        @attr2['license_id'].should eq @other_license.id
++      end
++    end
++    context '借手側のライセンスがなかったとき' do
++      before do
++      end
++      it 'falseを返す' do
++        @attr = {'license_id' => 1}
++        r = ProviderOriginalPicture.replace_license @provider.id, @attr
++        r.should be_false
++      end
++    end
++  end
++  
++  describe '原画id置換に於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @other_op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @pop = FactoryGirl.create :provider_original_picture, :provider_id => @provider.id, :providers_original_picture_id => 6, :demanders_original_picture_id => @op.id
++      @pop2 = FactoryGirl.create :provider_original_picture, :provider_id => @provider.id, :providers_original_picture_id => 9, :demanders_original_picture_id => @other_op.id
++    end
++    context 'つつがなく終わるとき' do
++      before do
++      end
++      it 'trueを返す' do
++        @attr6 = {'original_picture_id' => 6}
++        r = ProviderOriginalPicture.replace_original_picture @provider.id, @attr6
++        r.should be_true
++      end
++      it 'カラム値の原画idを借手側の原画のidで置き換える' do
++        @attr6 = {'original_picture_id' => 6}
++        r = ProviderOriginalPicture.replace_original_picture @provider.id, @attr6
++        @attr6['original_picture_id'].should eq @op.id
++        @attr9 = {'original_picture_id' => 9}
++        r = ProviderOriginalPicture.replace_original_picture @provider.id, @attr9
++        @attr9['original_picture_id'].should eq @other_op.id
++      end
++    end
++    context '借手側の原画がなかったとき' do
++      before do
++      end
++      it 'falseを返す' do
++        @attr = {'original_picture_id' => 1}
++        r = ProviderOriginalPicture.replace_original_picture @provider.id, @attr
++        r.should be_false
++      end
++    end
++  end
++  
++  describe '原画インポートに於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @other_op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++    end
++    context '事前チェックする' do
++      before do
++        ProviderOriginalPicture.stub(:get_one).with(any_args).and_return(ProviderOriginalPicture.new)
++        ProviderOriginalPicture.any_instance.stub(:modify_original_picture).with(any_args).and_return(@op)
++        ProviderOriginalPicture.any_instance.stub(:save).with(any_args).and_return(true)
++      end
++      it '対照表取得を問い合わせている' do
++        ProviderOriginalPicture.should_receive(:get_one).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++      end
++      it '対照表に原画同期を依頼してしている' do
++        ProviderOriginalPicture.any_instance.should_receive(:modify_original_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++      end
++      it '対照表オブジェクトを保存している' do
++        ProviderOriginalPicture.any_instance.should_receive(:save).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++      end
++    end
++    context 'つつがなく終わるとき' do
++      it '空っぽの配列を返す' do
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++        r.should be_empty
++      end
++      it '対照表が追加される' do
++        lambda {
++          r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++        }.should change ProviderOriginalPicture, :count
++      end
++    end
++    context '複数インポートのとき' do
++      it '空っぽの配列を返す' do
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes, @other_op.attributes]
++        r.should be_empty
++      end
++      it '対照表が追加される' do
++        lambda {
++          r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes, @other_op.attributes]
++        }.should change(ProviderOriginalPicture, :count).by(2)
++      end
++    end
++    #警告ケース
++    context '対照表オブジェクトの保存に失敗したとき' do
++      before do
++        ProviderOriginalPicture.any_instance.stub(:save).with(any_args).and_return(false)
++      end
++     it '結果に貸手側原画のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++        r.should_not be_empty
++      end
++    end
++    context '原画オブジェクトの保存に失敗したとき' do
++      before do
++        OriginalPicture.any_instance.stub(:save).with(any_args).and_return(false)
++      end
++      it '結果に貸手側原画のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_original_picture @provider.id, [@op.attributes]
++        r.should_not be_empty
++      end
++    end
++  end
++  
++  describe '実素材インポートに於いて' do
++    before do
++      @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
++      @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
++      @imager = ImagerTest.load "abc\ndef\nghi"
++      @attr = @p.attributes
++      @attr['picture_data'] =  "abc\ndef\nghi"
++    end
++    context '事前チェックする' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        Base64.stub(:decode64).with(any_args).and_return("abc\ndef\nghi")
++        PettanImager.stub(:load).with("abc\ndef\nghi").and_return(@imager)
++        ProviderOriginalPicture.stub(:modify_picture).with(any_args).and_return(@p)
++        Picture.any_instance.stub(:store).with(any_args).and_return(true)
++      end
++      it '原画id置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_original_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it '絵師id置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_artist).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it 'ライセンスid置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_license).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it '画像データをデコードしている' do
++        Base64.should_receive(:decode64).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it '画像ライブラリにロードを依頼している' do
++        PettanImager.should_receive(:load).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it '対照表モデルに貸手側実素材同期を依頼している' do
++        ProviderOriginalPicture.should_receive(:modify_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++      it '実素材を保存している' do
++        Picture.any_instance.should_receive(:store).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++      end
++    end
++    context 'つつがなく終わるとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        Base64.stub(:decode64).with(any_args).and_return("abc\ndef\nghi")
++        PettanImager.stub(:load).with("abc\ndef\nghi").and_return(@imager)
++        @newp = FactoryGirl.build :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id, :revision => 1
++        @newattr = @newp.attributes
++        @newattr['picture_data'] =  "abc\ndef\nghi"
++      end
++      it '空っぽの配列を返す' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@newattr]
++        r.should be_empty
++      end
++      it '実素材が追加される' do
++        lambda {
++          r = ProviderOriginalPicture.import_picture @provider.id, [@newattr]
++        }.should change Picture, :count
++      end
++    end
++    #警告ケース
++    context '原画id置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(false)
++      end
++      it '結果に実素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '絵師id置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(false)
++      end
++      it '結果に実素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context 'ライセンスid置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(false)
++      end
++      it '結果に実素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '画像ライブラリのロードに失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        PettanImager.stub(:load).with(any_args).and_return(false)
++      end
++      it '結果に実素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '実素材の保存に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        PettanImager.stub(:load).with(any_args).and_return(@imager)
++        ProviderOriginalPicture.stub(:modify_picture).with(any_args).and_return(@p)
++        Picture.any_instance.stub(:store).with(any_args).and_return(false)
++      end
++      it '結果に実素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    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
++      rpattr = {:original_picture_id => @op.id, :picture_id => @p.id, :license_id => @license.id, :artist_id => @artist.id, :artist_name => 'tester', 
++        :credit => '{}', :settings => {:reverse => 1, :gif_convert => 1}.to_json.to_s}
++      @rp = FactoryGirl.create :resource_picture, rpattr
++      @imager = ImagerTest.load "abc\ndef\nghi"
++      @attr = @op.attributes
++      @attr['resource_picture'] =  @rp.attributes
++      @attr['resource_picture']['picture_data'] =  "abc\ndef\nghi"
++    end
++    context '事前チェックする' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        Base64.stub(:decode64).with(any_args).and_return("abc\ndef\nghi")
++        PettanImager.stub(:load).with("abc\ndef\nghi").and_return(@imager)
++        ProviderOriginalPicture.stub(:modify_resource_picture).with(any_args).and_return(@rp)
++        ResourcePicture.any_instance.stub(:store).with(any_args).and_return(true)
++      end
++      it '原画id置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_original_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it '絵師id置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_artist).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it 'ライセンスid置換を依頼している' do
++        ProviderOriginalPicture.should_receive(:replace_license).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it '画像データをデコードしている' do
++        Base64.should_receive(:decode64).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it '画像ライブラリにロードを依頼している' do
++        PettanImager.should_receive(:load).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it '対照表モデルに貸手側素材同期を依頼している' do
++        ProviderOriginalPicture.should_receive(:modify_resource_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++      it '素材を保存している' do
++        ResourcePicture.any_instance.should_receive(:store).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++      end
++    end
++    context 'つつがなく終わるとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        Base64.stub(:decode64).with(any_args).and_return("abc\ndef\nghi")
++        PettanImager.stub(:load).with("abc\ndef\nghi").and_return(@imager)
++        @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id
++        @p2 = FactoryGirl.create :picture, :artist_id => @artist.id, :original_picture_id => @op2.id, :license_id => @license.id, :revision => 0
++        newrpattr = {:original_picture_id => @op2.id, :picture_id => @p2.id, :license_id => @license.id, :artist_id => @artist.id, :artist_name => 'tester', 
++          :credit => '{}', :settings => {:reverse => 1, :gif_convert => 1, :thumbnail => 0}.to_json.to_s}
++        @rp2 = FactoryGirl.build :resource_picture, newrpattr
++        @newattr = @op2.attributes
++        @newattr['resource_picture'] =  @rp2.attributes
++        @newattr['resource_picture']['picture_data'] =  "abc\ndef\nghi"
++      end
++      it '空っぽの配列を返す' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@newattr]
++        r.should be_empty
++      end
++      it '素材が追加される' do
++        lambda {
++          r = ProviderOriginalPicture.import_resource_picture @provider.id, [@newattr]
++        }.should change ResourcePicture, :count
++      end
++    end
++    #警告ケース
++    context '原画id置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(false)
++      end
++      it '結果に素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '絵師id置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(false)
++      end
++      it '結果に素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context 'ライセンスid置換に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(false)
++      end
++      it '結果に素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '画像ライブラリのロードに失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        PettanImager.stub(:load).with(any_args).and_return(false)
++      end
++      it '結果に素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    end
++    context '素材の保存に失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:replace_original_picture).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_artist).with(any_args).and_return(true)
++        ProviderOriginalPicture.stub(:replace_license).with(any_args).and_return(true)
++        PettanImager.stub(:load).with(any_args).and_return(@imager)
++        ProviderOriginalPicture.stub(:modify_resource_picture).with(any_args).and_return(@rp)
++        ResourcePicture.any_instance.stub(:store).with(any_args).and_return(false)
++      end
++      it '結果に素材のカラム値を追加している' do
++        r = ProviderOriginalPicture.import_resource_picture @provider.id, [@attr]
++        r.should_not be_empty
++      end
++    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
++      @opattr = @op.attributes
++      @pattr = @p.attributes
++      @pattr['picture_data'] =  "abc\ndef\nghi"
++      @rpattr = {:original_picture_id => @op.id, :picture_id => @p.id, :license_id => @license.id, :artist_id => @artist.id, :artist_name => 'tester', 
++        :credit => '{}', :settings => {:reverse => 1, :gif_convert => 1}.to_json.to_s}
++      @opattr['resource_picture'] =  @rpattr
++      @opattr['resource_picture']['picture_data'] =  "abc\ndef\nghi"
++    end
++    context '事前チェックする' do
++      before do
++        ProviderOriginalPicture.stub(:import_original_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_resource_picture).with(any_args).and_return([])
++      end
++      it '自身に原画インポートを依頼している' do
++        ProviderOriginalPicture.should_receive(:import_original_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++      end
++      it '自身に実素材インポートを依頼している' do
++        ProviderOriginalPicture.should_receive(:import_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++      end
++      it '自身に素材インポートを依頼している' do
++        ProviderOriginalPicture.should_receive(:import_resource_picture).with(any_args).exactly(1)
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++      end
++    end
++    context 'つつがなく終わるとき' do
++      before do
++        ProviderOriginalPicture.stub(:import_original_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_resource_picture).with(any_args).and_return([])
++      end
++      it '各失敗したカラム値をHashで返す' do
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++        r[:original_pictures].should be_empty
++        r[:pictures].should be_empty
++        r[:resource_pictures].should be_empty
++      end
++    end
++    #警告ケース
++    context '原画インポートに失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:import_original_picture).with(any_args).and_return([@opattr])
++        ProviderOriginalPicture.stub(:import_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_resource_picture).with(any_args).and_return([])
++      end
++      it '失敗した原画のカラム値を配列でoriginal_picturesに追加している' do
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++        r[:original_pictures].should_not be_empty
++        r[:pictures].should be_empty
++        r[:resource_pictures].should be_empty
++      end
++    end
++    context '実素材インポートに失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:import_original_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_picture).with(any_args).and_return([@pattr])
++        ProviderOriginalPicture.stub(:import_resource_picture).with(any_args).and_return([])
++      end
++      it '失敗した原画のカラム値を配列でpicturesに追加している' do
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++        r[:original_pictures].should be_empty
++        r[:pictures].should_not be_empty
++        r[:resource_pictures].should be_empty
++      end
++    end
++    context '素材インポートに失敗したとき' do
++      before do
++        ProviderOriginalPicture.stub(:import_original_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_picture).with(any_args).and_return([])
++        ProviderOriginalPicture.stub(:import_resource_picture).with(any_args).and_return([@rpattr])
++      end
++      it '失敗した原画のカラム値を配列でresource_picturesに追加している' do
++        r = ProviderOriginalPicture.import @provider.id, [@opattr], [@pattr]
++        r[:original_pictures].should be_empty
++        r[:pictures].should be_empty
++        r[:resource_pictures].should_not be_empty
++      end
++    end
++  end
++  
++
++end