+ it '単体取得オプションを利用している' do\r
+ Panel.stub(:show_opt).with(any_args).and_return({})\r
+ Panel.should_receive(:show_opt).with(any_args).exactly(1)\r
+ r = Panel.show @panel.id, @author\r
+ end\r
+ it '閲覧許可を問い合わせている' do\r
+ Panel.any_instance.stub(:visible?).with(any_args).and_return(true)\r
+ Panel.any_instance.should_receive(:visible?).with(any_args).exactly(1)\r
+ r = Panel.show @panel.id, @author\r
+ end\r
+ end\r
+ it '指定のコマを返す' do\r
+ Panel.any_instance.stub(:visible?).and_return(true)\r
+ pl = Panel.show @panel.id, @author\r
+ pl.should eq @panel\r
+ end\r
+ context '閲覧許可が出なかったとき' do\r
+ it '403Forbidden例外を返す' do\r
+ Panel.any_instance.stub(:visible?).and_return(false)\r
+ lambda{\r
+ Panel.show @panel.id, @author\r
+ }.should raise_error(ActiveRecord::Forbidden)\r
+ end\r
+ end\r
+ context '存在しないコマを開こうとしたとき' do\r
+ it '404RecordNotFound例外を返す' do\r
+ lambda{\r
+ Panel.show 110, @author\r
+ }.should raise_error(ActiveRecord::RecordNotFound)\r
+ end\r
+ end\r
+ end\r
+ describe '編集取得に於いて' do\r
+ before do\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it '単体取得オプションを利用している' do\r
+ Panel.stub(:show_opt).with(any_args).and_return({})\r
+ Panel.should_receive(:show_opt).with(any_args).exactly(1)\r
+ r = Panel.edit @panel.id, @author\r
+ end\r
+ it '所持判定を問い合わせている' do\r
+ Panel.any_instance.stub(:own?).with(any_args).and_return(true)\r
+ Panel.any_instance.should_receive(:own?).with(any_args).exactly(1)\r
+ r = Panel.edit @panel.id, @author\r
+ end\r
+ end\r
+ it '指定のコマを返す' do\r
+ Panel.any_instance.stub(:own?).and_return(true)\r
+ pl = Panel.edit @panel.id, @author\r
+ pl.should eq @panel\r
+ end\r
+ context '他人のコマを開こうとしたとき' do\r
+ it '403Forbidden例外を返す' do\r
+ Panel.any_instance.stub(:own?).and_return(false)\r
+ lambda{\r
+ Panel.edit @panel.id, @author\r
+ }.should raise_error(ActiveRecord::Forbidden)\r
+ end\r
+ end\r
+ context '存在しないコマを開こうとしたとき' do\r
+ it '404RecordNotFound例外を返す' do\r
+ lambda{\r
+ Panel.edit 110, @author\r
+ }.should raise_error(ActiveRecord::RecordNotFound)\r
+ end\r
+ end\r
+ end\r
+ describe '単体取得オプションに於いて' do\r
+ it 'includeキーを含んでいる' do\r
+ r = Panel.show_opt\r
+ r.has_key?(:include).should be_true\r
+ end\r
+ it '5つの項目を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.should have(5).items\r
+ end\r
+ it 'コマ絵を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.has_key?(:panel_pictures).should be_true\r
+ end\r
+ it 'コマ絵は実素材を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:panel_pictures].has_key?(:picture).should be_true\r
+ end\r
+ it '実素材は絵師を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:panel_pictures][:picture].has_key?(:artist).should be_true\r
+ end\r
+ it '実素材はライセンスを含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:panel_pictures][:picture].has_key?(:license).should be_true\r
+ end\r
+ it 'フキダシを含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.has_key?(:speech_balloons).should be_true\r
+ end\r
+ it 'フキダシはフキダシ枠を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:speech_balloons].has_key?(:balloon).should be_true\r
+ end\r
+ it 'フキダシはセリフを含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:speech_balloons].has_key?(:speech).should be_true\r
+ end\r
+ it '絵地を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.has_key?(:ground_pictures).should be_true\r
+ end\r
+ it '絵地は実素材を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:ground_pictures].has_key?(:picture).should be_true\r
+ end\r
+ it '実素材は絵師を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:ground_pictures][:picture].has_key?(:artist).should be_true\r
+ end\r
+ it '実素材はライセンスを含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r[:ground_pictures][:picture].has_key?(:license).should be_true\r
+ end\r
+ it '色地を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.has_key?(:ground_colors).should be_true\r
+ end\r
+ it '作家を含んでいる' do\r
+ r = Panel.show_opt[:include]\r
+ r.has_key?(:author).should be_true\r
+ end\r
+ end\r
+ describe 'json単体出力オプションに於いて' do\r
+ end\r
+ describe 'コマ部品集合に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ it 'リストを返している' do\r
+ r = @panel.parts_element\r
+ r.is_a?(Array).should be_true\r
+ end\r
+ it 'コマ絵とフキダシと絵地と色地を合わせている' do\r
+ r = @panel.parts_element\r
+ r.include?(@pp).should be_true\r
+ r.include?(@sb).should be_true\r
+ r.include?(@gc).should be_true\r
+ r.include?(@gp).should be_true\r
+ end\r
+ end\r
+ describe 'コマ部品に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'コマ部品集合を利用している' do\r
+ Panel.any_instance.stub(:parts_element).with(any_args).and_return([])\r
+ Panel.any_instance.should_receive(:parts_element).with(any_args).exactly(1)\r
+ r = @panel.parts\r
+ end\r
+ end\r
+ it 'リストを返している' do\r
+ r = @panel.parts\r
+ r.is_a?(Array).should be_true\r
+ r.size.should eq 4\r
+ end\r
+ it 'tでソートしている' do\r
+ r = @panel.parts\r
+ r[0].should eq @sb\r
+ r[1].should eq @pp\r
+ r[2].should eq @gc\r
+ r[3].should eq @gp\r
+ end\r
+ context 'さらに末尾にフキダシを追加したとき' do\r
+ before do\r
+ @sb2 = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4)\r
+ )\r
+ @panel.reload\r
+ end\r
+ it 'tでソートしている' do\r
+ r = @panel.parts\r
+ r[0].should eq @sb\r
+ r[1].should eq @pp\r
+ r[2].should eq @gc\r
+ r[3].should eq @gp\r
+ r[4].should eq @sb2\r
+ end\r
+ end\r
+ end\r
+ \r
+ describe 'z順コマ部品に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 0, :z => 2, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 1, :z => 1)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2, :z => 3)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3, :z => 4)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'コマ部品集合を利用している' do\r
+ Panel.any_instance.stub(:parts_element).with(any_args).and_return([])\r
+ Panel.any_instance.should_receive(:parts_element).with(any_args).exactly(1)\r
+ r = @panel.zorderd_elements\r
+ end\r
+ end\r
+ it 'リストを返している' do\r
+ r = @panel.zorderd_elements\r
+ r.is_a?(Array).should be_true\r
+ r.size.should eq 4\r
+ end\r
+ it 'zでオフセットを0でソートしている' do\r
+ r = @panel.zorderd_elements\r
+ r[0].should eq @sb\r
+ r[1].should eq @pp\r
+ r[2].should eq @gc\r
+ r[3].should eq @gp\r
+ end\r
+ context 'さらに末尾にフキダシを追加したとき' do\r
+ before do\r
+ @sb2 = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4, :z => 5)\r
+ )\r
+ @panel.reload\r
+ end\r
+ it 'zでソートしている' do\r
+ r = @panel.zorderd_elements\r
+ r[0].should eq @sb\r
+ r[1].should eq @pp\r
+ r[2].should eq @gc\r
+ r[3].should eq @gp\r
+ r[4].should eq @sb2\r
+ end\r
+ end\r
+ end\r
+ describe 'コマ要素に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'コマ部品を利用している' do\r
+ Panel.any_instance.stub(:parts).with(any_args).and_return([])\r
+ Panel.any_instance.should_receive(:parts).with(any_args).exactly(1)\r
+ r = @panel.panel_elements\r
+ end\r
+ end\r
+ it 'リストを返している' do\r
+ r = @panel.panel_elements\r
+ r.is_a?(Array).should be_true\r
+ end\r
+ it 'tでソートしている' do\r
+ r = @panel.panel_elements\r
+ r[0].should eq @sb\r
+ r[1].should eq @pp\r
+ r[2].should eq @gc\r
+ r[3].should eq @gp\r
+ end\r
+ end\r
+ describe 'コマ要素のjson出力に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ before do\r
+ Panel.stub(:elm_json_opt).with(@pp).and_return({})\r
+ Panel.stub(:elm_json_opt).with(@sb).and_return({})\r
+ Panel.stub(:elm_json_opt).with(@gp).and_return({})\r
+ Panel.stub(:elm_json_opt).with(@gc).and_return({})\r
+ end\r
+ it 'コマ要素のjson出力オプションにコマ絵json出力オプションを依頼している' do\r
+ Panel.should_receive(:elm_json_opt).with(@pp).exactly(1)\r
+ r = @panel.elements\r
+ end\r
+ it 'コマ要素のjson出力オプションにフキダシjson出力オプションを依頼している' do\r
+ Panel.should_receive(:elm_json_opt).with(@sb).exactly(1)\r
+ r = @panel.elements\r
+ end\r
+ it 'コマ要素のjson出力オプションに絵地json出力オプションを依頼している' do\r
+ Panel.should_receive(:elm_json_opt).with(@gp).exactly(1)\r
+ r = @panel.elements\r
+ end\r
+ it 'コマ要素のjson出力オプションに色地json出力オプションを依頼している' do\r
+ Panel.should_receive(:elm_json_opt).with(@gc).exactly(1)\r
+ r = @panel.elements\r
+ end\r
+ end\r
+ it 'リストを返している' do\r
+ r = @panel.elements\r
+ r.is_a?(Array).should be_true\r
+ end\r
+ end\r
+ describe 'コマのjson出力に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @sb.create_balloon(\r
+ FactoryGirl.attributes_for(:balloon, :speech_balloon_id => @sb.id)\r
+ )\r
+ @sb.create_speech(\r
+ FactoryGirl.attributes_for(:speech, :speech_balloon_id => @sb.id)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ before do\r
+ Panel.any_instance.stub(:elements).with(any_args).and_return({})\r
+ end\r
+ it 'コマ要素のjson出力を依頼している' do\r
+ Panel.any_instance.should_receive(:elements).with(any_args).exactly(1)\r
+ r = @panel.panel_elements_as_json\r
+ end\r
+ end\r
+ it 'json textを返している' do\r
+ r = JSON.parse @panel.panel_elements_as_json\r
+ r.is_a?(Hash).should be_true\r
+ end\r
+ it 'author,コマ要素を含んでいる' do\r
+ r = JSON.parse @panel.panel_elements_as_json\r
+ r.has_key?('author').should be_true\r
+ r.has_key?('elements').should be_true\r
+ #t:0\r
+ sb = r['elements'].first\r
+ sb.has_key?('classname').should be_true\r
+ sb.has_key?('balloon').should be_true\r
+ sb.has_key?('speech').should be_true\r
+ #t:1\r
+ end\r
+ end\r
+ describe 'コマリストのjson出力に於いて' do\r
+ before do\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ Panel.any_instance.stub(:panel_elements_as_json).with(any_args).and_return('{"p": 5}')\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ it 'コマのjson出力を依頼している' do\r
+ Panel.any_instance.should_receive(:panel_elements_as_json).with(any_args).exactly(1)\r
+ r = Panel.list_as_json_text [@panel]\r
+ end\r
+ end\r
+ it 'json textを返している' do\r
+ r = Panel.list_as_json_text [@panel]\r
+ j = JSON.parse r\r
+ j.is_a?(Array).should be_true\r
+ end\r
+ it 'コマを含んでいる' do\r
+ r = Panel.list_as_json_text [@panel]\r
+ j = JSON.parse r\r
+ j.first.has_key?('p').should be_true\r
+ end\r
+ end\r
+ \r
+ describe 'ライセンス素材に於いて' do\r
+ before do\r
+ #コマを作成しておく。\r
+ @op2 = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
+ @p2 = FactoryGirl.create :picture, :original_picture_id => @op2.id, :license_id => @license.id, :artist_id => @artist.id\r
+ @rp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op2.id, :picture_id => @p2.id\r
+ @panel = FactoryGirl.create :panel, :author_id => @author.id\r
+ @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height, :picture_id => @p.id\r
+ @sb = @panel.speech_balloons.create(\r
+ FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+ )\r
+ @gc = @panel.ground_colors.create(\r
+ FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
+ )\r
+ @gp = @panel.ground_pictures.create(\r
+ FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p2.id, :t => 3)\r
+ )\r
+ @panel.reload\r
+ end\r
+ context '事前チェック' do\r
+ end\r
+ context 'つつがなく終わるとき' do\r
+ end\r
+ it '連想配列(値は実素材、キーは実素材id)を返している' do\r
+ r = @panel.licensed_pictures\r
+ r.is_a?(Hash).should be_true\r
+ r.should have(2).items\r
+ r[@pp.picture_id].should eq @p\r
+ r[@gp.picture_id].should eq @p2\r
+ end\r
+ end\r
+ \r
+ describe '検証値収集に於いて' do\r
+ context 'つつがなく終わるとき' do\r
+ it '第一パラメータで指定された配列中から第二引数のカラム値を収集している' do\r
+ elements = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r