pic
end
+ def self.edit cid, artist, opt = {}
+ pic = OriginalPicture.find(cid, :include => self.show_include_opt(opt))
+ raise ActiveRecord::Forbidden unless pic.own?(artist)
+ pic
+ end
+
def self.show_include_opt opt = {}
- res = [:license, :resource_picture]
- res.push(opt[:include]) if opt[:include]
+ res = {:resource_picture => {}}
+ res.merge!(opt[:include]) if opt[:include]
res
end
belongs_to :panel
belongs_to :resource_picture
- validates :panel_id, :presence => true, :numericality => true, :existence => true
+ validates :panel_id, :numericality => {:allow_blank => true}
- validates :resource_picture_id, :presence => true, :numericality => true, :existence => true
validates :link, :length => {:maximum => 200}
validates :x, :presence => true, :numericality => true
validates :y, :presence => true, :numericality => true
<h1>Listing resource_pictures</h1>
<% @resource_pictures.each do |resource_picture| %>
+ <% @resource_picture = resource_picture %>
<div>
- <%= resource_picture.filename %>
- <img src="<%= resource_picture.url('thumbnail') -%>">
+ <%= link_to resource_picture.filename, resource_picture_path(resource_picture) %>
- <img src="<%= resource_picture.url('thumbnail') -%>">
++ <img src="<%= resource_picture.url -%>">
<%= resource_picture.width %>x<%= resource_picture.height %>
<%= resource_picture.filesize %>bytes
- 画:<%= h resource_picture.original_picture.artist.name %>
+ <%= render resource_picture.credit_template %>
</div>
<% end %>
get :list
get :browse
end
- member do
- end
end
resources :original_pictures do
+ new do
+ get :new
+ end
collection do
get :index
get :show
--- /dev/null
- "auth_token": "Qr2cveaLKqMHA8dME7CN"\r
+ {\r
+ "comic": {\r
+ "title": "コミック作るテスト",\r
+ "width": 400,\r
+ "height": 200,\r
+ "visible": 3\r
+ },\r
++ "auth_token": "vX7rc33zxVJSQPKjp2vc"\r
+ }
--- /dev/null
- "auth_token": "Qr2cveaLKqMHA8dME7CN"\r
+ {\r
+ "original_picture": {\r
+ "file": \r
+ "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" },\r
++ "auth_token": "vX7rc33zxVJSQPKjp2vc"\r
+ }
--- /dev/null
- "auth_token": "Qr2cveaLKqMHA8dME7CN"\r
+ {\r
+ "panel": {\r
+ "width": 400,\r
+ "height": 200,\r
+ "border": 1,\r
+ "x": 0,\r
+ "y": 0,\r
+ "z": 1,\r
+ "publish": 1,\r
+ "panel_pictures_attributes": {\r
+ "new1": {\r
+ "resource_picture_id": 3,\r
+ "x": 10,\r
+ "y": 135,\r
+ "z": 3,\r
+ "t": 0,\r
+ "width": 100,\r
+ "height": 103\r
+ }\r
+ }\r
+ },\r
++ "auth_token": "vX7rc33zxVJSQPKjp2vc"\r
+ }
--- /dev/null
- "auth_token": "Qr2cveaLKqMHA8dME7CN"\r
+ {\r
+ "story": {\r
+ "comic_id": 1,\r
+ "panel_id": 1\r
+ },\r
++ "auth_token": "vX7rc33zxVJSQPKjp2vc"\r
+ }
# -*- encoding: utf-8 -*-\r
-require 'spec_helper'\r
-\r
-describe ComicsController do\r
- before do\r
- Factory :admin\r
- @license = Factory :license\r
+require 'spec_helper'
+
+describe ComicsController do
+ before do
+ Factory :admin
+ @sp = Factory :system_picture
+ @lg = Factory :license_group
+ @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
@user = Factory :user_yas\r
- @author = @user.author #ユーザ作成時に連動して作成される
- end
-
- describe '一覧表示に於いて' do
- before do
- @comic = Factory :normal_comic, :author_id => @user.author.id
- Comic.stub(:list).and_return([@comic, @comic, @comic])
- sign_in @user
- end
- context '事前チェックする' do
- it '与えられたpageがセットされている' do
- get :index, :page => 5
- assigns(:page).should eq 5
- end
- it '省略されると@pageに1値が入る' do
- get :index
- assigns(:page).should eq 1
- end
- it '与えられたpage_sizeがセットされている' do
- get :index, :page_size => 15
- assigns(:page_size).should eq 15
- end
- it '省略されると@page_sizeにデフォルト値が入る' do
- get :index
+ @author = @user.author #ユーザ作成時に連動して作成される\r
+ end\r
+ \r
+ describe '一覧表示に於いて' do\r
+ before do\r
+ @comic = Factory :comic, :author_id => @user.author.id\r
+ Comic.stub(:list).and_return([@comic, @comic, @comic])\r
+ sign_in @user\r
+ end\r
+ context '事前チェックする' do\r
+ it '与えられたpageがセットされている' do\r
+ get :index, :page => 5\r
+ assigns(:page).should eq 5\r
+ end\r
+ it '省略されると@pageに1値が入る' do\r
+ get :index\r
+ assigns(:page).should eq 1\r
+ end\r
+ it '与えられたpage_sizeがセットされている' do\r
+ get :index, :page_size => 15\r
+ assigns(:page_size).should eq 15\r
+ end\r
+ it '省略されると@page_sizeにデフォルト値が入る' do\r
+ get :index\r
+ assigns(:page_size).should eq Comic.default_page_size\r
+ end\r
+ it '最大を超えると@page_sizeにデフォルト最大値が入る' do\r
+ get :index, :page_size => 1500\r
+ assigns(:page_size).should eq Comic.max_page_size\r
+ end\r
+ it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do\r
+ get :index, :page_size => 0\r
assigns(:page_size).should eq Comic.default_page_size\r
- end
- it '最大を超えると@page_sizeにデフォルト最大値が入る' do
- get :index, :page_size => 1500
- assigns(:page_size).should eq Comic.max_page_size
- end
- it '不正な値が入ると@page_sizeにデフォルト最大値が入る' do
- get :index, :page_size => 0
- assigns(:page_size).should eq Comic.default_page_size
- end
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :index
- response.should be_success
- end
- it 'コミックモデルに一覧を問い合わせている' do
+ end\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ get :index\r
+ response.should be_success \r
+ end\r
+ it 'コミックモデルに一覧を問い合わせている' do\r
Comic.should_receive(:list).exactly(1)\r
- get :index
- end
- it '@comicsにリストを取得している' do
- get :index
- assigns(:comics).should have_at_least(3).items
- end
- context 'html形式' do
- it 'indexテンプレートを描画する' do
- get :index
- response.should render_template("index")
- end
- end
- context 'json形式' do
- it 'jsonデータを返す' do
- get :index, :format => :json
- lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
- end
- it 'データがリスト構造になっている' do
- get :index, :format => :json
+ get :index\r
+ end\r
+ it '@comicsにリストを取得している' do\r
+ get :index\r
+ assigns(:comics).should have_at_least(3).items\r
+ end\r
+ context 'html形式' do\r
+ it 'indexテンプレートを描画する' do\r
+ get :index\r
+ response.should render_template("index")\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'jsonデータを返す' do\r
+ get :index, :format => :json\r
+ lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
+ end\r
+ it 'データがリスト構造になっている' do\r
+ get :index, :format => :json\r
+ json = JSON.parse response.body\r
+ json.should have_at_least(3).items\r
+ end\r
+ it 'リストの先頭くらいはコミックっぽいものであって欲しい' do\r
+ get :index, :format => :json\r
json = JSON.parse response.body\r
- json.should have_at_least(3).items
- end
- it 'リストの先頭くらいはコミックっぽいものであって欲しい' do
- get :index, :format => :json
- json = JSON.parse response.body
- json.first.has_key?("title").should be_true
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- get :index
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- get :index
- response.should redirect_to '/users/sign_in'
- end
- end
- context 'json形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- get :index, :format => :json
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
+ json.first.has_key?("title").should be_true\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ get :index\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ get :index\r
+ response.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
get :index, :format => :json\r
- response.message.should match(/Unauthorized/)
- end
- end
- end
- end
-
- describe '単体表示に於いて' do
- before do
- @comic = Factory :normal_comic, :author_id => @user.author.id
- Comic.stub(:show).and_return(@comic)
- sign_in @user
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :show, :id => @comic.id
- response.should be_success
- end
- it 'コミックモデルに単体取得を問い合わせている' do
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ get :index, :format => :json\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe '単体表示に於いて' do\r
+ before do\r
+ @comic = Factory :comic, :author_id => @user.author.id, :title => 'normal'\r
+ Comic.stub(:show).and_return(@comic)\r
+ sign_in @user\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ get :show, :id => @comic.id\r
+ response.should be_success\r
+ end\r
+ it 'コミックモデルに単体取得を問い合わせている' do\r
Comic.should_receive(:show).exactly(1)\r
- get :show
- end
- it '@comicにアレを取得している' do
- get :show, :id => @comic.id
- assigns(:comic).id.should eq(@comic.id)
- end
- context 'html形式' do
- it 'showテンプレートを描画する' do
- get :show, :id => @comic.id
- response.should render_template("show")
- end
- end
- context 'json形式' do
- it 'jsonデータを返す' do
- get :show, :id => @comic.id, :format => :json
- lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
- end
- it 'データがアレになっている' do
- get :show, :id => @comic.id, :format => :json
- json = JSON.parse response.body
- json["title"].should match(/normal/)
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- get :show, :id => @comic.id
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- get :show, :id => @comic.id
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'json形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- get :show, :id => @comic.id, :format => :json
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
- get :show, :id => @comic.id, :format => :json
- response.message.should match(/Unauthorized/)
- end
- end
- end
- =begin
- context '対象コミックがないとき' do
- context 'html形式' do
- it '例外404 not_foundを返す' do
+ get :show\r
+ end\r
+ it '@comicにアレを取得している' do\r
+ get :show, :id => @comic.id\r
+ assigns(:comic).id.should eq(@comic.id)\r
+ end\r
+ context 'html形式' do\r
+ it 'showテンプレートを描画する' do\r
+ get :show, :id => @comic.id\r
+ response.should render_template("show")\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'jsonデータを返す' do\r
+ get :show, :id => @comic.id, :format => :json\r
+ lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
+ end\r
+ it 'データがアレになっている' do\r
+ get :show, :id => @comic.id, :format => :json\r
+ json = JSON.parse response.body\r
+ json["title"].should match(/normal/)\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ get :show, :id => @comic.id\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ get :show, :id => @comic.id\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
+ get :show, :id => @comic.id, :format => :json\r
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ get :show, :id => @comic.id, :format => :json\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ =begin\r
+ context '対象コミックがないとき' do\r
+ context 'html形式' do\r
+ it '例外404 not_foundを返す' do\r
lambda{\r
- get :show, :id => 0
- }.should raise_error(ActiveRecord::RecordNotFound)
- end
- end
- context 'json形式' do
- it '例外404 not_foundを返す' do
+ get :show, :id => 0\r
+ }.should raise_error(ActiveRecord::RecordNotFound)\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it '例外404 not_foundを返す' do\r
lambda{ \r
- get :show, :id => 0, :format => :json
- }.should raise_error(ActiveRecord::RecordNotFound)
- end
- end
- end
- context '非公開コミックを見ようとしたとき' do
- context 'html形式' do
- it '例外403 forbiddenを返す' do
- Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
- hidden = Factory :hidden_comic, :author_id => @author.id
+ get :show, :id => 0, :format => :json\r
+ }.should raise_error(ActiveRecord::RecordNotFound)\r
+ end\r
+ end\r
+ end\r
+ context '非公開コミックを見ようとしたとき' do\r
+ context 'html形式' do\r
+ it '例外403 forbiddenを返す' do\r
+ Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
+ hidden = Factory :hidden_comic, :author_id => @author.id\r
lambda{\r
- get :show, :id => hidden
- }.should raise_error(ActiveRecord::Forbidden)
- end
- end
- context 'json形式' do
- it '例外403 forbiddenを返す' do
- Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)
- hidden = Factory :hidden_comic, :author_id => @author.id
+ get :show, :id => hidden\r
+ }.should raise_error(ActiveRecord::Forbidden)\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it '例外403 forbiddenを返す' do\r
+ Comic.any_instance.stub(:visible?).with(any_args()).and_return(false)\r
+ hidden = Factory :hidden_comic, :author_id => @author.id\r
lambda{\r
- get :show, :id => hidden, :format => :json
- }.should raise_error(ActiveRecord::Forbidden)
- end
- end
- end
- =end
- end
- describe '閲覧に於いて' do
- before do
- @comic = Factory :normal_comic, :author_id => @user.author.id
- Comic.stub(:show).and_return(@comic)
- sign_in @user
- end
- context '事前チェックする' do
- before do
- Panel.stub(:count).and_return(10)
- end
- it '与えられたoffsetがセットされている' do
- get :play, :id => @comic.id, :offset => 7
- assigns(:offset).should eq 7
- end
- it '省略されると@offsetに0値が入る' do
- get :play, :id => @comic.id
- assigns(:offset).should eq 0
- end
- it 'コマ数以上が与えられるとコマ数-1が入る' do
- get :play, :id => @comic.id, :offset => 10
- assigns(:offset).should eq 9
- end
- it '負の値が与えられると末尾(コマ数)からさかのぼった値が入る' do
- get :play, :id => @comic.id, :offset => -3
- assigns(:offset).should eq 7
- end
- it 'コマ数以上の負の値が与えられると計算できないので0値が入る' do
- get :play, :id => @comic.id, :offset => -13
- assigns(:offset).should eq 0
- end
- it '与えられたcountがセットされている' do
- get :play, :id => @comic.id, :count => 18
- assigns(:panel_count).should eq 18
- end
- it '省略されると@countにデフォルト値が入る' do
- get :play, :id => @comic.id
- assigns(:panel_count).should eq Comic.default_panel_size\r
- end
- it '最大を超えると@countにデフォルト最大値が入る' do
- get :play, :id => @comic.id, :count => 1500
- assigns(:panel_count).should eq Comic.max_panel_size
- end
- it '不正な値が入ると@countにデフォルト最大値が入る' do
- get :play, :id => @comic.id, :page_size => 0
- assigns(:panel_count).should eq Comic.default_panel_size
- end
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :play, :id => @comic.id
- response.should be_success
- end
- it 'コミックモデルに単体取得を問い合わせている' do
- Comic.should_receive(:show).exactly(1)\r
- get :play, :id => @comic.id
- end
- it '@comicにアレを取得している' do
- get :play, :id => @comic.id
- assigns(:comic).id.should eq(@comic.id)
- end
- context 'html形式' do
- it 'playテンプレートを描画する' do
- get :play, :id => @comic.id
- response.should render_template("play")
- end
- end
- context 'json形式' do
- it 'jsonデータを返す' do
- get :play, :id => @comic.id, :format => :json
- lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
- end
- it 'データがアレになっている' do
- get :play, :id => @comic.id, :format => :json
- json = JSON.parse response.body
- json["title"].should match(/normal/)
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- get :play, :id => @comic.id
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- get :play, :id => @comic.id
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'json形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- get :play, :id => @comic.id, :format => :json
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
- get :play, :id => @comic.id, :format => :json
- response.message.should match(/Unauthorized/)
- end
- end
- end
- end
-
- describe 'コミック数取得に於いて' do
- before do
- Comic.should_receive(:visible_count).and_return(3)
- # sign_in @user
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :count, :format => :json
- response.should be_success
- end
- context 'json形式' do
- it 'jsonデータを返す' do
- get :count, :format => :json
- lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
- end
- it 'データがHash構造になっていてコミック数が1である' do
- get :count, :format => :json
- json = JSON.parse response.body
- json["count"].should == 3
- end
- end
- end
- end
-
- describe '新規作成フォーム表示に於いて' do
- before do
- sign_in @user
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :new
- response.should be_success
- end
- it '@comicに新規データを用意している' do
- get :new
- assigns(:comic).should be_a_new(Comic)
- end
- it 'コミックモデルにデフォルト値補充を依頼している' do
+ get :show, :id => hidden, :format => :json\r
+ }.should raise_error(ActiveRecord::Forbidden)\r
+ end\r
+ end\r
+ end\r
+ =end\r
+ end\r
+ describe 'コミック数取得に於いて' do\r
+ before do\r
+ Comic.should_receive(:visible_count).and_return(3)\r
+ # sign_in @user\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ get :count, :format => :json\r
+ response.should be_success \r
+ end\r
+ context 'json形式' do\r
+ it 'jsonデータを返す' do\r
+ get :count, :format => :json\r
+ lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
+ end\r
+ it 'データがHash構造になっていてコミック数が1である' do\r
+ get :count, :format => :json\r
+ json = JSON.parse response.body\r
+ json["count"].should == 3\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe '新規作成フォーム表示に於いて' do\r
+ before do\r
+ sign_in @user\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ get :new\r
+ response.should be_success \r
+ end\r
+ it '@comicに新規データを用意している' do\r
+ get :new\r
+ assigns(:comic).should be_a_new(Comic)\r
+ end\r
+ it 'コミックモデルにデフォルト値補充を依頼している' do\r
Comic.any_instance.should_receive(:supply_default).exactly(1)\r
- get :new
- end
- context 'html形式' do
- it 'newテンプレートを描画する' do
- get :new
- response.should render_template("new")
- end
- end
- context 'js形式' do
- it 'new.jsテンプレートを描画する' do
- get :new, :format => :js
- response.should render_template("new")
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- get :new
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- get :new
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'js形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- get :new, :format => :js
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
- get :new, :format => :js
- response.message.should match(/Unauthorized/)
- end
- end
- end
- end
-
- describe '新規作成に於いて' do
- before do
- sign_in @user
- end
- context 'つつがなく終わるとき' do
- it 'モデルに保存依頼する' do
- Comic.any_instance.should_receive(:save).exactly(1)
- post :create, :comic => Factory.attributes_for(:normal_comic)
- end
- it "@comicに作成されたコミックを保持していて、それがDBにある" do
- post :create, :comic => Factory.attributes_for(:normal_comic)
- assigns(:comic).should be_a(Comic)
- assigns(:comic).should be_persisted
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- Comic.any_instance.stub(:save).and_return(true)
- post :create, :comic => Factory.attributes_for(:normal_comic)
- response.status.should eq 302
- end
- it '作成されたコミックの表示ページへ遷移する' do
- # Comic.any_instance.stub(:save).and_return(true)
- post :create, :comic => Factory.attributes_for(:normal_comic)
- response.should redirect_to(Comic.last)
- end
- end
- context 'json形式' do
- it 'ステータスコード200 OKを返す' do
- # Comic.any_instance.stub(:save).and_return(true)
- post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
- response.should be_success
- end
- it '作成されたコミックをjsonデータで返す' do
- post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
- lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
- end
- it 'データがアレになっている' do
- post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
- json = JSON.parse response.body
- json["title"].should match(/normal/)
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- post :create, :comic => Factory.attributes_for(:normal_comic)
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- post :create, :comic => Factory.attributes_for(:normal_comic)
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'json形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
- post :create, :comic => Factory.attributes_for(:normal_comic), :format => :json
- response.message.should match(/Unauthorized/)
- end
- end
- end
- context '検証、保存に失敗した' do
- before do
- Comic.any_instance.stub(:save).and_return(false)
- end
- it "未保存のコミックを保持している" do
- post :create, :comic => {}
- assigns(:comic).should be_a_new(Comic)
- end
- context 'html形式' do
- it 'ステータスコード200 OKを返す' do
- post :create, :comic => {}
- response.status.should eq 200
- end
- it '新規ページを描画する' do
- post :create, :comic => {}
- response.should render_template("new")
- end
- end
- context 'json形式' do
- it 'ステータスコード422 unprocessable_entity を返す' do
- post :create, :comic => {}, :format => :json
- response.status.should eq 422
- end
- it '応答メッセージUnprocessable Entityを返す' do
- post :create, :comic => {}, :format => :json
- response.message.should match(/Unprocessable/)
- end
- end
- end
- end
-
- describe '編集フォーム表示に於いて' do
- before do
- @comic = Factory :normal_comic, :author_id => @user.author.id
- sign_in @user
- Comic.stub(:show).and_return(@comic)
- end
- context 'つつがなく終わるとき' do
- it 'ステータスコード200 OKを返す' do
- get :edit, :id => @comic.id
- response.should be_success
- end
- it 'コミックモデルに単体取得を問い合わせている' do
+ get :new\r
+ end\r
+ context 'html形式' do\r
+ it 'newテンプレートを描画する' do\r
+ get :new\r
+ response.should render_template("new")\r
+ end\r
+ end\r
+ context 'js形式' do\r
+ it 'new.jsテンプレートを描画する' do\r
+ get :new, :format => :js\r
+ response.should render_template("new")\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ get :new\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ get :new\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'js形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
+ get :new, :format => :js\r
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ get :new, :format => :js\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe '新規作成に於いて' do\r
+ before do\r
+ sign_in @user\r
+ @attr = Factory.attributes_for(:comic, :author_id => @author.id, :title => 'normal')\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'モデルに保存依頼する' do\r
+ Comic.any_instance.should_receive(:save).exactly(1)\r
+ post :create, :comic => @attr\r
+ end\r
+ it "@comicに作成されたコミックを保持していて、それがDBにある" do\r
+ post :create, :comic => @attr\r
+ assigns(:comic).should be_a(Comic)\r
+ assigns(:comic).should be_persisted\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ Comic.any_instance.stub(:save).and_return(true)\r
+ post :create, :comic => @attr\r
+ response.status.should eq 302\r
+ end\r
+ it '作成されたコミックの表示ページへ遷移する' do\r
+ # Comic.any_instance.stub(:save).and_return(true)\r
+ post :create, :comic => @attr\r
+ response.should redirect_to(Comic.last)\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ # Comic.any_instance.stub(:save).and_return(true)\r
+ post :create, :comic => @attr, :format => :json\r
+ response.should be_success \r
+ end\r
+ it '作成されたコミックをjsonデータで返す' do\r
+ post :create, :comic => @attr, :format => :json\r
+ lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)\r
+ end\r
+ it 'データがアレになっている' do\r
+ post :create, :comic => @attr, :format => :json\r
+ json = JSON.parse response.body\r
+ json["title"].should match(/normal/)\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ post :create, :comic => @attr\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ post :create, :comic => @attr\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
+ post :create, :comic => @attr, :format => :json\r
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ post :create, :comic => @attr, :format => :json\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ context '検証、保存に失敗した' do\r
+ before do\r
+ Comic.any_instance.stub(:save).and_return(false)\r
+ end\r
+ it "未保存のコミックを保持している" do\r
+ post :create, :comic => {}\r
+ assigns(:comic).should be_a_new(Comic)\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ post :create, :comic => {}\r
+ response.status.should eq 200\r
+ end\r
+ it '新規ページを描画する' do\r
+ post :create, :comic => {}\r
+ response.should render_template("new")\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード422 unprocessable_entity を返す' do\r
+ post :create, :comic => {}, :format => :json\r
+ response.status.should eq 422\r
+ end\r
+ it '応答メッセージUnprocessable Entityを返す' do\r
+ post :create, :comic => {}, :format => :json\r
+ response.message.should match(/Unprocessable/)\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe '編集フォーム表示に於いて' do\r
+ before do\r
+ @comic = Factory :comic, :author_id => @user.author.id\r
+ sign_in @user\r
+ Comic.stub(:show).and_return(@comic)\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ get :edit, :id => @comic.id\r
+ response.should be_success \r
+ end\r
+ it 'コミックモデルに単体取得を問い合わせている' do\r
Comic.should_receive(:show).exactly(1)\r
- get :edit, :id => @comic.id
- end
- it '@comicにデータを用意している' do
- get :edit, :id => @comic.id
- assigns(:comic).should eq @comic
- end
- context 'html形式' do
- it 'editテンプレートを描画する' do
- get :edit, :id => @comic.id
- response.should render_template("edit")
- end
- end
- context 'js形式' do
- it 'edit.jsテンプレートを描画する' do
- get :edit, :id => @comic.id, :format => :js
- response.should render_template("edit")
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- get :edit, :id => @comic.id
- response.status.should eq 302
- end
- it 'サインインページへ遷移する' do
- get :edit, :id => @comic.id
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'js形式' do
- it 'ステータスコード401 Unauthorizedを返す' do
- get :edit, :id => @comic.id, :format => :js
- response.status.should eq 401
- end
- it '応答メッセージにUnauthorizedを返す' do
- get :edit, :id => @comic.id, :format => :js
- response.message.should match(/Unauthorized/)
- end
- end
- end
- end
-
- describe '更新に於いて' do
+ get :edit, :id => @comic.id\r
+ end\r
+ it '@comicにデータを用意している' do\r
+ get :edit, :id => @comic.id\r
+ assigns(:comic).should eq @comic\r
+ end\r
+ context 'html形式' do\r
+ it 'editテンプレートを描画する' do\r
+ get :edit, :id => @comic.id\r
+ response.should render_template("edit")\r
+ end\r
+ end\r
+ context 'js形式' do\r
+ it 'edit.jsテンプレートを描画する' do\r
+ get :edit, :id => @comic.id, :format => :js\r
+ response.should render_template("edit")\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ get :edit, :id => @comic.id\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ get :edit, :id => @comic.id\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'js形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
+ get :edit, :id => @comic.id, :format => :js\r
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ get :edit, :id => @comic.id, :format => :js\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe '更新に於いて' do\r
before do\r
- @comic = Factory :normal_comic, :author => @author
- sign_in @user
- end
- context '事前チェックしておく' do
- it 'コミックモデルに単体取得を問い合わせている' do
+ @comic = Factory :comic, :author => @author\r
+ @attr = Factory.attributes_for(:comic, :author_id => @author.id, :title => 'updated title', :visible => 0)\r
+ sign_in @user\r
+ end\r
+ context '事前チェックしておく' do\r
+ it 'コミックモデルに単体取得を問い合わせている' do\r
Comic.stub(:show).with(any_args()).and_return @comic\r
Comic.should_receive(:show).exactly(1)\r
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
- end
- it 'モデルに更新を依頼する' do
- Comic.any_instance.should_receive(:update_attributes).with(any_args)
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
- end
- it '@comicにアレを取得している' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:normal_comic)
- assigns(:comic).id.should eq(@comic.id)
- end
- end
- context 'つつがなく終わるとき' do
+ put :update, :id => @comic.id, :comic => @attr\r
+ end\r
+ it 'モデルに更新を依頼する' do\r
+ Comic.any_instance.should_receive(:update_attributes).with(any_args)\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ end\r
+ it '@comicにアレを取得している' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ assigns(:comic).id.should eq(@comic.id)\r
+ end\r
+ end\r
+ context 'つつがなく終わるとき' do\r
it '更新される' do\r
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)\r
- Comic.find(@comic.id).visible.should eq 0
- end
- context 'html形式' do
- it 'ステータスコード302 Foundを返す' do
- Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.status.should eq 302
- end
- it '更新されたコミックの表示ページへ遷移する' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.should redirect_to(@comic)
- end
- end
- context 'json形式' do
- it 'ステータスコード200 OKを返す' do
- Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
- response.should be_success
- end
- it 'ページ本体は特に返さない' do
- Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
- response.body.should match /./
- end
- end
- end
- context '作家権限がないとき' do
- before do
- sign_out @user
- end
- it 'ステータスコード302 Foundを返す' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.status.should eq 302
- end
- context 'html形式' do
- it 'サインインページへ遷移する' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.body.should redirect_to '/users/sign_in'
- end
- end
- context 'json形式' do
- it '応答メッセージにUnauthorizedを返す' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
- response.message.should match(/Unauthorized/)
- end
- end
- end
- context '検証、保存に失敗したとき' do
- before do
- Comic.any_instance.stub(:update_attributes).and_return(false)
- end
- context 'html形式' do
- it 'ステータスコード200 Okを返す' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.status.should eq 200
- end
- it '編集ページを描画する' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic)
- response.should render_template("edit")
- end
- end
- context 'json形式' do
- it 'ステータスコード422 unprocessable_entity を返す' do
- Comic.any_instance.stub(:update_attributes).and_return(false)
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
- response.status.should eq 422
- end
- it '応答メッセージUnprocessable Entityを返す' do
- put :update, :id => @comic.id, :comic => Factory.attributes_for(:hidden_comic), :format => :json
- response.message.should match(/Unprocessable/)
- end
- end
- end
- end
-
-
- end
+ put :update, :id => @comic.id, :comic => @attr\r
+ Comic.find(@comic.id).visible.should eq 0\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.status.should eq 302\r
+ end\r
+ it '更新されたコミックの表示ページへ遷移する' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.should redirect_to(@comic)\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
+ put :update, :id => @comic.id, :comic => @attr, :format => :json\r
+ response.should be_success \r
+ end\r
+ it 'ページ本体は特に返さない' do\r
+ Comic.any_instance.stub(:update_attributes).with(any_args()).and_return(true)\r
+ put :update, :id => @comic.id, :comic => @attr, :format => :json\r
+ response.body.should match /./\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ it 'ステータスコード302 Foundを返す' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.status.should eq 302\r
+ end\r
+ context 'html形式' do\r
+ it 'サインインページへ遷移する' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ put :update, :id => @comic.id, :comic => @attr, :format => :json\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ context '検証、保存に失敗したとき' do\r
+ before do\r
+ Comic.any_instance.stub(:update_attributes).and_return(false)\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード200 Okを返す' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.status.should eq 200\r
+ end\r
+ it '編集ページを描画する' do\r
+ put :update, :id => @comic.id, :comic => @attr\r
+ response.should render_template("edit")\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード422 unprocessable_entity を返す' do\r
+ Comic.any_instance.stub(:update_attributes).and_return(false)\r
+ put :update, :id => @comic.id, :comic => @attr, :format => :json\r
+ response.status.should eq 422\r
+ end\r
+ it '応答メッセージUnprocessable Entityを返す' do\r
+ put :update, :id => @comic.id, :comic => @attr, :format => :json\r
+ response.message.should match(/Unprocessable/)\r
+ end\r
+ end\r
+ end\r
+ end\r
+ \r
+ \r
+ end\r
describe '更新に於いて' do
before do
- @pic = Factory :original_picture, :artist_id => @artist.id , :license_id => @license.id
+ @pic = Factory :original_picture, :artist_id => @artist.id
- OriginalPicture.stub(:show).with(any_args()).and_return(@pic)
+ OriginalPicture.stub(:edit).with(any_args()).and_return(@pic)
sign_in @user
end
context '事前チェックしておく' do
@user = Factory( :user_yas)
@author = @user.author
@artist = Factory :artist_yas, :author_id => @author.id
- @op = Factory :original_picture, :artist_id => @artist.id , :license_id => @license.id
- @rp = Factory :resource_picture, :artist_id => @artist.id , :license_id => @license.id, :original_picture_id => @op.id
+ @op = Factory :original_picture, :artist_id => @artist.id
+ @p = Factory :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
+ @rp = Factory :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
- @panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
- @attr = {:resource_picture_id => @rp.id, :panel_id => @panel}
++ @panel = Factory :panel, :author_id => @author.id
++ @attr = {:resource_picture_id => @rp.id, :panel_id => @panel.id}
end
describe '一覧表示に於いて' do
describe PanelsController do\r
before do\r
Factory :admin\r
- @license = Factory :license\r
+ @sp = Factory :system_picture
+ @lg = Factory :license_group
+ @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
@user = Factory :user_yas\r
@author = @user.author #ユーザ作成時に連動して作成される\r
- @comic = Factory :comic, :author_id => @author.id\r
end\r
\r
describe '一覧表示に於いて' do\r
--- /dev/null
- @license = Factory :license
+ # -*- encoding: utf-8 -*-
+ require 'spec_helper'
+ #ストーリー
+ describe StoriesController do
+ before do
+ Factory :admin
++ @sp = Factory :system_picture
++ @lg = Factory :license_group
++ @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
+ @user = Factory :user_yas
+ @author = @user.author #ユーザ作成時に連動して作成される
+ @comic = Factory :comic, :author_id => @user.author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+
+
+ describe '閲覧に於いて' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Comic.stub(:show).and_return(@comic)
+ sign_in @user
+ end
+ context '事前チェックする' do
+ end
+ context 'つつがなく終わるとき' do
+ end
+ context '作家権限がないとき' do
+ end
+ end
+
+ describe '新規作成フォーム表示に於いて' do
+ before do
+ sign_in @user
+ end
+ context 'つつがなく終わるとき' do
+ it 'ステータスコード200 OKを返す' do
+ get :new
+ response.should be_success
+ end
+ it '@storyに新規データを用意している' do
+ get :new
+ assigns(:story).should be_a_new(Story)
+ end
+ it 'モデルにデフォルト値補充を依頼している' do
+ Story.any_instance.should_receive(:supply_default).exactly(1)
+ get :new
+ end
+ context 'html形式' do
+ it 'newテンプレートを描画する' do
+ get :new
+ response.should render_template("new")
+ end
+ end
+ context 'js形式' do
+ it 'new.jsテンプレートを描画する' do
+ get :new, :format => :js
+ response.should render_template("new")
+ end
+ end
+ end
+ context '作家権限がないとき' do
+ before do
+ sign_out @user
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ get :new
+ response.status.should eq 302
+ end
+ it 'サインインページへ遷移する' do
+ get :new
+ response.body.should redirect_to '/users/sign_in'
+ end
+ end
+ context 'js形式' do
+ it 'ステータスコード401 Unauthorizedを返す' do
+ get :new, :format => :js
+ response.status.should eq 401
+ end
+ it '応答メッセージにUnauthorizedを返す' do
+ get :new, :format => :js
+ response.message.should match(/Unauthorized/)
+ end
+ end
+ end
+ end
+
+ describe '新規作成に於いて' do
+ before do
+ @attr = Factory.attributes_for(:story, :t => nil, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id)
+ sign_in @user
+ end
+ context 'つつがなく終わるとき' do
+ it 'デフォルト値補充を依頼する' do
+ Story.any_instance.should_receive(:supply_default).exactly(1)
+ post :create, :story => @attr
+ end
+ it 'POSTデータから、カラム値を復元している' do
+ Story.any_instance.stub(:store).and_return(true)
+ Story.any_instance.should_receive(:attributes=).exactly(1)
+ post :create, :story => @attr
+ end
+ it '上書き補充を依頼する' do
+ Story.any_instance.should_receive(:overwrite).exactly(1)
+ post :create, :story => @attr
+ end
+ it 'モデルに保存依頼する' do
+ Story.any_instance.should_receive(:store).exactly(1)
+ post :create, :story => @attr
+ end
+ it "@storyに作成されたコマを保持していて、それがDBにある" do
+ post :create, :story => @attr
+ assigns(:story).should be_a(Story)
+ assigns(:story).should be_persisted
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ Story.any_instance.stub(:store).and_return(true)
+ post :create, :story => @attr
+ response.status.should eq 302
+ end
+ it 'コミックのストーリー表示へ遷移する' do
+ # Story.any_instance.stub(:store).and_return(true)
+ post :create, :story => @attr
+ response.should redirect_to(:action => :show, :id => @attr[:comic_id])
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード200 OKを返す' do
+ # Story.any_instance.stub(:store).and_return(true)
+ post :create, :story => @attr, :format => :json
+ response.should be_success
+ end
+ it '作成されたコマをjsonデータで返す' do
+ post :create, :story => @attr, :format => :json
+ lambda{JSON.parse(response.body)}.should_not raise_error(JSON::ParserError)
+ end
+ it 'データがアレになっている' do
+ post :create, :story => @attr, :format => :json
+ json = JSON.parse response.body
+ json["t"].should eq 0
+ end
+ end
+ end
+ context '作家権限がないとき' do
+ before do
+ sign_out @user
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ post :create, :story => @attr
+ response.status.should eq 302
+ end
+ it 'サインインページへ遷移する' do
+ post :create, :story => @attr
+ response.body.should redirect_to '/users/sign_in'
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード401 Unauthorizedを返す' do
+ post :create, :story => @attr, :format => :json
+ response.status.should eq 401
+ end
+ it '応答メッセージにUnauthorizedを返す' do
+ post :create, :story => @attr, :format => :json
+ response.message.should match(/Unauthorized/)
+ end
+ end
+ end
+ context '検証、保存に失敗した' do
+ before do
+ Story.any_instance.stub(:store).and_return(false)
+ end
+ it "未保存のコマを保持している" do
+ post :create, :story => @attr
+ assigns(:story).should be_a_new(Story)
+ end
+ context 'html形式' do
+ it 'ステータスコード200 OKを返す' do
+ post :create, :story => @attr
+ response.status.should eq 200
+ end
+ it '新規ページを描画する' do
+ post :create, :story => @attr
+ response.should render_template("new")
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード422 unprocessable_entity を返す' do
+ post :create, :story => @attr, :format => :json
+ response.status.should eq 422
+ end
+ it '応答メッセージUnprocessable Entityを返す' do
+ post :create, :story => @attr, :format => :json
+ response.message.should match(/Unprocessable/)
+ end
+ end
+ end
+ end
+
+ describe '編集フォーム表示に於いて' do
+ before do
+ @story = Factory :story, :author_id => @author.id
+ sign_in @user
+ Story.stub(:show).and_return(@story)
+ end
+ context 'つつがなく終わるとき' do
+ it 'ステータスコード200 OKを返す' do
+ get :edit, :id => @story.id
+ response.should be_success
+ end
+ it 'コマモデルに単体取得を問い合わせている' do
+ Story.should_receive(:show).exactly(1)
+ get :edit, :id => @story.id
+ end
+ it '@storyにデータを用意している' do
+ get :edit, :id => @story.id
+ assigns(:story).should eq @story
+ end
+ context 'html形式' do
+ it 'editテンプレートを描画する' do
+ get :edit, :id => @story.id
+ response.should render_template("edit")
+ end
+ end
+ context 'js形式' do
+ it 'edit.jsテンプレートを描画する' do
+ get :edit, :id => @story.id, :format => :js
+ response.should render_template("edit")
+ end
+ end
+ end
+ context '作家権限がないとき' do
+ before do
+ sign_out @user
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ get :edit, :id => @story.id
+ response.status.should eq 302
+ end
+ it 'サインインページへ遷移する' do
+ get :edit, :id => @story.id
+ response.body.should redirect_to '/users/sign_in'
+ end
+ end
+ context 'js形式' do
+ it 'ステータスコード401 Unauthorizedを返す' do
+ get :edit, :id => @story.id, :format => :js
+ response.status.should eq 401
+ end
+ it '応答メッセージにUnauthorizedを返す' do
+ get :edit, :id => @story.id, :format => :js
+ response.message.should match(/Unauthorized/)
+ end
+ end
+ end
+ end
+
+ describe '更新に於いて' do
+ before do
+ @story = Factory :story, :author_id => @user.author.id
+ @attr = Factory.attributes_for(:story, :author_id => @author.id)
+ sign_in @user
+ end
+ context 'つつがなく終わるとき' do
+ it 'モデルに編集取得依頼する' do
+ Story.stub(:edit).with(any_args).and_return(@story)
+ Story.should_receive(:edit).exactly(1)
+ put :update, :id => @story.id, :story => @attr
+ end
+ it 'POSTデータから、カラム値を復元している' do
+ Story.any_instance.stub(:store).and_return(true)
+ Story.any_instance.should_receive(:attributes=).exactly(1)
+ put :update, :id => @story.id, :story => @attr
+ end
+ it '上書き補充を依頼する' do
+ Story.any_instance.should_receive(:overwrite).exactly(1)
+ put :update, :id => @story.id, :story => @attr
+ end
+ it 'モデルに保存依頼する' do
+ Story.any_instance.should_receive(:store).exactly(1)
+ put :update, :id => @story.id, :story => @attr
+ end
+ it "@storyに作成されたストーリーを保持していて、それがDBにある" do
+ put :update, :id => @story.id, :story => @attr
+ assigns(:story).should be_a(Story)
+ assigns(:story).should be_persisted
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ Story.any_instance.stub(:store).and_return(true)
+ put :update, :id => @story.id, :story => @attr
+ response.status.should eq 302
+ end
+ it 'コミックのストーリー表示へ遷移する' do
+ # Story.any_instance.stub(:store).and_return(true)
+ put :update, :id => @story.id, :story => @attr
+ response.should redirect_to(:action => :show, :id => @attr[:comic_id])
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード200 OKを返す' do
+ # Story.any_instance.stub(:store).and_return(true)
+ put :update, :id => @story.id, :story => @attr, :format => :json
+ response.should be_success
+ end
+ end
+ end
+ context '作家権限がないとき' do
+ before do
+ sign_out @user
+ end
+ context 'html形式' do
+ it 'ステータスコード302 Foundを返す' do
+ put :update, :id => @story.id, :story => @attr
+ response.status.should eq 302
+ end
+ it 'サインインページへ遷移する' do
+ put :update, :id => @story.id, :story => @attr
+ response.body.should redirect_to '/users/sign_in'
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード401 Unauthorizedを返す' do
+ put :update, :id => @story.id, :story => @attr, :format => :json
+ response.status.should eq 401
+ end
+ it '応答メッセージにUnauthorizedを返す' do
+ put :update, :id => @story.id, :story => @attr, :format => :json
+ response.message.should match(/Unauthorized/)
+ end
+ end
+ end
+ context '検証、保存に失敗した' do
+ before do
+ Story.any_instance.stub(:store).and_return(false)
+ end
+ it "指定のコマを保持している" do
+ put :update, :id => @story.id, :story => @attr
+ assigns(:story).should eq @story
+ end
+ context 'html形式' do
+ it 'ステータスコード200 OKを返す' do
+ put :update, :id => @story.id, :story => @attr
+ response.status.should eq 200
+ end
+ it '編集ページを描画する' do
+ put :update, :id => @story.id, :story => @attr
+ response.should render_template("edit")
+ end
+ end
+ context 'json形式' do
+ it 'ステータスコード422 unprocessable_entity を返す' do
+ put :update, :id => @story.id, :story => @attr, :format => :json
+ response.status.should eq 422
+ end
+ it '応答メッセージUnprocessable Entityを返す' do
+ put :update, :id => @story.id, :story => @attr, :format => :json
+ response.message.should match(/Unprocessable/)
+ end
+ end
+ end
+ end
+
+ describe '削除に於いて' do\r
+ before do\r
+ @story = Factory :story, :author_id => @author.id
+ sign_in @user
+ Story.stub(:edit).and_return(@story)\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'ストーリーモデルに編集取得を問い合わせている' do\r
+ Story.should_receive(:edit).exactly(1)\r
+ delete :destroy, :id => @story.id\r
+ end\r
+ it '@storyにアレを取得している' do\r
+ delete :destroy, :id => @story.id\r
+ assigns(:story).id.should eq(@story.id)\r
+ end\r
+ it 'そのストーリーを一つのトランザクションで削除する' do\r
+ lambda {\r
+ delete :destroy, :id => @story.id\r
+ }.should change(Story, :count)\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ delete :destroy, :id => @story.id\r
+ response.status.should eq 302\r
+ end\r
+ it 'ストーリー一覧ページへ遷移する' do\r
+ delete :destroy, :id => @story.id\r
+ response.should redirect_to(story_path(@story.comic_id))\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード200 OKを返す' do\r
+ delete :destroy, :id => @story.id, :format => :json\r
+ response.should be_success\r
+ end\r
+ end\r
+ end\r
+ context '作家権限がないとき' do\r
+ before do\r
+ sign_out @user\r
+ end\r
+ context 'html形式' do\r
+ it 'ステータスコード302 Foundを返す' do\r
+ delete :destroy, :id => @story.id\r
+ response.status.should eq 302\r
+ end\r
+ it 'サインインページへ遷移する' do\r
+ delete :destroy, :id => @story.id\r
+ response.body.should redirect_to '/users/sign_in'\r
+ end\r
+ end\r
+ context 'json形式' do\r
+ it 'ステータスコード401 Unauthorizedを返す' do\r
+ delete :destroy, :id => @story.id, :format => :json\r
+ response.status.should eq 401\r
+ end\r
+ it '応答メッセージにUnauthorizedを返す' do\r
+ delete :destroy, :id => @story.id, :format => :json\r
+ response.message.should match(/Unauthorized/)\r
+ end\r
+ end\r
+ end\r
+ =begin\r
+ context '対象ストーリーがないとき' do\r
+ end\r
+ context '他人のストーリーだったとき' do\r
+ end\r
+ =end\r
+ end\r
+ \r
+ end
before do\r
@balloon = Factory.build :balloon, :speech_balloon_id => @speech_balloon.id, :system_picture_id => @system_picture.id\r
end\r
++ #ネストの保存はnilを許可しなければならないので数値チェックだけ
it 'テストデータの確認' do\r
@balloon.speech_balloon_id = @speech_balloon.id\r
@balloon.should be_valid\r
describe Comic do
before do
Factory :admin
- @license = Factory :license
++ @sp = Factory :system_picture
++ @lg = Factory :license_group
++ @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
@user = Factory( :user_yas)
@author = @user.author
@artist = Factory :artist_yas, :author_id => @author.id
end
end
end
- describe '関連テーブルプションに於いて' do\r
- context 'オプションがないとき' do\r
- it '1つの項目を含んでいる' do\r
- r = OriginalPicture.show_include_opt\r
- r.should have(1).items\r
- end\r
- it '素材を含んでいる' do\r
- r = OriginalPicture.show_include_opt\r
- r.has_key?(:resource_picture).should be_true\r
- end\r
- end\r
- context 'オプションでtestを含ませたとき' do\r
- it '2つの項目を含んでいる' do\r
- r = OriginalPicture.show_include_opt(:include => {:test => {}})\r
- r.should have(2).items\r
- end\r
- it 'testを含んでいる' do\r
- r = OriginalPicture.show_include_opt(:include => {:test => {}})\r
- r.has_key?(:test).should be_true\r
- end\r
- end\r
+ describe '編集取得に於いて' do
+ before do
+ @op = Factory :original_picture, :artist_id => @artist.id
+ end
+ it '指定の原画を返す' do
+ pic = OriginalPicture.edit @op.id, @artist
+ pic.should eq @op
+ end
- context '関連テーブルオプションがないとき' do
- it 'ライセンスと素材を含んでいる' do
- r = OriginalPicture.show_include_opt
- r.should eq [:license, :resource_picture]
- end
- end
- context '関連テーブルオプションで絵師を含ませたとき' do
- it 'ライセンスと素材と作者データを含んでいる' do
- r = OriginalPicture.show_include_opt(:include => :artist)
- r.should eq [:license, :resource_picture, :artist]
- end
- end
+ context '他人の原画を開こうとしたとき' do
+ it '403Forbidden例外を返す' do
+ lambda{
+ pic = OriginalPicture.edit @op.id, @other_artist
+ }.should raise_error(ActiveRecord::Forbidden)
+ end
+ end
+ context '存在しない原画を開こうとしたとき' do
+ it '404RecordNotFound例外を返す' do
+ lambda{
+ pic = OriginalPicture.edit 0, @artist
+ }.should raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
end
describe 'json単体出力オプションに於いて' do
- it 'includeキーがライセンスと素材を含んでいる' do
- r = OriginalPicture.show_json_include_opt
- r[:include].should eq [:license, :resource_picture]
- end
+ it 'includeキーを含んでいる' do\r
+ r = OriginalPicture.show_json_include_opt\r
+ r.has_key?(:include).should be_true\r
+ end\r
+ it '1つの項目を含んでいる' do\r
+ r = OriginalPicture.show_json_include_opt[:include]\r
+ r.should have(1).items\r
+ end\r
+ it '素材を含んでいる' do\r
+ r = OriginalPicture.show_json_include_opt[:include]\r
+ r.has_key?(:resource_picture).should be_true\r
+ end\r
end
describe '一覧取得に於いて' do
before do
before do
@pp = Factory.build :panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id
end
++ #ネストの保存はnilを許可しなければならないので数値チェックだけ
it 'テストデータの確認' do
@pp.panel_id = @panel.id
@pp.should be_valid
@pp.panel_id = 'a'
@pp.should_not be_valid
end
- it '存在するコマでなければ失敗する' do
- @pp.panel_id = 0
- @pp.should_not be_valid
- end
end
- context 'resource_picture_idを検証するとき' do
- before do
- @pp = Factory.build :panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id
- end
- it 'テストデータの確認' do
- @pp.resource_picture_id = @rp.id
- @pp.should be_valid
- end
- it 'nullなら失敗する' do
- @pp.resource_picture_id = nil
- @pp.should_not be_valid
- end
- it '数値でなければ失敗する' do
- @pp.resource_picture_id = 'a'
- @pp.should_not be_valid
- end
- it '存在するフキダシテンプレートでなければ失敗する' do
- @pp.resource_picture_id = 0
- @pp.should_not be_valid
- end
- end
context 'linkを検証するとき' do
before do
@pp = Factory.build :panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id
before do
@sb = Factory.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
end
++ #ネストの保存はnilを許可しなければならないので数値チェックだけ
it 'テストデータの確認' do
@sb.panel_id = @panel.id
@sb.should be_valid
before do\r
@speech = Factory.build :speech, :speech_balloon_id => @speech_balloon.id\r
end\r
++ #ネストの保存はnilを許可しなければならないので数値チェックだけ
it 'テストデータの確認' do\r
@speech.speech_balloon_id = @speech_balloon.id\r
@speech.should be_valid\r
--- /dev/null
- @license = Factory :license
+ # -*- encoding: utf-8 -*-
+ require 'spec_helper'
+ #ストーリー
+ describe Story do
+ before do
+ Factory :admin
++ @sp = Factory :system_picture
++ @lg = Factory :license_group
++ @license = Factory :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
+ @user = Factory( :user_yas)
+ @author = @user.author
+ @artist = Factory :artist_yas, :author_id => @author.id
+ @other_user = Factory( :user_yas)
+ @other_author = @other_user.author
+ end
+
+ describe '検証に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+
+ it 'オーソドックスなデータなら通る' do
+ @story.should be_valid
+ end
+
+ context 'comic_idを検証するとき' do
+ it 'テストデータの確認' do
+ @story.comic_id = @comic.id
+ @story.should be_valid
+ end
+ it 'nullなら失敗する' do
+ @story.comic_id = nil
+ @story.should_not be_valid
+ end
+ it '数値でなければ失敗する' do
+ @story.comic_id = 'a'
+ @story.should_not be_valid
+ end
+ it '存在するコミックでなければ失敗する' do
+ @story.comic_id = 0
+ @story.should_not be_valid
+ end
+ end
+
+ context 'panel_idを検証するとき' do
+ it 'テストデータの確認' do
+ @story.panel_id = @panel.id
+ @story.should be_valid
+ end
+ it 'nullなら失敗する' do
+ @story.panel_id = nil
+ @story.should_not be_valid
+ end
+ it '数値でなければ失敗する' do
+ @story.panel_id = 'a'
+ @story.should_not be_valid
+ end
+ it '存在するコマでなければ失敗する' do
+ @story.panel_id = 0
+ @story.should_not be_valid
+ end
+ end
+
+ context 'tを検証するとき' do
+ before do
+ end
+ it 'テストデータの確認' do
+ @story.t = 0
+ @story.should be_valid
+ end
+ it 'nullなら失敗する' do
+ @story.t = nil
+ @story.should_not be_valid
+ end
+ it '数値でなければ失敗する' do
+ @story.t = 'a'
+ @story.should_not be_valid
+ end
+ it '負なら失敗する' do
+ @story.t = -1
+ @story.should_not be_valid
+ end
+ end
+
+ context 'author_idを検証するとき' do
+ it 'テストデータの確認' do
+ @story.author_id = @author.id
+ @story.should be_valid
+ end
+ it 'nullなら失敗する' do
+ @story.author_id = nil
+ @story.should_not be_valid
+ end
+ it '数値でなければ失敗する' do
+ @story.author_id = 'a'
+ @story.should_not be_valid
+ end
+ it '存在する作家でなければ失敗する' do
+ @story.author_id = 0
+ @story.should_not be_valid
+ end
+ end
+ context '全体を検証するとき' do
+ before do
+ @story = Factory :story, :author_id => @author.id
+ end
+ end
+ end
+
+ describe 'デフォルト値補充に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+
+ #dbのデフォルト値が0だから明示的にnilにしないと追加ができない
+ it 'tをnilにする' do
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id
+ @story.supply_default
+ @story.t.should be_nil
+ end
+
+ end
+
+ describe '上書き補充に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+
+ context 'author_idを補充' do
+ it '問答無用でauthor_idを補充する' do
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id
+ @story.author_id = nil
+ @story.overwrite @author
+ @story.author_id.should eq @author.id
+ end
+ end
+
+ end
+
+ describe '作者判定に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ @comico = Factory :comic, :author_id => @other_author.id
+ @panelo = Factory :panel, :author_id => @other_author.id
+ @storyo = Factory :story, :author_id => @other_author.id, :comic_id => @comico.id, :panel_id => @panelo.id
+ end
+ it '自分のストーリーならyes' do
+ @story.own?(@author).should == true
+ end
+ it '他人のストーリーならno' do
+ @storyo.own?(@author).should == false
+ end
+ it '作家が不明ならno' do
+ @story.own?(nil).should == false
+ end
+ end
+ describe '単体取得に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ end
+ it '指定のストーリーを返す' do
+ l = Story.edit @story.id, @author
+ l.should eq @story
+ end
+ context '他人のストーリーを開こうとしたとき' do
+ it '403Forbidden例外を返す' do
+ Story.any_instance.stub(:own?).and_return(false)
+ lambda{
+ Story.edit @story.id, @author
+ }.should raise_error(ActiveRecord::Forbidden)
+ end
+ end
+ context '存在しないストーリーを開こうとしたとき' do
+ it '404RecordNotFound例外を返す' do
+ lambda{
+ Story.edit 110, @author
+ }.should raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+
+ describe '一覧取得に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ @panel2 = Factory :panel, :author_id => @author.id, :publish => 0
+ end
+ context 'offset補正について' do
+ it '文字列から数値に変換される' do
+ Story.offset(100, '8').should eq 8
+ end
+ it 'nilの場合は0になる' do
+ Story.offset(100).should eq 0
+ end
+ #投稿されたコマ数以上の値が指定されたときは、最後のコマだけになる
+ #最後のコマとは、コマ数‐1.
+ it '1件のときオフセット1なら0になる' do
+ Story.offset(1, '1').should eq 0
+ end
+ it '5件のときオフセット5なら4になる' do
+ Story.offset(5, '5').should eq 4
+ end
+ # 負の値が指定されたときは、最後のコマから数えてコマを飛ばして表示する。
+ #-4のときは、最後から4つのコマを表示する。
+ it '2件のときオフセット-1なら1になる' do
+ Story.offset(2, '-1').should eq 1
+ end
+ it '5件のときオフセット-2なら3になる' do
+ Story.offset(5, '-2').should eq 3
+ end
+ # 最終的なが負になるなど、不正な値が入ったときは0となる。
+ it '2件のときオフセット-5なら0になる' do
+ Story.offset(2, '-5').should eq 0
+ end
+ end
+ context 'panel_count補正について' do
+ it '文字列から数値に変換される' do
+ Story.panel_count(100, '7').should eq 7
+ end
+ it 'nilの場合はStory.default_panel_sizeになる' do
+ Story.panel_count(100).should eq Story.default_panel_size
+ end
+ it '0以下の場合はStory.default_panel_sizeになる' do
+ Story.panel_count(100, '0').should eq Story.default_panel_size
+ end
+ it 'Story.max_panel_sizeを超えた場合はStory.max_panel_sizeになる' do
+ Story.panel_count(100, '1000').should eq Story.max_panel_size
+ end
+ end
+ it 'リストを返す' do
+ c = Story.list @comic, @author
+ c.should eq [@story]
+ end
+ it 't順で並んでいる' do
+ v = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 1
+ c = Story.list @comic, @author
+ c.should eq [ @story, v]
+ end
+ it '非公開のコマは含まない' do\r
+ h = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel2.id, :t => 1
+ c = Story.list @comic, @author
+ c.should eq [ @story]
+ end\r
+ context 'DBに5件あって1ページの件数を2件に変えたとして' do
+ before do
+ @story2 = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 1
+ @story3 = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 2
+ @story4 = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 3
+ @story5 = Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 4
+ end
+ it 'offset=0なら末尾2件を返す' do
+ #時系列で並んでいる
+ c = Story.list( @comic, @author, 0, 2)
+ c.should eq [@story, @story2]
+ end
+ it 'offset=2なら中間2件を返す' do
+ c = Story.list(@comic, @author, 2, 2)
+ c.should eq [@story3, @story4]
+ end
+ it 'offset=4なら先頭1件を返す' do
+ c = Story.list(@comic, @author, 4, 2)
+ c.should eq [@story5]
+ end
+ end
+ end
+ describe 'list関連テーブルプションに於いて' do
+ it 'includeキーを含んでいる' do
+ r = Story.list_opt
+ r.has_key?(:include).should be_true
+ end
+ it '3つの項目を含んでいる' do
+ r = Story.list_opt[:include]
+ r.should have(3).items
+ end
+ it 'コミックを含んでいる' do
+ r = Story.list_opt[:include]
+ r.has_key?(:comic).should be_true
+ end
+ it 'コミックは作家を含んでいる' do
+ r = Story.list_opt[:include]
+ r[:comic].has_key?(:author).should be_true
+ end
+ it '作家を含んでいる' do
+ r = Story.list_opt[:include]
+ r.has_key?(:author).should be_true
+ end
+ it 'コマを含んでいる' do
+ r = Story.list_opt[:include]
+ r.has_key?(:panel).should be_true
+ end
+ it 'コマは作家を含んでいる' do
+ r = Story.list_opt[:include]
+ r[:panel].has_key?(:author).should be_true
+ end
+ it 'コマはコマ絵を含んでいる' do
+ r = Story.list_opt[:include]
+ r[:panel].has_key?(:panel_pictures).should be_true
+ end
+ it 'コマはフキダシを含んでいる' do
+ r = Story.list_opt[:include]
+ r[:panel].has_key?(:speech_balloons).should be_true
+ end
+ end
+ describe 'json一覧出力オプションに於いて' do
+ it 'includeキーを含んでいる' do
+ r = Story.list_json_opt
+ r.has_key?(:include).should be_true
+ end
+ it '3つの項目を含んでいる' do
+ r = Story.list_json_opt[:include]
+ r.should have(3).items
+ end
+ it 'コミックを含んでいる' do
+ r = Story.list_json_opt[:include]
+ r.has_key?(:comic).should be_true
+ end
+ it 'コミックは作家を含んでいる' do
+ r = Story.list_json_opt[:include]
+ r[:comic].has_key?(:author).should be_true
+ end
+ it '作家を含んでいる' do
+ r = Story.list_json_opt[:include]
+ r.has_key?(:author).should be_true
+ end
+ it 'コマを含んでいる' do
+ r = Story.list_json_opt[:include]
+ r.has_key?(:panel).should be_true
+ end
+ it 'コマは作家を含んでいる' do
+ r = Story.list_json_opt[:include]
+ r[:panel].has_key?(:author).should be_true
+ end
+ it 'コマはコマ絵を含んでいる' do
+ r = Story.list_json_opt[:include]
+ r[:panel].has_key?(:panel_pictures).should be_true
+ end
+ it 'コマはフキダシを含んでいる' do
+ r = Story.list_json_opt[:include]
+ r[:panel].has_key?(:speech_balloons).should be_true
+ end
+ end
+ describe 't補充値に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+
+ context 'コミック初のコマなら' do
+ it '0を補充値とする' do
+ @story = Factory.build :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ @story.t = nil
+ r = Story.new_t @story.comic_id
+ r.should eq 0
+ end
+ end
+ context 'コミックに一個コマがあるとき' do
+ it '1を補充値とする' do
+ Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 0
+ @story = Factory.build :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ @story.t = nil
+ r = Story.new_t @story.comic_id
+ r.should eq 1
+ end
+ end
+ context 'コミックに2個コマがあるとき' do
+ it '2を補充値とする' do
+ Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 0
+ Factory :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id, :t => 1
+ @story = Factory.build :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
+ @story.t = nil
+ r = Story.new_t @story.comic_id
+ r.should eq 2
+ end
+ end
+ end
+ describe 'シリアライズチェックに於いて' do
+ context 'つつがなく終わるとき' do
+ it '0からシリアライズされているならTrueを返す' do
+ r = Story.serial? [0, 1, 2]
+ r.should be_true
+ end
+ it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do
+ r = Story.serial? [0, 2, 1]
+ r.should be_true
+ end
+ it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do
+ r = Story.serial? [ 2, 1, 4, 3, 0]
+ r.should be_true
+ end
+ end
+ context '異常なとき' do
+ it '0から始まらないならFalseを返す' do
+ r = Story.serial? [1, 2, 3]
+ r.should be_false
+ end
+ it '連続していないならFalseを返す' do
+ r = Story.serial? [0, 1, 2, 4]
+ r.should be_false
+ end
+ it '連続していないならFalseを返す' do
+ r = Story.serial? [0, 1, 2, 4, 5]
+ r.should be_false
+ end
+ end
+ end
+ describe 't収集に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @comic2 = Factory :comic, :author_id => @author.id
+ @c2story = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context 'つつがなく終わるとき' do
+ it 'ストーリーから同一コミックのtだけを収集している' do
+ r = Story.collect_t @story
+ r.should eq [0]
+ end
+ end
+ context '複数コマのとき' do
+ it 'ストーリーから同一コミックのtだけを収集している' do
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ r = Story.collect_t @story
+ r.sort.should eq [0, 1]
+ end
+ end
+ context '複数コマでヨソのコミックも混じっているとき' do
+ it 'ストーリーから同一コミックのtだけを収集している' do
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ r = Story.collect_t @story
+ r.sort.should eq [0, 1]
+ end
+ end
+ end
+ describe 'tチェックに於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory.build :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context 'つつがなく終わるとき' do
+ it 't収集を依頼している' do
+ Story.should_receive(:collect_t).with(any_args).exactly(1)
+ Story.stub(:collect_t).with(any_args).and_return([])
+ Story.stub(:serial?).with(any_args).and_return(true)
+ r = Story.validate_t @story
+ end
+ it '収集したtをシリアライズチェック依頼している' do
+ Story.stub(:collect_t).with(any_args).and_return([])
+ Story.should_receive(:serial?).with(any_args).exactly(1)
+ Story.stub(:serial?).with(any_args).and_return(true)
+ r = Story.validate_t @story
+ end
+ end
+ #実データでチェック
+ #依頼チェックだけでは不安なので最低限のチェックを
+ context '新規のとき' do
+ it '一件だけで正常通過している' do
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id, :t => 0
+ r = Story.validate_t @story
+ r.should be_true
+ end
+ end
+ context '既存のとき' do
+ it '2件目を作っても正常通過している' do
+ @story = Factory :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id, :t => 0
+ @story2 = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id, :t => 1
+ r = Story.validate_t @story2
+ r.should be_true
+ end
+ end
+ end
+ describe '挿入シフトに於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+ context '依頼チェック' do
+ #テーブルが空で0に挿入
+ it 'Updateを依頼している' do
+ Story.stub(:update_all).with(any_args)
+ Story.should_receive(:update_all).with(any_args).exactly(1)
+ @story = Factory.build :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story.insert_shift
+ end
+ end
+ context 'テーブルに1件(t:0)で0に挿入したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory.build :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存の行を1にシフトしている' do
+ @story2.insert_shift
+ l = Story.find :all
+ l.first.t.should eq 1
+ end
+ it 'これから挿入するt(0)が欠番になっている' do
+ @story2.insert_shift
+ l = Story.find(:all).map {|s| s.t }
+ l.include?(0).should_not be_true
+ end
+ end
+ context 'テーブルに2件(t:0,1)で1に挿入したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory.build :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
+ @story3.insert_shift
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 2]
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)で2に挿入したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story6 = Factory.build :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
+ @story6.insert_shift
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 1, 3, 4, 5]
+ end
+ end
+ context '先ほどのケース+他のコミック1件で挿入したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story6 = Factory.build :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
+ @story6.insert_shift
+ l = Story.find(:all, :conditions => ['comic_id = ?', @comic.id]).map {|s| s.t }
+ l.sort.should eq [0, 1, 3, 4, 5]
+ end
+ it '他のコミックに影響がない' do
+ ot = @storyc2.t
+ @story6.insert_shift
+ @storyc2.reload
+ @storyc2.t.should eq ot
+ end
+ end
+ end
+ describe '少ない方に移動に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+ context '依頼チェック' do
+ it 'Updateを依頼している' do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.stub(:update_all).with(any_args)
+ Story.should_receive(:update_all).with(any_args).exactly(1)
+ ot = @story2.t
+ @story2.t = 0
+ @story2.lesser_shift ot
+ end
+ end
+ context 'テーブルに2件(t:0,1)で1を0に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story2.t
+ @story2.t = 0
+ end
+ it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story2.lesser_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [1, 1]
+ end
+ it '既存のt0を1にシフトしている' do
+ @story2.lesser_shift @ot
+ @story.reload
+ @story.t.should eq 1
+ end
+ end
+ context 'テーブルに3件(t:0,1,2)で2を1に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story3.t
+ @story3.t = 1
+ end
+ it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story3.lesser_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 2, 2]
+ end
+ it '既存のt1を2にシフトしている' do
+ @story3.lesser_shift @ot
+ @story2.reload
+ @story2.t.should eq 2
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)で3を1に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story4.t
+ @story4.t = 1
+ end
+ it 'これから挿入するt(1)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story4.lesser_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 2, 3, 3, 4]
+ end
+ it '既存のt0には変化がない' do
+ @story4.lesser_shift @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story4.lesser_shift @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt1を2にシフトしている' do
+ @story4.lesser_shift @ot
+ @story2.reload
+ @story2.t.should eq 2
+ end
+ it '既存のt2を3にシフトしている' do
+ @story4.lesser_shift @ot
+ @story3.reload
+ @story3.t.should eq 3
+ end
+ end
+ context '先ほどのケース+他のコミック1件で挿入したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story4.t
+ @story4.t = 1
+ end
+ it 'これから挿入するt(1)が欠番になっている' do
+ @story4.lesser_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 0, 2, 3, 3, 4]
+ end
+ it '既存のt0には変化がない' do
+ @story4.lesser_shift @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story4.lesser_shift @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt1を2にシフトしている' do
+ @story4.lesser_shift @ot
+ @story2.reload
+ @story2.t.should eq 2
+ end
+ it '既存のt2を3にシフトしている' do
+ @story4.lesser_shift @ot
+ @story3.reload
+ @story3.t.should eq 3
+ end
+ it '他のコミックに影響がない' do
+ @story4.lesser_shift @ot
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ end
+ #例外ケース。
+ #負のときは0として正常扱い
+ context 'テーブルに2件(t:0,1)で1を-1に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story2.t
+ @story2.t = -1
+ end
+ it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story2.lesser_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [1, 1]
+ end
+ it '既存のt0を1にシフトしている' do
+ @story2.lesser_shift @ot
+ @story.reload
+ @story.t.should eq 1
+ end
+ it '既存のt1は0に補正されている' do
+ @story2.lesser_shift @ot
+ @story2.t.should eq 0
+ end
+ end
+ end
+ describe '大きい方に移動に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+ context '依頼チェック' do
+ it 'Updateを依頼している' do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.stub(:update_all).with(any_args)
+ Story.should_receive(:update_all).with(any_args).exactly(1)
+ ot = @story.t
+ @story.t = 1
+ @story.higher_shift ot
+ end
+ end
+ context 'テーブルに2件(t:0,1)で0を1に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story.t
+ @story.t = 1
+ end
+ it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story.higher_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 0]
+ end
+ it '既存のt1を0にシフトしている' do
+ @story.higher_shift @ot
+ @story2.reload
+ @story2.t.should eq 0
+ end
+ end
+ context 'テーブルに3件(t:0,1,2)で0を1に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story.t
+ @story.t = 1
+ end
+ it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story.higher_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 0, 2]
+ end
+ it '既存のt1を0にシフトしている' do
+ @story.higher_shift @ot
+ @story2.reload
+ @story2.t.should eq 0
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)で1を3に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story2.t
+ @story2.t = 3
+ end
+ it 'これから挿入するt(3)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story2.higher_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 1, 1, 2, 4]
+ end
+ it '既存のt0には変化がない' do
+ @story2.higher_shift @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story2.higher_shift @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt2を1にシフトしている' do
+ @story2.higher_shift @ot
+ @story3.reload
+ @story3.t.should eq 1
+ end
+ it '既存のt3を2にシフトしている' do
+ @story2.higher_shift @ot
+ @story4.reload
+ @story4.t.should eq 2
+ end
+ end
+ context '先ほどのケース+他のコミック1件で挿入したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story2.t
+ @story2.t = 3
+ end
+ it 'これから挿入するt(3)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story2.higher_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 0, 1, 1, 2, 4]
+ end
+ it '既存のt0には変化がない' do
+ @story2.higher_shift @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story2.higher_shift @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt2を1にシフトしている' do
+ @story2.higher_shift @ot
+ @story3.reload
+ @story3.t.should eq 1
+ end
+ it '既存のt3を2にシフトしている' do
+ @story2.higher_shift @ot
+ @story4.reload
+ @story4.t.should eq 2
+ end
+ it '他のコミックに影響がない' do
+ @story2.higher_shift @ot
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ end
+ #例外ケース。
+ #max超えたときはmaxとして正常扱い
+ context 'テーブルに2件(t:0,1)で0を2に移動したとき' do
+ before do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story.t
+ @story.t = 2
+ end
+ it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
+ #移動させたい行はそのまま残る
+ @story.higher_shift @ot
+ l = Story.find(:all).map {|s| s.t }
+ l.sort.should eq [0, 0]
+ end
+ it '既存のt1を0にシフトしている' do
+ @story.higher_shift @ot
+ @story2.reload
+ @story2.t.should eq 0
+ end
+ it '既存のt0は1に補正されている' do
+ @story.higher_shift @ot
+ @story.t.should eq 1
+ end
+ end
+ end
+ describe '入れ替えに於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context '新tが旧tより小さいとき' do
+ it '少ない方に移動を依頼している' do
+ Story.any_instance.stub(:lesser_shift).with(any_args)
+ Story.any_instance.should_receive(:lesser_shift).with(any_args).exactly(1)
+ ot = @story2.t
+ @story2.t = 0
+ @story2.update_shift ot
+ end
+ end
+ context '新tが旧tより大きいとき' do
+ it '大きい方に移動を依頼している' do
+ Story.any_instance.stub(:higher_shift).with(any_args)
+ Story.any_instance.should_receive(:higher_shift).with(any_args).exactly(1)
+ ot = @story.t
+ @story.t = 1
+ @story.update_shift ot
+ end
+ end
+ end
+ describe '順序入れ替えに於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ end
+ context 'オブジェクトが新規でtが空のとき' do
+ it '末尾追加としてtを補充依頼している' do
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.stub(:new_t).with(any_args).and_return(0)
+ Story.should_receive(:new_t).with(any_args).exactly(1)
+ @story.t = nil
+ r = @story.rotate
+ end
+ end
+ context 'オブジェクトが新規でtが設定されているとき' do
+ it '挿入追加として挿入シフトを依頼している' do
+ @story = Factory.build :story, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.any_instance.stub(:insert_shift).with(any_args)
+ Story.any_instance.should_receive(:insert_shift).with(any_args).exactly(1)
+ @story.t = 0
+ r = @story.rotate
+ end
+ end
+ context 'オブジェクトが新規でなくtが設定されているとき' do
+ it 'コマ移動として入れ替えを依頼している' do
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.any_instance.stub(:update_shift).with(any_args)
+ Story.any_instance.should_receive(:update_shift).with(1).exactly(1)
+ @story2.t = 0
+ r = @story.rotate 1
+ end
+ end
+ context 'オブジェクトが新規でなくtが空のとき' do
+ it '入れ替えもシフトもせず、tを空のままにしている' do
+ #結果、tに欠番が生じてシリアライズチェックでひっかかる
+ end
+ end
+ end
+ describe '編集許可に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory.build :story, :t => nil, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context 'つつがなく終わるとき' do
+ it 'trueを返す' do
+ r = @story.allow?
+ r.should be_true
+ end
+ end
+ context 'コミックで引っかかるとき' do
+ it 'falseを返す' do
+ @story.comic_id = nil
+ r = @story.allow?
+ r.should be_false
+ end
+ it 'falseを返す' do
+ Comic.any_instance.stub(:own?).with(any_args).and_return(false)
+ r = @story.allow?
+ r.should be_false
+ end
+ end
+ context 'コマで引っかかるとき' do
+ it 'falseを返す' do
+ @story.panel_id = nil
+ r = @story.allow?
+ r.should be_false
+ end
+ it 'falseを返す' do
+ Panel.any_instance.stub(:usable?).with(any_args).and_return(false)
+ r = @story.allow?
+ r.should be_false
+ end
+ end
+ end
+ describe '保存に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory.build :story, :t => nil, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context 'つつがなく終わるとき' do
+ it '編集許可チェックを依頼している' do
+ Story.any_instance.stub(:allow?).with(any_args).and_return(true)
+ Story.any_instance.should_receive(:allow?).with(any_args).exactly(1)
+ r = @story.store
+ end
+ it '順序入れ替えを依頼している' do
+ Story.any_instance.stub(:rotate).with(any_args).and_return(0)
+ Story.any_instance.should_receive(:rotate).with(any_args).exactly(1)
+ Story.any_instance.stub(:save).with(any_args).and_return(true)
+ Story.stub(:validate_t).with(any_args).and_return(true)
+ r = @story.store
+ end
+ it '保存を依頼している' do
+ Story.stub(:new_t).with(any_args).and_return(0)
+ Story.any_instance.stub(:save).with(any_args).and_return(true)
+ Story.any_instance.should_receive(:save).with(any_args).exactly(1)
+ Story.stub(:validate_t).with(any_args).and_return(true)
+ r = @story.store
+ end
+ it 'tのシリアライズチェックを依頼している' do
+ Story.stub(:new_t).with(any_args).and_return(0)
+ Story.any_instance.stub(:save).with(any_args).and_return(true)
+ Story.stub(:validate_t).with(any_args).and_return(true)
+ Story.should_receive(:validate_t).with(any_args).exactly(1)
+ r = @story.store
+ end
+ end
+ #入れ替えテストと同じテストを実施。こちらはシフトだけでなく本尊も更新されている
+ context 'テーブルに5件(t:0,1,2,3,4)+他のコミック1件で2に挿入したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story6 = Factory.build :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存のt0には変化がない' do
+ @story6.store
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt1には変化がない' do
+ @story6.store
+ @story2.reload
+ @story2.t.should eq 1
+ end
+ it '既存のt2を3にシフトしている' do
+ @story6.store
+ @story3.reload
+ @story3.t.should eq 3
+ end
+ it '既存のt3を4にシフトしている' do
+ @story6.store
+ @story4.reload
+ @story4.t.should eq 4
+ end
+ it '既存のt5を5にシフトしている' do
+ @story6.store
+ @story5.reload
+ @story5.t.should eq 5
+ end
+ it '新規のt2が作成されている' do
+ @story6.store
+ @story6.reload
+ @story6.t.should eq 2
+ end
+ it '他のコミックに影響がない' do
+ @ot = @storyc2.t
+ @story6.store
+ @storyc2.reload
+ @storyc2.t.should eq @ot
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)+他のコミック1件で3を1に移動したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story4.t
+ @story4.t = 1
+ end
+ it '既存のt0には変化がない' do
+ @story4.store @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story4.store @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt1を2にシフトしている' do
+ @story4.store @ot
+ @story2.reload
+ @story2.t.should eq 2
+ end
+ it '既存のt2を3にシフトしている' do
+ @story4.store @ot
+ @story3.reload
+ @story3.t.should eq 3
+ end
+ it '既存のt3を1にシフトしている' do
+ @story4.store @ot
+ @story4.reload
+ @story4.t.should eq 1
+ end
+ it '他のコミックに影響がない' do
+ @story4.store @ot
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)+他のコミック1件で1を3に移動したとき' do
+ before do
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story2.t
+ @story2.t = 3
+ end
+ it '既存のt0には変化がない' do
+ @story2.store @ot
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '既存のt4には変化がない' do
+ @story2.store @ot
+ @story5.reload
+ @story5.t.should eq 4
+ end
+ it '既存のt1を3にシフトしている' do
+ @story2.store @ot
+ @story2.reload
+ @story2.t.should eq 3
+ end
+ it '既存のt2を1にシフトしている' do
+ @story2.store @ot
+ @story3.reload
+ @story3.t.should eq 1
+ end
+ it '既存のt3を2にシフトしている' do
+ @story2.store @ot
+ @story4.reload
+ @story4.t.should eq 2
+ end
+ it '他のコミックに影響がない' do
+ @story2.store @ot
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ end
+ #ロールバックテスト。入れ替えが直接DBをいじるので、すべてのケースで確実にロールバックを確認する
+ context 'テーブルに5件(t:0,1,2,3,4)+他のコミック1件で2に挿入したが保存に失敗したとき' do
+ before do
+ Story.any_instance.stub(:save).with(any_args).and_return(false)
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story6 = Factory.build :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '既存のtに変化がない' do
+ @story6.store
+ @story.reload
+ @story.t.should eq 0
+ @story2.reload
+ @story2.t.should eq 1
+ @story3.reload
+ @story3.t.should eq 2
+ @story4.reload
+ @story4.t.should eq 3
+ @story5.reload
+ @story5.t.should eq 4
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ it 'falseを返す' do
+ r = @story6.store
+ r.should be_false
+ end
+ end
+ context 'テーブルに5件(t:0,1,2,3,4)+他のコミック1件で3を1に移動したがシリアルチェックに失敗したとき' do
+ before do
+ Story.stub(:validate_t).with(any_args).and_return(false)
+ @comic2 = Factory :comic, :author_id => @author.id
+ @storyc2 = Factory :story, :t => 0, :comic_id => @comic2.id, :panel_id => @panel.id, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @ot = @story4.t
+ @story4.t = 1
+ end
+ it '既存のtに変化がない' do
+ @story4.store @ot
+ @story.reload
+ @story.t.should eq 0
+ @story2.reload
+ @story2.t.should eq 1
+ @story3.reload
+ @story3.t.should eq 2
+ @story4.reload
+ @story4.t.should eq 3
+ @story5.reload
+ @story5.t.should eq 4
+ @storyc2.reload
+ @storyc2.t.should eq 0
+ end
+ it 'falseを返す' do
+ r = @story4.store @ot
+ r.should be_false
+ end
+ it 'tにエラーメッセージが入っている' do
+ @story4.store @ot
+ @story4.errors[:t].should_not be_empty
+ @story4.valid?.should be_true
+ end
+ end
+ context '編集不可だったとき' do
+ before do
+ @story = Factory.build :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ Story.any_instance.stub(:allow?).and_return(false)
+ end
+ it '403Forbidden例外を返す' do
+ lambda{
+ @story.store
+ }.should raise_error(ActiveRecord::Forbidden)
+ end
+ end
+ end
+ describe '切り詰め処理つき削除に於いて' do
+ before do
+ @comic = Factory :comic, :author_id => @author.id
+ @panel = Factory :panel, :author_id => @author.id
+ @story = Factory :story, :t => 0, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ context 'つつがなく終わるとき' do
+ it '削除される' do
+ lambda{
+ @story.destroy_and_shorten
+ }.should change(Story, :count ).by(-1)
+ end
+ end
+ #連携テスト。切り詰めが直接DBをいじる
+ context '2件で先頭を削除したとき' do
+ before do
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '行が削除される' do
+ lambda{
+ @story.destroy_and_shorten
+ }.should change(Story, :count ).by(-1)
+ end
+ it '先頭は削除される' do
+ @story.destroy_and_shorten
+ lambda{
+ Story.find @story.id
+ }.should raise_error(ActiveRecord::RecordNotFound)
+ end
+ it '2件目は前に詰められる' do
+ @story.destroy_and_shorten
+ @story2.reload
+ @story2.t.should eq 0
+ end
+ end
+ context '3件で先頭を削除したとき' do
+ before do
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '行が削除される' do
+ lambda{
+ @story.destroy_and_shorten
+ }.should change(Story, :count ).by(-1)
+ end
+ it '先頭は削除される' do
+ @story.destroy_and_shorten
+ lambda{
+ Story.find @story.id
+ }.should raise_error(ActiveRecord::RecordNotFound)
+ end
+ it '2件目は前に詰められる' do
+ @story.destroy_and_shorten
+ @story2.reload
+ @story2.t.should eq 0
+ end
+ it '3件目は前に詰められる' do
+ @story.destroy_and_shorten
+ @story3.reload
+ @story3.t.should eq 1
+ end
+ end
+ context '5件で3件目を削除したとき' do
+ before do
+ @story2 = Factory :story, :t => 1, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story3 = Factory :story, :t => 2, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story4 = Factory :story, :t => 3, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ @story5 = Factory :story, :t => 4, :comic_id => @comic.id, :panel_id => @panel.id, :author_id => @author.id
+ end
+ it '行が削除される' do
+ lambda{
+ @story3.destroy_and_shorten
+ }.should change(Story, :count ).by(-1)
+ end
+ it '1件目は変化がない' do
+ @story3.destroy_and_shorten
+ @story.reload
+ @story.t.should eq 0
+ end
+ it '2件目は変化がない' do
+ @story3.destroy_and_shorten
+ @story2.reload
+ @story2.t.should eq 1
+ end
+ it '3件目は削除される' do
+ @story3.destroy_and_shorten
+ lambda{
+ Story.find @story3.id
+ }.should raise_error(ActiveRecord::RecordNotFound)
+ end
+ it '4件目は前に詰められる' do
+ @story3.destroy_and_shorten
+ @story4.reload
+ @story4.t.should eq 2
+ end
+ it '5件目は前に詰められる' do
+ @story3.destroy_and_shorten
+ @story5.reload
+ @story5.t.should eq 3
+ end
+ end
+ #ロールバックテスト。切り詰めが直接DBをいじるので、すべてのケースで確実にロールバックを確認する
+ end
+ end