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
--- /dev/null
--- /dev/null
++class ProviderOriginalPicturesController < ApplicationController
++end
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
--- /dev/null
--- /dev/null
++module ProviderOriginalPicturesHelper
++end
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
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
--- /dev/null
+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
--- /dev/null
--- /dev/null
++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
<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>
<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
--- /dev/null
--- /dev/null
++<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>
receive_announce: 借受するには借手となって借受申請する。
receive_start: この貸手からの借受を開始する
receive_stop: 借受を停止する
+ licenses_import: ライセンスをインポートする
++ artists_import: 絵師をインポートする
++ original_pictures_import: 素材をインポートする
new:
title: 借受状況登録
edit:
get :edit
put :update
delete :destroy
+ post :licenses_import
+ post :artists_import
++ post :original_pictures_import
end
end
resources :demanders do
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++require 'spec_helper'
++
++describe ProviderOriginalPicturesController do
++
++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/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
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
--- /dev/null
--- /dev/null
++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
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
--- /dev/null
--- /dev/null
++# -*- 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