X-Git-Url: http://git.osdn.net/view?p=pettanr%2Fpettanr.git;a=blobdiff_plain;f=spec%2Fmodels%2Fsheet_panel_spec.rb;fp=spec%2Fmodels%2Fsheet_panel_spec.rb;h=b599967e850af80ec64dc8bcd4a62404d8bc8ac1;hp=0000000000000000000000000000000000000000;hb=6f2a183413df55de274cf896a0b54fceb6be00bf;hpb=4113abdecb6e8b5df5a1a1448741c10e20e66620 diff --git a/spec/models/sheet_panel_spec.rb b/spec/models/sheet_panel_spec.rb new file mode 100644 index 00000000..b599967e --- /dev/null +++ b/spec/models/sheet_panel_spec.rb @@ -0,0 +1,1881 @@ +# -*- encoding: utf-8 -*- +require 'spec_helper' +#紙コマ +describe SheetPanel do + before do + SpeechBalloonTemplate.delete_all + @admin = FactoryGirl.create :admin + @sp = FactoryGirl.create :system_picture + @lg = FactoryGirl.create :license_group + @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id + SpeechBalloonTemplate.delete_all + @speech_balloon_template = FactoryGirl.create(:speech_balloon_template, "name" => "circle@pettan.com", "classname" => "CircleSpeechBalloon", "caption" => "cc", "system_picture_id" => @sp.id, "settings" => '{}') + @writing_format = FactoryGirl.create :writing_format + @user = FactoryGirl.create( :user_yas) + @author = FactoryGirl.create :author, :user_id => @user.id + @artist = FactoryGirl.create :artist_yas, :author_id => @author.id + @other_user = FactoryGirl.create( :user_yas) + @other_author = FactoryGirl.create :author, :user_id => @other_user.id + @op = FactoryGirl.create :original_picture, :artist_id => @artist.id + @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id + @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id + end + + describe '検証に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + + context 'オーソドックスなデータのとき' do + it '下限データが通る' do + @sheet_panel.x = -99999 + @sheet_panel.y = -99999 + @sheet_panel.z = 1 + @sheet_panel.t = 0 + @sheet_panel.should be_valid + end + it '上限データが通る' do + @sheet_panel.x = 99999 + @sheet_panel.y = 99999 + @sheet_panel.z = 99999 + @sheet_panel.t = 99999 + @sheet_panel.should be_valid + end + end + + context 'sheet_idを検証するとき' do + it '数値でなければ失敗する' do + @sheet_panel.sheet_id = 'a' + @sheet_panel.should_not be_valid + end + end + + context 'panel_idを検証するとき' do + it '数値でなければ失敗する' do + @sheet_panel.panel_id = 'a' + @sheet_panel.should_not be_valid + end + end + + context 'xを検証するとき' do + it 'nullなら失敗する' do + @sheet_panel.x = nil + @sheet_panel.should_not be_valid + end + it '数値でなければ失敗する' do + @sheet_panel.x = 'a' + @sheet_panel.should_not be_valid + end + it '0なら通る' do + @sheet_panel.x = '0' + @sheet_panel.should be_valid + end + it '負でも通る' do + @sheet_panel.x = -1 + @sheet_panel.should be_valid + end + end + context 'yを検証するとき' do + it 'nullなら失敗する' do + @sheet_panel.y = nil + @sheet_panel.should_not be_valid + end + it '数値でなければ失敗する' do + @sheet_panel.y = 'a' + @sheet_panel.should_not be_valid + end + it '0なら通る' do + @sheet_panel.y = '0' + @sheet_panel.should be_valid + end + it '負でも通る' do + @sheet_panel.y = -1 + @sheet_panel.should be_valid + end + end + context 'zを検証するとき' do + it 'nullなら失敗する' do + @sheet_panel.z = nil + @sheet_panel.should_not be_valid + end + it '数値でなければ失敗する' do + @sheet_panel.z = 'a' + @sheet_panel.should_not be_valid + end + it '負なら失敗する' do + @sheet_panel.z = -1 + @sheet_panel.should_not be_valid + end + it '0なら失敗する' do + @sheet_panel.z = 0 + @sheet_panel.should_not be_valid + end + end + context 'tを検証するとき' do + it 'nullなら失敗する' do + @sheet_panel.t = nil + @sheet_panel.should_not be_valid + end + it '数値でなければ失敗する' do + @sheet_panel.t = 'a' + @sheet_panel.should_not be_valid + end + it '負なら失敗する' do + @sheet_panel.t = -1 + @sheet_panel.should_not be_valid + end + end + + context 'author_idを検証するとき' do + it 'nullなら失敗する' do + @sheet_panel.author_id = nil + @sheet_panel.should_not be_valid + end + it '数値でなければ失敗する' do + @sheet_panel.author_id = 'a' + @sheet_panel.should_not be_valid + end + it '存在する作家でなければ失敗する' do + @sheet_panel.author_id = 0 + @sheet_panel.should_not be_valid + end + end + context '全体を検証するとき' do + end + end + + describe 'デフォルト値補充に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + + #dbのデフォルト値が0だから明示的にnilにしないと追加ができない + it 'tをnilにする' do + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheet_panel.supply_default + @sheet_panel.t.should be_nil + end + + end + + describe '上書き補充に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + + context 'author_idを補充' do + it '問答無用でauthor_idを補充する' do + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheet_panel.author_id = nil + @sheet_panel.overwrite @author + @sheet_panel.author_id.should eq @author.id + end + end + + end + + describe '所持判定に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheeto = FactoryGirl.create :sheet, :author_id => @other_author.id + @panelo = FactoryGirl.create :panel, :author_id => @other_author.id + @sheet_panelo = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @sheeto.id, :panel_id => @panelo.id + end + context '事前チェックする' do + it '自身にロールリストからの作家取得を依頼している' do + SheetPanel.should_receive(:get_author_from_roles).with(any_args).exactly(1) + r = @sheet_panel.own?([@author]) + end + end + context 'ロール内作家が取得できるとき' do + before do + end + it 'ロール内作家のidが自身の作家idと一致するなら許可する' do + SheetPanel.stub(:get_author_from_roles).with(any_args).and_return(@author) + r = @sheet_panel.own?([@author]) + r.should be_true + end + it 'ロール内作家のidが自身の作家idと一致しないならno' do + SheetPanel.stub(:get_author_from_roles).with(any_args).and_return(@other_author) + @sheet_panel.own?(@other_author).should be_false + end + end + context 'ロール内作家が取得できないとき' do + before do + SheetPanel.stub(:get_author_from_roles).with(any_args).and_return(nil) + end + it 'Falseを返す' do + r = @sheet_panel.own?([@author]) + r.should be_false + end + end + end + + describe '閲覧許可に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + end + context 'オープンモードのとき' do + before do + MagicNumber['run_mode'] = 0 + end + it '自身にゲスト用ロールチェックを問い合わせしている' do + SheetPanel.any_instance.stub(:guest_role_check).and_return(true) + SheetPanel.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1) + r = @sheet_panel.visible?([@author]) + end + it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do + SheetPanel.any_instance.stub(:guest_role_check).and_return(false) + r = @sheet_panel.visible?([@author]) + r.should be_false + end + end + context 'クローズドモードのとき' do + before do + MagicNumber['run_mode'] = 1 + end + it '自身に読者用ロールチェックを問い合わせしている' do + SheetPanel.any_instance.stub(:reader_role_check).and_return(true) + SheetPanel.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1) + r = @sheet_panel.visible?([@author]) + end + it '読者用ロールチェックが失敗したとき、falseを返す' do + SheetPanel.any_instance.stub(:reader_role_check).and_return(false) + r = @sheet_panel.visible?([@author]) + r.should be_false + end + end + context '事前チェックする' do + before do + MagicNumber['run_mode'] = 1 + SheetPanel.any_instance.stub(:reader_role_check).and_return(true) + end + it '自身の用紙に所持判定を問い合わせしている' do + Sheet.any_instance.stub(:own?).and_return(true) + Sheet.any_instance.should_receive(:own?).with(any_args).exactly(1) + r = @sheet_panel.visible?([@author]) + end + it '自身の用紙に閲覧許可を問い合わせしている' do + Sheet.any_instance.stub(:own?).and_return(false) + Sheet.any_instance.stub(:visible?).and_return(true) + Sheet.any_instance.should_receive(:visible?).with(any_args).exactly(1) + r = @sheet_panel.visible?([@author]) + end + end + context 'つつがなく終わるとき' do + before do + MagicNumber['run_mode'] = 1 + SheetPanel.any_instance.stub(:reader_role_check).and_return(true) + end + it '自分の用紙の紙コマなら許可する' do + Sheet.any_instance.stub(:own?).and_return(true) + Sheet.any_instance.stub(:visible).and_return(0) + r = @sheet_panel.visible?([@author]) + r.should be_true + end + it '他人の非公開用紙の紙コマなら許可しない' do + Sheet.any_instance.stub(:own?).and_return(false) + Sheet.any_instance.stub(:visible).and_return(0) + r = @sheet_panel.visible?([@author]) + r.should be_false + end + it '他人の用紙の紙コマでも公開なら許可する' do + Sheet.any_instance.stub(:own?).and_return(false) + Sheet.any_instance.stub(:visible).and_return(1) + r = @sheet_panel.visible?([@author]) + r.should be_true + end + end + end + + describe 'プレイリスト取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @panel2 = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0 + @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1 + @other_panel = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1 + end + it 'リストを返す' do + c = SheetPanel.play_list @sheet, @author + c.should eq [@sheet_panel] + end + it 't順で並んでいる' do + #公開用紙の公開コマは(他人の用紙であっても)含んでいる + v = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 1 + c = SheetPanel.play_list @sheet, @author + c.should eq [ @sheet_panel, v] + end + it '非公開のコマは含んでいる' do + h = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel2.id, :t => 1 + c = SheetPanel.play_list @sheet, @author + c.should eq [ @sheet_panel, h] + end + end + + describe '一覧取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 1 + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1 + @other_panel = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1 + @hidden_sheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 0 + end + context 'page補正について' do + it '文字列から数値に変換される' do + SheetPanel.page('8').should eq 8 + end + it 'nilの場合は1になる' do + SheetPanel.page().should eq 1 + end + it '0以下の場合は1になる' do + SheetPanel.page('0').should eq 1 + end + end + context 'page_size補正について' do + it '文字列から数値に変換される' do + SheetPanel.page_size('7').should eq 7 + end + it 'nilの場合はSheetPanel.default_page_sizeになる' do + SheetPanel.page_size().should eq SheetPanel.default_page_size + end + it '0以下の場合はSheetPanel.default_page_sizeになる' do + SheetPanel.page_size('0').should eq SheetPanel.default_page_size + end + it 'SheetPanel.max_page_sizeを超えた場合はSheetPanel.max_page_sizeになる' do + SheetPanel.page_size('1000').should eq SheetPanel.max_page_size + end + end + it 'リストを返す' do + c = SheetPanel.list + c.should eq [@sheet_panel] + end + it '時系列で並んでいる' do + #公開用紙のSheetPanelは(他人のSheetPanelであっても)含んでいる + v = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 0, :updated_at => Time.now + 100 + c = SheetPanel.list + c.should eq [ v, @sheet_panel] + end + it '非公開の紙コマは(自分の紙コマであっても)含まない' do + h = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @hidden_sheet.id, :panel_id => @panel.id, :t => 0 + c = SheetPanel.list + c.should eq [ @sheet_panel] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 1, :updated_at => Time.now + 100 + @sheet_panel3 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 2, :updated_at => Time.now + 200 + @sheet_panel4 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 3, :updated_at => Time.now + 300 + @sheet_panel5 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 4, :updated_at => Time.now + 400 + end + it '通常は2件を返す' do + l = SheetPanel.list 1, 2 + l.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #時系列で並んでいる + l = SheetPanel.list 1, 2 + l.should eq [@sheet_panel5, @sheet_panel4] + end + it 'page=2なら中間2件を返す' do + l = SheetPanel.list 2, 2 + l.should eq [@sheet_panel3, @sheet_panel2] + end + it 'page=3なら先頭1件を返す' do + l = SheetPanel.list 3, 2 + l.should eq [@sheet_panel] + end + end + end + + describe '自分の紙コマ一覧取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 1 + @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1 + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1 + @other_panel = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1 + @hsheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 0 + @hpanel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0 + end + context 'つつがなく終わるとき' do + it '一覧取得オプションを利用している' do + SheetPanel.stub(:list_opt).with(any_args).and_return({}) + SheetPanel.should_receive(:list_opt).with(any_args).exactly(1) + r = SheetPanel.mylist @author + end + end + it 'リストを返す' do + s = SheetPanel.mylist @author + s.should eq [@sheet_panel] + end + it '時系列で並んでいる' do + ns = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 1, :updated_at => Time.now + 100 + sl = SheetPanel.mylist @author + sl.should eq [ns, @sheet_panel] + end + it '他人の紙コマはコマ用紙ともに公開でも含まない' do + so = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id + sl = SheetPanel.mylist @author + sl.should eq [@sheet_panel] + end + it '自分の紙コマはコマ用紙ともに非公開でも含んでいる' do + hs = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @hsheet.id, :panel_id => @hpanel.id, :updated_at => Time.now + 100 + sl = SheetPanel.mylist @author + sl.should eq [hs, @sheet_panel] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 1, :updated_at => Time.now + 100 + @sheet_panel3 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 2, :updated_at => Time.now + 200 + @sheet_panel4 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 3, :updated_at => Time.now + 300 + @sheet_panel5 = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 4, :updated_at => Time.now + 400 + SheetPanel.stub(:default_page_size).and_return(2) + end + it '通常は2件を返す' do + l = SheetPanel.mylist @author, 1, 2 + l.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #時系列で並んでいる + l = SheetPanel.mylist @author, 1, 2 + l.should eq [@sheet_panel5, @sheet_panel4] + end + it 'page=2なら中間2件を返す' do + l = SheetPanel.mylist @author, 2, 2 + l.should eq [@sheet_panel3, @sheet_panel2] + end + it 'page=3なら先頭1件を返す' do + l = SheetPanel.mylist @author, 3, 2 + l.should eq [@sheet_panel] + end + end + end + + describe '他作家の紙コマ一覧取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 1 + @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1 + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1 + @other_panel = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1 + @other_sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id + end + it 'リストを返す' do + r = SheetPanel.himlist @other_author + r.should eq [@other_sheet_panel] + end + it '時系列で並んでいる' do + ns = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 1, :updated_at => Time.now + 100 + r = SheetPanel.himlist @other_author + r.should eq [ns, @other_sheet_panel] + end + it '公開用紙の紙コマ' do + @hsheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 0 + ns = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @hsheet.id, :panel_id => @other_panel.id, :t => 1, :updated_at => Time.now + 100 + r = SheetPanel.himlist @other_author + r.should eq [@other_sheet_panel] + end + context 'DBに5件あって1ページの件数を2件に変えたとして' do + before do + @other_sheet_panel2 = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 1, :updated_at => Time.now + 100 + @other_sheet_panel3 = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 2, :updated_at => Time.now + 200 + @other_sheet_panel4 = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 3, :updated_at => Time.now + 300 + @other_sheet_panel5 = FactoryGirl.create :sheet_panel, :author_id => @other_author.id, :sheet_id => @other_sheet.id, :panel_id => @other_panel.id, :t => 4, :updated_at => Time.now + 400 + SheetPanel.stub(:default_page_size).and_return(2) + end + it '通常は2件を返す' do + l = SheetPanel.himlist @other_author, 1, 2 + l.should have(2).items + end + it 'page=1なら末尾2件を返す' do + #時系列で並んでいる + l = SheetPanel.himlist @other_author, 1, 2 + l.should eq [@other_sheet_panel5, @other_sheet_panel4] + end + it 'page=2なら中間2件を返す' do + l = SheetPanel.himlist @other_author, 2, 2 + l.should eq [@other_sheet_panel3, @other_sheet_panel2] + end + it 'page=3なら先頭1件を返す' do + l = SheetPanel.himlist @other_author, 3, 2 + l.should eq [@other_sheet_panel] + end + end + end + + describe '紙コマ一覧ページ制御に於いて' do + before do + SheetPanel.stub(:count).with(any_args).and_return(100) + end + it 'ページ制御を返す' do + r = SheetPanel.list_paginate + r.is_a?(Kaminari::PaginatableArray).should be_true + end + it '紙コマ一覧の取得条件を利用している' do + SheetPanel.stub(:list_where).with(any_args).and_return('') + SheetPanel.should_receive(:list_where).with(any_args).exactly(1) + r = SheetPanel.list_paginate + end + it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do + r = SheetPanel.list_paginate 3, 10 + r.limit_value.should eq 10 + r.offset_value.should eq 20 + end + end + + describe '自分の紙コマ一覧ページ制御に於いて' do + before do + SheetPanel.stub(:count).with(any_args).and_return(100) + end + it 'ページ制御を返す' do + r = SheetPanel.mylist_paginate @author + r.is_a?(Kaminari::PaginatableArray).should be_true + end + it '自分の紙コマ一覧の取得条件を利用している' do + SheetPanel.stub(:mylist_where).with(any_args).and_return('') + SheetPanel.should_receive(:mylist_where).with(any_args).exactly(1) + r = SheetPanel.mylist_paginate @author + end + it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do + r = SheetPanel.mylist_paginate @author, 3, 10 + r.limit_value.should eq 10 + r.offset_value.should eq 20 + end + end + + describe '他作家の紙コマ一覧ページ制御に於いて' do + before do + SheetPanel.stub(:count).with(any_args).and_return(100) + end + it 'ページ制御を返す' do + r = SheetPanel.himlist_paginate @other_author + r.is_a?(Kaminari::PaginatableArray).should be_true + end + it '他作家の紙コマ一覧の取得条件を利用している' do + SheetPanel.stub(:himlist_where).with(any_args).and_return('') + SheetPanel.should_receive(:himlist_where).with(any_args).exactly(1) + r = SheetPanel.himlist_paginate @other_author + end + it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do + r = SheetPanel.himlist_paginate @other_author, 3, 10 + r.limit_value.should eq 10 + r.offset_value.should eq 20 + end + end + + describe 'list関連テーブルプションに於いて' do + it '3つの項目を含んでいる' do + r = SheetPanel.list_opt + r.should have(3).items + end + it '用紙を含んでいる' do + r = SheetPanel.list_opt + r.has_key?(:sheet).should be_true + end + it '用紙は作家を含んでいる' do + r = SheetPanel.list_opt + r[:sheet].has_key?(:author).should be_true + end + it '作家を含んでいる' do + r = SheetPanel.list_opt + r.has_key?(:author).should be_true + end + it 'コマを含んでいる' do + r = SheetPanel.list_opt + r.has_key?(:panel).should be_true + end + it 'コマは作家を含んでいる' do + r = SheetPanel.list_opt + r[:panel].has_key?(:author).should be_true + end + it 'コマはコマ絵を含んでいる' do + r = SheetPanel.list_opt + r[:panel].has_key?(:panel_pictures).should be_true + end + it 'コマ絵は実素材を含んでいる' do + r = SheetPanel.list_opt + r[:panel][:panel_pictures].has_key?(:picture).should be_true + end + it '実素材は絵師を含んでいる' do + r = SheetPanel.list_opt + r[:panel][:panel_pictures][:picture].has_key?(:artist).should be_true + end + it '実素材はライセンスを含んでいる' do + r = SheetPanel.list_opt + r[:panel][:panel_pictures][:picture].has_key?(:license).should be_true + end + it 'コマはフキダシを含んでいる' do + r = SheetPanel.list_opt + r[:panel].has_key?(:speech_balloons).should be_true + end + it 'フキダシはフキダシ枠を含んでいる' do + r = SheetPanel.list_opt + r[:panel][:speech_balloons].has_key?(:balloon).should be_true + end + it 'フキダシはセリフを含んでいる' do + r = SheetPanel.list_opt + r[:panel][:speech_balloons].has_key?(:speech).should be_true + end + end + describe 'json一覧出力オプションに於いて' do + end + + describe '単体取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + SheetPanel.stub(:show_opt).with(any_args).and_return({}) + SheetPanel.should_receive(:show_opt).with(any_args).exactly(1) + r = SheetPanel.show @sheet_panel.id, @author + end + it '閲覧許可を問い合わせている' do + SheetPanel.any_instance.stub(:visible?).with(@author).and_return(true) + SheetPanel.any_instance.should_receive(:visible?).with(@author).exactly(1) + r = SheetPanel.show @sheet_panel.id, @author + end + end + it '指定の紙コマを返す' do + l = SheetPanel.show @sheet_panel.id, @author + l.should eq @sheet_panel + end + context '他人の紙コマを開こうとしたとき' do + it '403Forbidden例外を返す' do + SheetPanel.any_instance.stub(:visible?).with(@other_author).and_return(false) + lambda{ + SheetPanel.show @sheet_panel.id, @other_author + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない紙コマを開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + SheetPanel.show 110, @author + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + + describe '編集取得に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + end + context 'つつがなく終わるとき' do + it '単体取得オプションを利用している' do + SheetPanel.stub(:show_opt).with(any_args).and_return({}) + SheetPanel.should_receive(:show_opt).with(any_args).exactly(1) + r = SheetPanel.edit @sheet_panel.id, @author + end + it '所持判定を問い合わせている' do + SheetPanel.any_instance.stub(:own?).with(any_args).and_return(true) + SheetPanel.any_instance.should_receive(:own?).with(any_args).exactly(1) + r = SheetPanel.edit @sheet_panel.id, @author + end + end + it '指定の紙コマを返す' do + l = SheetPanel.edit @sheet_panel.id, @author + l.should eq @sheet_panel + end + context '他人の紙コマを開こうとしたとき' do + it '403Forbidden例外を返す' do + SheetPanel.any_instance.stub(:own?).and_return(false) + lambda{ + SheetPanel.edit @sheet_panel.id, @author + }.should raise_error(ActiveRecord::Forbidden) + end + end + context '存在しない紙コマを開こうとしたとき' do + it '404RecordNotFound例外を返す' do + lambda{ + SheetPanel.edit 110, @author + }.should raise_error(ActiveRecord::RecordNotFound) + end + end + end + + describe '単体取得オプションに於いて' do + it 'includeキーを含んでいる' do + r = SheetPanel.show_opt + r.has_key?(:include).should be_true + end + it '3つの項目を含んでいる' do + r = SheetPanel.show_opt[:include] + r.should have(3).items + end + it '用紙を含んでいる' do + r = SheetPanel.show_opt[:include] + r.has_key?(:sheet).should be_true + end + it '用紙は作家を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:sheet].has_key?(:author).should be_true + end + it '作家を含んでいる' do + r = SheetPanel.show_opt[:include] + r.has_key?(:author).should be_true + end + it 'コマを含んでいる' do + r = SheetPanel.show_opt[:include] + r.has_key?(:panel).should be_true + end + it 'コマは作家を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel].has_key?(:author).should be_true + end + it 'コマはコマ絵を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel].has_key?(:panel_pictures).should be_true + end + it 'コマ絵は実素材を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel][:panel_pictures].has_key?(:picture).should be_true + end + it '実素材は絵師を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel][:panel_pictures][:picture].has_key?(:artist).should be_true + end + it '実素材はライセンスを含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel][:panel_pictures][:picture].has_key?(:license).should be_true + end + it 'コマはフキダシを含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel].has_key?(:speech_balloons).should be_true + end + it 'フキダシはフキダシ枠を含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel][:speech_balloons].has_key?(:balloon).should be_true + end + it 'フキダシはセリフを含んでいる' do + r = SheetPanel.show_opt[:include] + r[:panel][:speech_balloons].has_key?(:speech).should be_true + end + end + describe 'json単体取得オプションに於いて' do + end + + describe '紙コマのjson出力に於いて' do + before do + #コマを作成しておく。 + @panel = FactoryGirl.create :panel, :author_id => @author.id + @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height + @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id + @speech = @sb.build_speech( + FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id) + ) + @balloon = @sb.build_balloon( + FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id) + ) + @sb.boost + @sb.save! + @gc = @panel.ground_colors.create( + FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id) + ) + @gp = @panel.ground_pictures.create( + FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id) + ) + @panel.reload + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + end + context '事前チェックする' do + before do + Panel.any_instance.stub(:elements).and_return('{}') + end + it 'コマ要素のjson出力を依頼している' do + Panel.any_instance.stub(:visible?).with(any_args).and_return(true) + Panel.any_instance.should_receive(:elements).with(any_args).exactly(1) + r = @sheet_panel.sheet_panel_as_json @author + end + end + it 'json textを返している' do + r = JSON.parse @sheet_panel.sheet_panel_as_json(@author) + r.is_a?(Hash).should be_true + end + it 'sheet,author,panel,コマ要素を含んでいる' do + r = JSON.parse @sheet_panel.sheet_panel_as_json(@author) + r.has_key?('sheet').should be_true + r['sheet'].has_key?('author').should be_true + r.has_key?('author').should be_true + r.has_key?('panel').should be_true + r['panel'].has_key?('author').should be_true + end + context 'コマ閲覧許可のとき' do + before do + Panel.any_instance.stub(:visible?).with(any_args).and_return(true) + end + it 'コマ要素にコマ要素を追加している' do + r = JSON.parse @sheet_panel.sheet_panel_as_json(@author) + r['panel'].has_key?('elements').should be_true + r['panel']['elements'].should_not be_empty + end + end + context 'コマ閲覧不許可のとき' do + before do + Panel.any_instance.stub(:visible?).with(any_args).and_return(false) + end + it 'コマ要素にデータを含ませない' do + r = JSON.parse @sheet_panel.sheet_panel_as_json(@author) + r['panel'].has_key?('elements').should be_false + end + end + end + + describe '紙コマリストのjson出力に於いて' do + before do + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + SheetPanel.any_instance.stub(:sheet_panel_as_json).with(@author).and_return('{"s": 5}') + end + context 'つつがなく終わるとき' do + it '紙コマのjson出力を依頼している' do + SheetPanel.any_instance.should_receive(:sheet_panel_as_json).with(@author).exactly(1) + r = SheetPanel.list_as_json_text [@sheet_panel], @author + end + end + it 'json textを返している' do + r = SheetPanel.list_as_json_text [@sheet_panel], @author + j = JSON.parse r + j.is_a?(Array).should be_true + end + it '紙コマを含んでいる' do + r = SheetPanel.list_as_json_text [@sheet_panel], @author + j = JSON.parse r + j.first.has_key?('s').should be_true + end + end + + describe 't補充値に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + + context '用紙初のコマなら' do + it '0を補充値とする' do + @sheet_panel = FactoryGirl.build :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheet_panel.t = nil + r = SheetPanel.new_t @sheet_panel.sheet_id + r.should eq 0 + end + end + context '用紙に一個コマがあるとき' do + it '1を補充値とする' do + FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 0 + @sheet_panel = FactoryGirl.build :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheet_panel.t = nil + r = SheetPanel.new_t @sheet_panel.sheet_id + r.should eq 1 + end + end + context '用紙に2個コマがあるとき' do + it '2を補充値とする' do + FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 0 + FactoryGirl.create :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id, :t => 1 + @sheet_panel = FactoryGirl.build :sheet_panel, :author_id => @author.id, :sheet_id => @sheet.id, :panel_id => @panel.id + @sheet_panel.t = nil + r = SheetPanel.new_t @sheet_panel.sheet_id + r.should eq 2 + end + end + end + describe 'シリアライズチェックに於いて' do + context 'つつがなく終わるとき' do + it '0からシリアライズされているならTrueを返す' do + r = SheetPanel.serial? [0, 1, 2] + r.should be_true + end + it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do + r = SheetPanel.serial? [0, 2, 1] + r.should be_true + end + it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do + r = SheetPanel.serial? [ 2, 1, 4, 3, 0] + r.should be_true + end + end + context '異常なとき' do + it '0から始まらないならFalseを返す' do + r = SheetPanel.serial? [1, 2, 3] + r.should be_false + end + it '連続していないならFalseを返す' do + r = SheetPanel.serial? [0, 1, 2, 4] + r.should be_false + end + it '連続していないならFalseを返す' do + r = SheetPanel.serial? [0, 1, 2, 4, 5] + r.should be_false + end + end + end + describe 't収集に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @c2sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + end + context 'つつがなく終わるとき' do + it '紙コマから同一用紙のtだけを収集している' do + r = SheetPanel.collect_t @sheet_panel + r.should eq [0] + end + end + context '複数コマのとき' do + it '紙コマから同一用紙のtだけを収集している' do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + r = SheetPanel.collect_t @sheet_panel + r.sort.should eq [0, 1] + end + end + context '複数コマでヨソの用紙も混じっているとき' do + it '紙コマから同一用紙のtだけを収集している' do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + r = SheetPanel.collect_t @sheet_panel + r.sort.should eq [0, 1] + end + end + end + describe 'tチェックに於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.build :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + context 'つつがなく終わるとき' do + it 't収集を依頼している' do + SheetPanel.should_receive(:collect_t).with(any_args).exactly(1) + SheetPanel.stub(:collect_t).with(any_args).and_return([]) + SheetPanel.stub(:serial?).with(any_args).and_return(true) + r = SheetPanel.validate_t @sheet_panel + end + it '収集したtをシリアライズチェック依頼している' do + SheetPanel.stub(:collect_t).with(any_args).and_return([]) + SheetPanel.should_receive(:serial?).with(any_args).exactly(1) + SheetPanel.stub(:serial?).with(any_args).and_return(true) + r = SheetPanel.validate_t @sheet_panel + end + end + #実データでチェック + #依頼チェックだけでは不安なので最低限のチェックを + context '新規のとき' do + it '一件だけで正常通過している' do + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id, :t => 0 + r = SheetPanel.validate_t @sheet_panel + r.should be_true + end + end + context '既存のとき' do + it '2件目を作っても正常通過している' do + @sheet_panel = FactoryGirl.create :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id, :t => 0 + @sheet_panel2 = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id, :t => 1 + r = SheetPanel.validate_t @sheet_panel2 + r.should be_true + end + end + end + describe '挿入シフトに於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + context '依頼チェック' do + #テーブルが空で0に挿入 + it 'Updateを依頼している' do + SheetPanel.stub(:update_all).with(any_args) + SheetPanel.should_receive(:update_all).with(any_args).exactly(1) + @sheet_panel = FactoryGirl.build :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel.insert_shift + end + end + context 'テーブルに1件(t:0)で0に挿入したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.build :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存の行を1にシフトしている' do + @sheet_panel2.insert_shift + l = SheetPanel.find :all + l.first.t.should eq 1 + end + it 'これから挿入するt(0)が欠番になっている' do + @sheet_panel2.insert_shift + l = SheetPanel.find(:all).map {|s| s.t } + l.include?(0).should_not be_true + end + end + context 'テーブルに2件(t:0,1)で1に挿入したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.build :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do + @sheet_panel3.insert_shift + l = SheetPanel.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 + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel6 = FactoryGirl.build :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do + @sheet_panel6.insert_shift + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 1, 3, 4, 5] + end + end + context '先ほどのケース+他の用紙1件で挿入したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel6 = FactoryGirl.build :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do + @sheet_panel6.insert_shift + l = SheetPanel.find(:all, :conditions => ['sheet_id = ?', @sheet.id]).map {|s| s.t } + l.sort.should eq [0, 1, 3, 4, 5] + end + it '他の用紙に影響がない' do + ot = @sheet_panelc2.t + @sheet_panel6.insert_shift + @sheet_panelc2.reload + @sheet_panelc2.t.should eq ot + end + end + end + describe '少ない方に移動に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + context '依頼チェック' do + it 'Updateを依頼している' do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.stub(:update_all).with(any_args) + SheetPanel.should_receive(:update_all).with(any_args).exactly(1) + ot = @sheet_panel2.t + @sheet_panel2.t = 0 + @sheet_panel2.lesser_shift ot + end + end + context 'テーブルに2件(t:0,1)で1を0に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel2.t + @sheet_panel2.t = 0 + end + it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel2.lesser_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [1, 1] + end + it '既存のt0を1にシフトしている' do + @sheet_panel2.lesser_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 1 + end + end + context 'テーブルに3件(t:0,1,2)で2を1に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel3.t + @sheet_panel3.t = 1 + end + it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel3.lesser_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 2, 2] + end + it '既存のt1を2にシフトしている' do + @sheet_panel3.lesser_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 2 + end + end + context 'テーブルに5件(t:0,1,2,3,4)で3を1に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel4.t + @sheet_panel4.t = 1 + end + it 'これから挿入するt(1)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel4.lesser_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 2, 3, 3, 4] + end + it '既存のt0には変化がない' do + @sheet_panel4.lesser_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel4.lesser_shift @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt1を2にシフトしている' do + @sheet_panel4.lesser_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 2 + end + it '既存のt2を3にシフトしている' do + @sheet_panel4.lesser_shift @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 3 + end + end + context '先ほどのケース+他の用紙1件で挿入したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel4.t + @sheet_panel4.t = 1 + end + it 'これから挿入するt(1)が欠番になっている' do + @sheet_panel4.lesser_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 0, 2, 3, 3, 4] + end + it '既存のt0には変化がない' do + @sheet_panel4.lesser_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel4.lesser_shift @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt1を2にシフトしている' do + @sheet_panel4.lesser_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 2 + end + it '既存のt2を3にシフトしている' do + @sheet_panel4.lesser_shift @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 3 + end + it '他の用紙に影響がない' do + @sheet_panel4.lesser_shift @ot + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + end + #例外ケース。 + #負のときは0として正常扱い + context 'テーブルに2件(t:0,1)で1を-1に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel2.t + @sheet_panel2.t = -1 + end + it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel2.lesser_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [1, 1] + end + it '既存のt0を1にシフトしている' do + @sheet_panel2.lesser_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 1 + end + it '既存のt1は0に補正されている' do + @sheet_panel2.lesser_shift @ot + @sheet_panel2.t.should eq 0 + end + end + end + describe '大きい方に移動に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + context '依頼チェック' do + it 'Updateを依頼している' do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.stub(:update_all).with(any_args) + SheetPanel.should_receive(:update_all).with(any_args).exactly(1) + ot = @sheet_panel.t + @sheet_panel.t = 1 + @sheet_panel.higher_shift ot + end + end + context 'テーブルに2件(t:0,1)で0を1に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel.t + @sheet_panel.t = 1 + end + it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel.higher_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 0] + end + it '既存のt1を0にシフトしている' do + @sheet_panel.higher_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 0 + end + end + context 'テーブルに3件(t:0,1,2)で0を1に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel.t + @sheet_panel.t = 1 + end + it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel.higher_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 0, 2] + end + it '既存のt1を0にシフトしている' do + @sheet_panel.higher_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 0 + end + end + context 'テーブルに5件(t:0,1,2,3,4)で1を3に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel2.t + @sheet_panel2.t = 3 + end + it 'これから挿入するt(3)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel2.higher_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 1, 1, 2, 4] + end + it '既存のt0には変化がない' do + @sheet_panel2.higher_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel2.higher_shift @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt2を1にシフトしている' do + @sheet_panel2.higher_shift @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 1 + end + it '既存のt3を2にシフトしている' do + @sheet_panel2.higher_shift @ot + @sheet_panel4.reload + @sheet_panel4.t.should eq 2 + end + end + context '先ほどのケース+他の用紙1件で挿入したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel2.t + @sheet_panel2.t = 3 + end + it 'これから挿入するt(3)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel2.higher_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 0, 1, 1, 2, 4] + end + it '既存のt0には変化がない' do + @sheet_panel2.higher_shift @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel2.higher_shift @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt2を1にシフトしている' do + @sheet_panel2.higher_shift @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 1 + end + it '既存のt3を2にシフトしている' do + @sheet_panel2.higher_shift @ot + @sheet_panel4.reload + @sheet_panel4.t.should eq 2 + end + it '他の用紙に影響がない' do + @sheet_panel2.higher_shift @ot + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + end + #例外ケース。 + #max超えたときはmaxとして正常扱い + context 'テーブルに2件(t:0,1)で0を2に移動したとき' do + before do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel.t + @sheet_panel.t = 2 + end + it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do + #移動させたい行はそのまま残る + @sheet_panel.higher_shift @ot + l = SheetPanel.find(:all).map {|s| s.t } + l.sort.should eq [0, 0] + end + it '既存のt1を0にシフトしている' do + @sheet_panel.higher_shift @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 0 + end + it '既存のt0は1に補正されている' do + @sheet_panel.higher_shift @ot + @sheet_panel.t.should eq 1 + end + end + end + describe '入れ替えに於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + context '新tが旧tより小さいとき' do + it '少ない方に移動を依頼している' do + SheetPanel.any_instance.stub(:lesser_shift).with(any_args) + SheetPanel.any_instance.should_receive(:lesser_shift).with(any_args).exactly(1) + ot = @sheet_panel2.t + @sheet_panel2.t = 0 + @sheet_panel2.update_shift ot + end + end + context '新tが旧tより大きいとき' do + it '大きい方に移動を依頼している' do + SheetPanel.any_instance.stub(:higher_shift).with(any_args) + SheetPanel.any_instance.should_receive(:higher_shift).with(any_args).exactly(1) + ot = @sheet_panel.t + @sheet_panel.t = 1 + @sheet_panel.update_shift ot + end + end + end + describe '順序入れ替えに於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + end + context 'オブジェクトが新規でtが空のとき' do + it '末尾追加としてtを補充依頼している' do + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.stub(:new_t).with(any_args).and_return(0) + SheetPanel.should_receive(:new_t).with(any_args).exactly(1) + @sheet_panel.t = nil + r = @sheet_panel.rotate + end + end + context 'オブジェクトが新規でtが設定されているとき' do + it '挿入追加として挿入シフトを依頼している' do + @sheet_panel = FactoryGirl.build :sheet_panel, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.any_instance.stub(:insert_shift).with(any_args) + SheetPanel.any_instance.should_receive(:insert_shift).with(any_args).exactly(1) + @sheet_panel.t = 0 + r = @sheet_panel.rotate + end + end + context 'オブジェクトが新規でなくtが設定されているとき' do + it 'コマ移動として入れ替えを依頼している' do + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.any_instance.stub(:update_shift).with(any_args) + SheetPanel.any_instance.should_receive(:update_shift).with(1).exactly(1) + @sheet_panel2.t = 0 + r = @sheet_panel.rotate 1 + end + end + context 'オブジェクトが新規でなくtが空のとき' do + it '入れ替えもシフトもせず、tを空のままにしている' do + #結果、tに欠番が生じてシリアライズチェックでひっかかる + end + end + end + describe '編集許可に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.build :sheet_panel, :t => nil, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + context 'つつがなく終わるとき' do + it 'trueを返す' do + r = @sheet_panel.allow? + r.should be_true + end + end + context '用紙で引っかかるとき' do + it 'falseを返す' do + Panel.any_instance.stub(:usable?).with(any_args).and_return(true) + Sheet.any_instance.stub(:own?).with(any_args).and_return(false) + r = @sheet_panel.allow? + r.should be_false + end + end + context 'コマで引っかかるとき' do + it 'falseを返す' do + Sheet.any_instance.stub(:own?).with(any_args).and_return(true) + Panel.any_instance.stub(:usable?).with(any_args).and_return(false) + r = @sheet_panel.allow? + r.should be_false + end + end + context '用紙またはコマが指定されていなかったとき' do + it 'nilを返す' do + Sheet.any_instance.stub(:own?).with(any_args).and_return(true) + @sheet_panel.panel_id = nil + r = @sheet_panel.allow? + r.should eq nil + end + it 'nilを返す' do + Panel.any_instance.stub(:usable?).with(any_args).and_return(true) + @sheet_panel.sheet_id = nil + r = @sheet_panel.allow? + r.should eq nil + end + end + end + describe '保存に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.build :sheet_panel, :t => nil, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + context 'つつがなく終わるとき' do + it '編集許可チェックを依頼している' do + SheetPanel.any_instance.stub(:allow?).with(any_args).and_return(true) + SheetPanel.any_instance.should_receive(:allow?).with(any_args).exactly(1) + r = @sheet_panel.store + end + it '順序入れ替えを依頼している' do + SheetPanel.any_instance.stub(:rotate).with(any_args).and_return(0) + SheetPanel.any_instance.should_receive(:rotate).with(any_args).exactly(1) + SheetPanel.any_instance.stub(:save).with(any_args).and_return(true) + SheetPanel.stub(:validate_t).with(any_args).and_return(true) + r = @sheet_panel.store + end + it '保存を依頼している' do + SheetPanel.stub(:new_t).with(any_args).and_return(0) + SheetPanel.any_instance.stub(:save).with(any_args).and_return(true) + SheetPanel.any_instance.should_receive(:save).with(any_args).exactly(1) + SheetPanel.stub(:validate_t).with(any_args).and_return(true) + r = @sheet_panel.store + end + it 'tのシリアライズチェックを依頼している' do + SheetPanel.stub(:new_t).with(any_args).and_return(0) + SheetPanel.any_instance.stub(:save).with(any_args).and_return(true) + SheetPanel.stub(:validate_t).with(any_args).and_return(true) + SheetPanel.should_receive(:validate_t).with(any_args).exactly(1) + r = @sheet_panel.store + end + end + #入れ替えテストと同じテストを実施。こちらはシフトだけでなく本尊も更新されている + context 'テーブルに5件(t:0,1,2,3,4)+他の用紙1件で2に挿入したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel6 = FactoryGirl.build :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存のt0には変化がない' do + @sheet_panel6.store + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt1には変化がない' do + @sheet_panel6.store + @sheet_panel2.reload + @sheet_panel2.t.should eq 1 + end + it '既存のt2を3にシフトしている' do + @sheet_panel6.store + @sheet_panel3.reload + @sheet_panel3.t.should eq 3 + end + it '既存のt3を4にシフトしている' do + @sheet_panel6.store + @sheet_panel4.reload + @sheet_panel4.t.should eq 4 + end + it '既存のt5を5にシフトしている' do + @sheet_panel6.store + @sheet_panel5.reload + @sheet_panel5.t.should eq 5 + end + it '新規のt2が作成されている' do + @sheet_panel6.store + @sheet_panel6.reload + @sheet_panel6.t.should eq 2 + end + it '他の用紙に影響がない' do + @ot = @sheet_panelc2.t + @sheet_panel6.store + @sheet_panelc2.reload + @sheet_panelc2.t.should eq @ot + end + end + context 'テーブルに5件(t:0,1,2,3,4)+他の用紙1件で3を1に移動したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel4.t + @sheet_panel4.t = 1 + end + it '既存のt0には変化がない' do + @sheet_panel4.store @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel4.store @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt1を2にシフトしている' do + @sheet_panel4.store @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 2 + end + it '既存のt2を3にシフトしている' do + @sheet_panel4.store @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 3 + end + it '既存のt3を1にシフトしている' do + @sheet_panel4.store @ot + @sheet_panel4.reload + @sheet_panel4.t.should eq 1 + end + it '他の用紙に影響がない' do + @sheet_panel4.store @ot + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + end + context 'テーブルに5件(t:0,1,2,3,4)+他の用紙1件で1を3に移動したとき' do + before do + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel2.t + @sheet_panel2.t = 3 + end + it '既存のt0には変化がない' do + @sheet_panel2.store @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '既存のt4には変化がない' do + @sheet_panel2.store @ot + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + end + it '既存のt1を3にシフトしている' do + @sheet_panel2.store @ot + @sheet_panel2.reload + @sheet_panel2.t.should eq 3 + end + it '既存のt2を1にシフトしている' do + @sheet_panel2.store @ot + @sheet_panel3.reload + @sheet_panel3.t.should eq 1 + end + it '既存のt3を2にシフトしている' do + @sheet_panel2.store @ot + @sheet_panel4.reload + @sheet_panel4.t.should eq 2 + end + it '他の用紙に影響がない' do + @sheet_panel2.store @ot + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + end + #ロールバックテスト。入れ替えが直接DBをいじるので、すべてのケースで確実にロールバックを確認する + context 'テーブルに5件(t:0,1,2,3,4)+他の用紙1件で2に挿入したが保存に失敗したとき' do + before do + SheetPanel.any_instance.stub(:save).with(any_args).and_return(false) + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel6 = FactoryGirl.build :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '既存のtに変化がない' do + @sheet_panel6.store + @sheet_panel.reload + @sheet_panel.t.should eq 0 + @sheet_panel2.reload + @sheet_panel2.t.should eq 1 + @sheet_panel3.reload + @sheet_panel3.t.should eq 2 + @sheet_panel4.reload + @sheet_panel4.t.should eq 3 + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + it 'falseを返す' do + r = @sheet_panel6.store + r.should be_false + end + end + context 'テーブルに5件(t:0,1,2,3,4)+他の用紙1件で3を1に移動したがシリアルチェックに失敗したとき' do + before do + SheetPanel.stub(:validate_t).with(any_args).and_return(false) + @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id + @sheet_panelc2 = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet2.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @ot = @sheet_panel4.t + @sheet_panel4.t = 1 + end + it '既存のtに変化がない' do + @sheet_panel4.store @ot + @sheet_panel.reload + @sheet_panel.t.should eq 0 + @sheet_panel2.reload + @sheet_panel2.t.should eq 1 + @sheet_panel3.reload + @sheet_panel3.t.should eq 2 + @sheet_panel4.reload + @sheet_panel4.t.should eq 3 + @sheet_panel5.reload + @sheet_panel5.t.should eq 4 + @sheet_panelc2.reload + @sheet_panelc2.t.should eq 0 + end + it 'falseを返す' do + r = @sheet_panel4.store @ot + r.should be_false + end + it 'tにエラーメッセージが入っている' do + @sheet_panel4.store @ot + @sheet_panel4.errors[:t].should_not be_empty + @sheet_panel4.valid?.should be_true + end + end + context '編集不可だったとき' do + before do + @sheet_panel = FactoryGirl.build :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + SheetPanel.any_instance.stub(:allow?).and_return(false) + end + it '403Forbidden例外を返す' do + lambda{ + @sheet_panel.store + }.should raise_error(ActiveRecord::Forbidden) + end + end + end + describe '切り詰め処理つき削除に於いて' do + before do + @sheet = FactoryGirl.create :sheet, :author_id => @author.id + @panel = FactoryGirl.create :panel, :author_id => @author.id + @sheet_panel = FactoryGirl.create :sheet_panel, :t => 0, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + context 'つつがなく終わるとき' do + it '削除される' do + lambda{ + @sheet_panel.destroy_and_shorten + }.should change(SheetPanel, :count ).by(-1) + end + it 'Trueを返す' do + r = @sheet_panel.destroy_and_shorten + r.should be_true + end + end + context '削除に失敗したとき' do + before do + SheetPanel.any_instance.stub(:destroy).and_return(false) + end + it 'ロールバックされる' do + lambda{ + @sheet_panel.destroy_and_shorten + }.should_not change(SheetPanel, :count ) + end + it 'Falseを返す' do + r = @sheet_panel.destroy_and_shorten + r.should be_false + end + end + #連携テスト。切り詰めが直接DBをいじる + context '2件で先頭を削除したとき' do + before do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '行が削除される' do + lambda{ + @sheet_panel.destroy_and_shorten + }.should change(SheetPanel, :count ).by(-1) + end + it '先頭は削除される' do + @sheet_panel.destroy_and_shorten + lambda{ + SheetPanel.find @sheet_panel.id + }.should raise_error(ActiveRecord::RecordNotFound) + end + it '2件目は前に詰められる' do + @sheet_panel.destroy_and_shorten + @sheet_panel2.reload + @sheet_panel2.t.should eq 0 + end + end + context '3件で先頭を削除したとき' do + before do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '行が削除される' do + lambda{ + @sheet_panel.destroy_and_shorten + }.should change(SheetPanel, :count ).by(-1) + end + it '先頭は削除される' do + @sheet_panel.destroy_and_shorten + lambda{ + SheetPanel.find @sheet_panel.id + }.should raise_error(ActiveRecord::RecordNotFound) + end + it '2件目は前に詰められる' do + @sheet_panel.destroy_and_shorten + @sheet_panel2.reload + @sheet_panel2.t.should eq 0 + end + it '3件目は前に詰められる' do + @sheet_panel.destroy_and_shorten + @sheet_panel3.reload + @sheet_panel3.t.should eq 1 + end + end + context '5件で3件目を削除したとき' do + before do + @sheet_panel2 = FactoryGirl.create :sheet_panel, :t => 1, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel3 = FactoryGirl.create :sheet_panel, :t => 2, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel4 = FactoryGirl.create :sheet_panel, :t => 3, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + @sheet_panel5 = FactoryGirl.create :sheet_panel, :t => 4, :sheet_id => @sheet.id, :panel_id => @panel.id, :author_id => @author.id + end + it '行が削除される' do + lambda{ + @sheet_panel3.destroy_and_shorten + }.should change(SheetPanel, :count ).by(-1) + end + it '1件目は変化がない' do + @sheet_panel3.destroy_and_shorten + @sheet_panel.reload + @sheet_panel.t.should eq 0 + end + it '2件目は変化がない' do + @sheet_panel3.destroy_and_shorten + @sheet_panel2.reload + @sheet_panel2.t.should eq 1 + end + it '3件目は削除される' do + @sheet_panel3.destroy_and_shorten + lambda{ + SheetPanel.find @sheet_panel3.id + }.should raise_error(ActiveRecord::RecordNotFound) + end + it '4件目は前に詰められる' do + @sheet_panel3.destroy_and_shorten + @sheet_panel4.reload + @sheet_panel4.t.should eq 2 + end + it '5件目は前に詰められる' do + @sheet_panel3.destroy_and_shorten + @sheet_panel5.reload + @sheet_panel5.t.should eq 3 + end + end + #ロールバックテスト。切り詰めが直接DBをいじるので、すべてのケースで確実にロールバックを確認する + end +end