OSDN Git Service

Merge branch 'v06' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / spec / models / story_sheet_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #スト紙
4 describe StorySheet do
5   before do
6     @admin = FactoryGirl.create :admin
7     @sp = FactoryGirl.create :system_picture
8     @lg = FactoryGirl.create :license_group
9     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
10     SpeechBalloonTemplate.delete_all
11     @speech_balloon_template = FactoryGirl.create :speech_balloon_template, "name" => "circle@pettan.com", "classname" => "CircleSpeechBalloon", "caption" => "cc",  "system_picture_id" => @sp.id, "settings" => '{}'
12     @writing_format = FactoryGirl.create :writing_format
13     @user = FactoryGirl.create( :user_yas)
14     @author = FactoryGirl.create :author, :user_id => @user.id
15     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
16     @other_user = FactoryGirl.create( :user_yas)
17     @other_author = FactoryGirl.create :author, :user_id => @other_user.id
18     @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
19     @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
20     @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
21   end
22   
23   describe '検証に於いて' do
24     before do
25       @comic = FactoryGirl.create :comic, :author_id => @author.id
26       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
27       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
28       @story_sheet = FactoryGirl.build :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
29     end
30     
31     context 'オーソドックスなデータのとき' do
32       it '下限データが通る' do
33         @story_sheet.t = 0
34         @story_sheet.should be_valid
35       end
36       it '上限データが通る' do
37         @story_sheet.t = 99999
38         @story_sheet.should be_valid
39       end
40     end
41     
42     context 'story_idを検証するとき' do
43       it 'nullなら失敗する' do
44         @story_sheet.story_id = nil
45         @story_sheet.should_not be_valid
46       end
47       it '数値でなければ失敗する' do
48         @story_sheet.story_id = 'a'
49         @story_sheet.should_not be_valid
50       end
51       it '存在するストーリーでなければ失敗する' do
52         @story_sheet.story_id = 0
53         @story_sheet.should_not be_valid
54       end
55     end
56     
57     context 'sheet_idを検証するとき' do
58       it 'nullなら失敗する' do
59         @story_sheet.sheet_id = nil
60         @story_sheet.should_not be_valid
61       end
62       it '数値でなければ失敗する' do
63         @story_sheet.sheet_id = 'a'
64         @story_sheet.should_not be_valid
65       end
66       it '存在する用紙でなければ失敗する' do
67         @story_sheet.sheet_id = 0
68         @story_sheet.should_not be_valid
69       end
70     end
71     
72     context 'tを検証するとき' do
73       it 'nullなら失敗する' do
74         @story_sheet.t = nil
75         @story_sheet.should_not be_valid
76       end
77       it '数値でなければ失敗する' do
78         @story_sheet.t = 'a'
79         @story_sheet.should_not be_valid
80       end
81       it '負なら失敗する' do
82         @story_sheet.t = -1
83         @story_sheet.should_not be_valid
84       end
85     end
86     
87     context 'author_idを検証するとき' do
88       it 'nullなら失敗する' do
89         @story_sheet.author_id = nil
90         @story_sheet.should_not be_valid
91       end
92       it '数値でなければ失敗する' do
93         @story_sheet.author_id = 'a'
94         @story_sheet.should_not be_valid
95       end
96       it '存在する作家でなければ失敗する' do
97         @story_sheet.author_id = 0
98         @story_sheet.should_not be_valid
99       end
100     end
101     context '全体を検証するとき' do
102     end
103   end
104   
105   describe 'デフォルト値補充に於いて' do
106     before do
107       @comic = FactoryGirl.create :comic, :author_id => @author.id
108       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
109       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
110     end
111     
112     #dbのデフォルト値が0だから明示的にnilにしないと追加ができない
113     it 'tをnilにする' do
114       @story_sheet = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id
115       @story_sheet.supply_default
116       @story_sheet.t.should be_nil
117     end
118     
119   end
120   
121   describe '上書き補充に於いて' do
122     before do
123       @comic = FactoryGirl.create :comic, :author_id => @author.id
124       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
125       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
126     end
127     
128     context 'author_idを補充' do
129       it '問答無用でauthor_idを補充する' do
130         @story_sheet = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id
131         @story_sheet.author_id = nil
132         @story_sheet.overwrite @author
133         @story_sheet.author_id.should eq @author.id
134       end
135     end
136     
137   end
138   
139   describe '所持判定に於いて' do
140     before do
141       @comic = FactoryGirl.create :comic, :author_id => @author.id
142       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
143       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
144       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
145       @comico = FactoryGirl.create :comic, :author_id => @other_author.id
146       @storyo = FactoryGirl.create :story, :comic_id => @comico.id
147       @sheeto = FactoryGirl.create :sheet, :author_id => @other_author.id
148       @story_sheeto = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @storyo.id, :sheet_id => @sheeto.id
149     end
150     context '事前チェックする' do
151       it '自身にロールリストからの作家取得を依頼している' do
152         StorySheet.should_receive(:get_author_from_roles).with(any_args).exactly(1)
153         r = @story_sheet.own?([@author])
154       end
155     end
156     context 'ロール内作家が取得できるとき' do
157       before do
158       end
159       it 'ロール内作家のidが自身の作家idと一致するなら許可する' do
160         StorySheet.stub(:get_author_from_roles).with(any_args).and_return(@author)
161         r = @story_sheet.own?([@author])
162         r.should be_true
163       end
164       it 'ロール内作家のidが自身の作家idと一致しないならno' do
165         StorySheet.stub(:get_author_from_roles).with(any_args).and_return(@other_author)
166         @story_sheet.own?(@other_author).should be_false
167       end
168     end
169     context 'ロール内作家が取得できないとき' do
170       before do
171         StorySheet.stub(:get_author_from_roles).with(any_args).and_return(nil)
172       end
173       it 'Falseを返す' do
174         r = @story_sheet.own?([@author])
175         r.should be_false
176       end
177     end
178   end
179   
180   describe '閲覧許可に於いて' do
181     before do
182       @comic = FactoryGirl.create :comic, :author_id => @author.id
183       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
184       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
185       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
186     end
187     context 'オープンモードのとき' do
188       before do
189         MagicNumber['run_mode'] = 0
190       end
191       it '自身にゲスト用ロールチェックを問い合わせしている' do
192         StorySheet.any_instance.stub(:guest_role_check).and_return(true)
193         StorySheet.any_instance.should_receive(:guest_role_check).with(any_args).exactly(1)
194         r = @story_sheet.visible?([@author])
195       end
196       it 'ゲスト用ロールチェックが失敗したとき、falseを返す' do
197         StorySheet.any_instance.stub(:guest_role_check).and_return(false)
198         r = @story_sheet.visible?([@author])
199         r.should be_false
200       end
201     end
202     context 'クローズドモードのとき' do
203       before do
204         MagicNumber['run_mode'] = 1
205       end
206       it '自身に読者用ロールチェックを問い合わせしている' do
207         StorySheet.any_instance.stub(:reader_role_check).and_return(true)
208         StorySheet.any_instance.should_receive(:reader_role_check).with(any_args).exactly(1)
209         r = @story_sheet.visible?([@author])
210       end
211       it '読者用ロールチェックが失敗したとき、falseを返す' do
212         StorySheet.any_instance.stub(:reader_role_check).and_return(false)
213         r = @story_sheet.visible?([@author])
214         r.should be_false
215       end
216     end
217     context '事前チェックする' do
218       before do
219         MagicNumber['run_mode'] = 1
220         StorySheet.any_instance.stub(:reader_role_check).and_return(true)
221       end
222       it '自身のストーリーに所持判定を問い合わせしている' do
223         Story.any_instance.stub(:own?).and_return(true)
224         Story.any_instance.should_receive(:own?).with(any_args).exactly(1)
225         r = @story_sheet.visible?([@author])
226       end
227       it '自身のストーリーに閲覧許可を問い合わせしている' do
228         Story.any_instance.stub(:own?).and_return(false)
229         Story.any_instance.stub(:visible?).and_return(true)
230         Story.any_instance.should_receive(:visible?).with(any_args).exactly(1)
231         r = @story_sheet.visible?([@author])
232       end
233     end
234     context 'つつがなく終わるとき' do
235       before do
236         MagicNumber['run_mode'] = 1
237         StorySheet.any_instance.stub(:reader_role_check).and_return(true)
238       end
239       it '自分のストーリーのスト紙なら許可する' do
240         Story.any_instance.stub(:own?).and_return(true)
241         Story.any_instance.stub(:visible).and_return(0)
242         r = @story_sheet.visible?([@author])
243         r.should be_true
244       end
245       it '他人の非公開ストーリーのスト紙なら許可しない' do
246         Story.any_instance.stub(:own?).and_return(false)
247         Story.any_instance.stub(:visible).and_return(0)
248         r = @story_sheet.visible?([@author])
249         r.should be_false
250       end
251       it '他人のストーリーのスト紙でも公開なら許可する' do
252         Story.any_instance.stub(:own?).and_return(false)
253         Story.any_instance.stub(:visible).and_return(1)
254         r = @story_sheet.visible?([@author])
255         r.should be_true
256       end
257     end
258   end
259   
260   describe 'プレイリスト取得に於いて' do
261     before do
262       @comic = FactoryGirl.create :comic, :author_id => @author.id
263       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
264       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
265       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
266     end
267     context 'つつがなく終わるとき' do
268       it '用紙に単体取得を問い合わせている' do
269         Sheet.stub(:show).with(any_args).and_return(@sheet)
270         Sheet.should_receive(:show).with(any_args).exactly(1)
271         r = StorySheet.play_sheet @story, @author
272       end
273       it '用紙を返す' do
274         c = StorySheet.play_sheet @story, @author
275         c.should eq @sheet
276       end
277       it '削除された用紙は含んでいない' do
278         @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id
279         h = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet2.id, :t => 1
280         @sheet2.destroy
281         c = StorySheet.play_sheet @story, @author, 2
282         c.should eq nil
283       end
284     end
285     context 'DBに5件あったとして' do
286       before do
287         @sheet2 = FactoryGirl.create :sheet, :author_id => @author.id
288         @story_sheet2 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet2.id, :t => 1
289         @sheet3 = FactoryGirl.create :sheet, :author_id => @author.id
290         @story_sheet3 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet3.id, :t => 2
291         @sheet4 = FactoryGirl.create :sheet, :author_id => @author.id
292         @story_sheet4 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet4.id, :t => 3
293         @sheet5 = FactoryGirl.create :sheet, :author_id => @author.id
294         @story_sheet5 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet5.id, :t => 4
295       end
296       it 'page=1なら先頭を返す' do
297         #時系列で並んでいる
298         c = StorySheet.play_sheet( @story, @author, 1)
299         c.should eq @sheet
300       end
301       it 'page=5なら末尾を返す' do
302         c = StorySheet.play_sheet(@story, @author, 5)
303         c.should eq @sheet5
304       end
305     end
306   end
307   
308   describe '一覧取得に於いて' do
309     before do
310       @comic = FactoryGirl.create :comic, :author_id => @author.id
311       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
312       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
313       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
314       @other_comic = FactoryGirl.create :comic, :author_id => @other_author.id
315       @other_story = FactoryGirl.create :story, :comic_id => @other_comic.id, :visible => 1
316       @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id
317       @hidden_comic = FactoryGirl.create :comic, :author_id => @author.id
318       @hidden_story = FactoryGirl.create :story, :visible => 0
319     end
320     context 'page補正について' do
321       it '文字列から数値に変換される' do
322         StorySheet.page('8').should eq 8
323       end
324       it 'nilの場合は1になる' do
325         StorySheet.page().should eq 1
326       end
327       it '0以下の場合は1になる' do
328         StorySheet.page('0').should eq 1
329       end
330     end
331     context 'page_size補正について' do
332       it '文字列から数値に変換される' do
333         StorySheet.page_size('7').should eq 7
334       end
335       it 'nilの場合はStorySheet.default_page_sizeになる' do
336         StorySheet.page_size().should eq StorySheet.default_page_size
337       end
338       it '0以下の場合はStorySheet.default_page_sizeになる' do
339         StorySheet.page_size('0').should eq StorySheet.default_page_size
340       end
341       it 'StorySheet.max_page_sizeを超えた場合はStorySheet.max_page_sizeになる' do
342         StorySheet.page_size('1000').should eq StorySheet.max_page_size
343       end
344     end
345     it 'リストを返す' do
346       c = StorySheet.list
347       c.should eq [@story_sheet]
348     end
349     it '時系列で並んでいる' do
350       #公開ストーリーのStorySheetは(他人のStorySheetであっても)含んでいる
351       v = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 0, :updated_at => Time.now + 100
352       c = StorySheet.list 
353       c.should eq [ v, @story_sheet]
354     end
355     it '非公開のスト紙は(自分のスト紙であっても)含まない' do
356       h = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @hidden_story.id, :sheet_id => @sheet.id, :t => 0
357       c = StorySheet.list 
358       c.should eq [ @story_sheet]
359     end
360     context 'DBに5件あって1ページの件数を2件に変えたとして' do
361       before do
362         @story_sheet2 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 1, :updated_at => Time.now + 100
363         @story_sheet3 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 2, :updated_at => Time.now + 200
364         @story_sheet4 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 3, :updated_at => Time.now + 300
365         @story_sheet5 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 4, :updated_at => Time.now + 400
366       end
367       it '通常は2件を返す' do
368         l = StorySheet.list 1, 2
369         l.should have(2).items 
370       end
371       it 'page=1なら末尾2件を返す' do
372         #時系列で並んでいる
373         l = StorySheet.list 1, 2
374         l.should eq [@story_sheet5, @story_sheet4]
375       end
376       it 'page=2なら中間2件を返す' do
377         l = StorySheet.list 2, 2
378         l.should eq [@story_sheet3, @story_sheet2]
379       end
380       it 'page=3なら先頭1件を返す' do
381         l = StorySheet.list 3, 2
382         l.should eq [@story_sheet]
383       end
384     end
385   end
386   
387   describe '自分のスト紙一覧取得に於いて' do
388     before do
389       @comic = FactoryGirl.create :comic, :author_id => @author.id
390       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
391       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
392       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
393       @other_comic = FactoryGirl.create :comic, :author_id => @other_author.id
394       @other_story = FactoryGirl.create :story, :comic_id => @other_comic.id, :visible => 1
395       @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1
396       @hcomic = FactoryGirl.create :comic, :author_id => @author.id
397       @hstory = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 0
398       @hsheet = FactoryGirl.create :sheet, :author_id => @author.id, :visible => 0
399     end
400     context 'つつがなく終わるとき' do
401       it '一覧取得オプションを利用している' do
402         StorySheet.stub(:list_opt).with(any_args).and_return({})
403         StorySheet.should_receive(:list_opt).with(any_args).exactly(1)
404         r = StorySheet.mylist @author
405       end
406     end
407     it 'リストを返す' do
408       s = StorySheet.mylist @author
409       s.should eq [@story_sheet]
410     end
411     it '時系列で並んでいる' do
412       ns = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 1, :updated_at => Time.now + 100
413       sl = StorySheet.mylist @author
414       sl.should eq [ns, @story_sheet]
415     end
416     it '他人のスト紙は用紙ストーリーともに公開でも含まない' do
417       so = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id
418       sl = StorySheet.mylist @author
419       sl.should eq [@story_sheet]
420     end
421     it '自分のスト紙は用紙ストーリーともに非公開でも含んでいる' do
422       hs = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @hstory.id, :sheet_id => @hsheet.id, :updated_at => Time.now + 100
423       sl = StorySheet.mylist @author
424       sl.should eq [hs, @story_sheet]
425     end
426     context 'DBに5件あって1ページの件数を2件に変えたとして' do
427       before do
428         @story_sheet2 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 1, :updated_at => Time.now + 100
429         @story_sheet3 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 2, :updated_at => Time.now + 200
430         @story_sheet4 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 3, :updated_at => Time.now + 300
431         @story_sheet5 = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 4, :updated_at => Time.now + 400
432         StorySheet.stub(:default_page_size).and_return(2)
433       end
434       it '通常は2件を返す' do
435         l = StorySheet.mylist @author, 1, 2
436         l.should have(2).items 
437       end
438       it 'page=1なら末尾2件を返す' do
439         #時系列で並んでいる
440         l = StorySheet.mylist @author, 1, 2
441         l.should eq [@story_sheet5, @story_sheet4]
442       end
443       it 'page=2なら中間2件を返す' do
444         l = StorySheet.mylist @author, 2, 2
445         l.should eq [@story_sheet3, @story_sheet2]
446       end
447       it 'page=3なら先頭1件を返す' do
448         l = StorySheet.mylist @author, 3, 2
449         l.should eq [@story_sheet]
450       end
451     end
452   end
453   
454   describe '他作家のスト紙一覧取得に於いて' do
455     before do
456       @comic = FactoryGirl.create :comic, :author_id => @author.id
457       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
458       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
459       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
460       @other_comic = FactoryGirl.create :comic, :author_id => @other_author.id
461       @other_story = FactoryGirl.create :story, :comic_id => @other_comic.id, :visible => 1
462       @other_sheet = FactoryGirl.create :sheet, :author_id => @other_author.id, :visible => 1
463       @other_story_sheet = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id
464     end
465     it 'リストを返す' do
466       r = StorySheet.himlist @other_author
467       r.should eq [@other_story_sheet]
468     end
469     it '時系列で並んでいる' do
470       ns = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 1, :updated_at => Time.now + 100
471       r = StorySheet.himlist @other_author
472       r.should eq [ns, @other_story_sheet]
473     end
474     it '公開ストーリーのスト紙' do
475       @hstory = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 0
476       ns = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @hstory.id, :sheet_id => @other_sheet.id, :t => 1, :updated_at => Time.now + 100
477       r = StorySheet.himlist @other_author
478       r.should eq [@other_story_sheet]
479     end
480     context 'DBに5件あって1ページの件数を2件に変えたとして' do
481       before do
482         @other_story_sheet2 = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 1, :updated_at => Time.now + 100
483         @other_story_sheet3 = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 2, :updated_at => Time.now + 200
484         @other_story_sheet4 = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 3, :updated_at => Time.now + 300
485         @other_story_sheet5 = FactoryGirl.create :story_sheet, :author_id => @other_author.id, :story_id => @other_story.id, :sheet_id => @other_sheet.id, :t => 4, :updated_at => Time.now + 400
486         StorySheet.stub(:default_page_size).and_return(2)
487       end
488       it '通常は2件を返す' do
489         l = StorySheet.himlist @other_author, 1, 2
490         l.should have(2).items 
491       end
492       it 'page=1なら末尾2件を返す' do
493         #時系列で並んでいる
494         l = StorySheet.himlist @other_author, 1, 2
495         l.should eq [@other_story_sheet5, @other_story_sheet4]
496       end
497       it 'page=2なら中間2件を返す' do
498         l = StorySheet.himlist @other_author, 2, 2
499         l.should eq [@other_story_sheet3, @other_story_sheet2]
500       end
501       it 'page=3なら先頭1件を返す' do
502         l = StorySheet.himlist @other_author, 3, 2
503         l.should eq [@other_story_sheet]
504       end
505     end
506   end
507   
508   describe 'スト紙一覧ページ制御に於いて' do
509     before do
510       StorySheet.stub(:count).with(any_args).and_return(100)
511     end
512     it 'ページ制御を返す' do
513       r = StorySheet.list_paginate 
514       r.is_a?(Kaminari::PaginatableArray).should be_true
515     end
516     it 'スト紙一覧の取得条件を利用している' do
517       StorySheet.stub(:list_where).with(any_args).and_return('')
518       StorySheet.should_receive(:list_where).with(any_args).exactly(1)
519       r = StorySheet.list_paginate 
520     end
521     it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do
522       r = StorySheet.list_paginate 3, 10
523       r.limit_value.should eq 10
524       r.offset_value.should eq 20
525     end
526   end
527   
528   describe '自分のスト紙一覧ページ制御に於いて' do
529     before do
530       StorySheet.stub(:count).with(any_args).and_return(100)
531     end
532     it 'ページ制御を返す' do
533       r = StorySheet.mylist_paginate @author
534       r.is_a?(Kaminari::PaginatableArray).should be_true
535     end
536     it '自分のスト紙一覧の取得条件を利用している' do
537       StorySheet.stub(:mylist_where).with(any_args).and_return('')
538       StorySheet.should_receive(:mylist_where).with(any_args).exactly(1)
539       r = StorySheet.mylist_paginate @author
540     end
541     it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do
542       r = StorySheet.mylist_paginate @author, 3, 10
543       r.limit_value.should eq 10
544       r.offset_value.should eq 20
545     end
546   end
547   
548   describe '他作家のスト紙一覧ページ制御に於いて' do
549     before do
550       StorySheet.stub(:count).with(any_args).and_return(100)
551     end
552     it 'ページ制御を返す' do
553       r = StorySheet.himlist_paginate @other_author
554       r.is_a?(Kaminari::PaginatableArray).should be_true
555     end
556     it '他作家のスト紙一覧の取得条件を利用している' do
557       StorySheet.stub(:himlist_where).with(any_args).and_return('')
558       StorySheet.should_receive(:himlist_where).with(any_args).exactly(1)
559       r = StorySheet.himlist_paginate @other_author
560     end
561     it 'ページ件数10のとき、3ページ目のオフセットは20から始まる' do
562       r = StorySheet.himlist_paginate @other_author, 3, 10
563       r.limit_value.should eq 10
564       r.offset_value.should eq 20
565     end
566   end
567   
568   describe 'list関連テーブルプションに於いて' do
569     it '3つの項目を含んでいる' do
570       r = StorySheet.list_opt
571       r.should have(3).items
572     end
573     it 'ストーリーを含んでいる' do
574       r = StorySheet.list_opt
575       r.has_key?(:story).should be_true
576     end
577     it '作家を含んでいる' do
578       r = StorySheet.list_opt
579       r.has_key?(:author).should be_true
580     end
581     it '用紙を含んでいる' do
582       r = StorySheet.list_opt
583       r.has_key?(:sheet).should be_true
584     end
585       it '用紙は作家を含んでいる' do
586         r = StorySheet.list_opt
587         r[:sheet].has_key?(:author).should be_true
588       end
589   end
590   describe 'json一覧出力オプションに於いて' do
591     before do
592       @comic = FactoryGirl.create :comic, :author_id => @author.id
593       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
594       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
595       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
596     end
597     it 'ストーリーを含んでいる' do
598       r = StorySheet.list.to_json StorySheet.list_json_opt
599       j = JSON.parse r
600       i = j.first
601       i.has_key?('story').should be_true
602     end
603     it '用紙を含んでいる' do
604       r = StorySheet.list.to_json StorySheet.list_json_opt
605       j = JSON.parse r
606       i = j.first
607       i.has_key?('sheet').should be_true
608     end
609       it '用紙は作家を含んでいる' do
610         r = StorySheet.list.to_json StorySheet.list_json_opt
611         j = JSON.parse r
612         i = j.first
613         s = i['sheet']
614         s.has_key?('author').should be_true
615       end
616     it '作家を含んでいる' do
617       r = StorySheet.list.to_json StorySheet.list_json_opt
618       j = JSON.parse r
619       i = j.first
620       i.has_key?('author').should be_true
621     end
622   end
623   
624   describe '単体取得に於いて' do
625     before do
626       @comic = FactoryGirl.create :comic, :author_id => @author.id
627       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
628       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
629       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
630     end
631     context 'つつがなく終わるとき' do
632       it '単体取得オプションを利用している' do
633         StorySheet.stub(:show_opt).with(any_args).and_return({})
634         StorySheet.should_receive(:show_opt).with(any_args).exactly(1)
635         r = StorySheet.show @story_sheet.id, @author
636       end
637       it '閲覧許可を問い合わせている' do
638         StorySheet.any_instance.stub(:visible?).with(@author).and_return(true)
639         StorySheet.any_instance.should_receive(:visible?).with(@author).exactly(1)
640         r = StorySheet.show @story_sheet.id, @author
641       end
642     end
643     it '指定のスト紙を返す' do
644       l = StorySheet.show @story_sheet.id, @author
645       l.should eq @story_sheet
646     end
647     context '他人のスト紙を開こうとしたとき' do
648       it '403Forbidden例外を返す' do
649         StorySheet.any_instance.stub(:visible?).with(@other_author).and_return(false)
650         lambda{
651           StorySheet.show @story_sheet.id, @other_author
652         }.should raise_error(ActiveRecord::Forbidden)
653       end
654     end
655     context '存在しないスト紙を開こうとしたとき' do
656       it '404RecordNotFound例外を返す' do
657         lambda{
658           StorySheet.show 110, @author
659         }.should raise_error(ActiveRecord::RecordNotFound)
660       end
661     end
662   end
663   
664   describe '編集取得に於いて' do
665     before do
666       @comic = FactoryGirl.create :comic, :author_id => @author.id
667       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
668       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
669       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
670     end
671     context 'つつがなく終わるとき' do
672       it '単体取得オプションを利用している' do
673         StorySheet.stub(:show_opt).with(any_args).and_return({})
674         StorySheet.should_receive(:show_opt).with(any_args).exactly(1)
675         r = StorySheet.edit @story_sheet.id, @author
676       end
677       it '所持判定を問い合わせている' do
678         StorySheet.any_instance.stub(:own?).with(any_args).and_return(true)
679         StorySheet.any_instance.should_receive(:own?).with(any_args).exactly(1)
680         r = StorySheet.edit @story_sheet.id, @author
681       end
682     end
683     it '指定のスト紙を返す' do
684       l = StorySheet.edit @story_sheet.id, @author
685       l.should eq @story_sheet
686     end
687     context '他人のスト紙を開こうとしたとき' do
688       it '403Forbidden例外を返す' do
689         StorySheet.any_instance.stub(:own?).and_return(false)
690         lambda{
691           StorySheet.edit @story_sheet.id, @author
692         }.should raise_error(ActiveRecord::Forbidden)
693       end
694     end
695     context '存在しないスト紙を開こうとしたとき' do
696       it '404RecordNotFound例外を返す' do
697         lambda{
698           StorySheet.edit 110, @author
699         }.should raise_error(ActiveRecord::RecordNotFound)
700       end
701     end
702   end
703   
704   describe '単体取得オプションに於いて' do
705     it 'includeキーを含んでいる' do
706       r = StorySheet.show_opt
707       r.has_key?(:include).should be_true
708     end
709     it '3つの項目を含んでいる' do
710       r = StorySheet.show_opt[:include]
711       r.should have(3).items
712     end
713     it 'ストーリーを含んでいる' do
714       r = StorySheet.show_opt[:include]
715       r.has_key?(:story).should be_true
716     end
717     it '作家を含んでいる' do
718       r = StorySheet.show_opt[:include]
719       r.has_key?(:author).should be_true
720     end
721     it '用紙を含んでいる' do
722       r = StorySheet.show_opt[:include]
723       r.has_key?(:sheet).should be_true
724     end
725       it '用紙は作家を含んでいる' do
726         r = StorySheet.show_opt[:include]
727         r[:sheet].has_key?(:author).should be_true
728       end
729   end
730   describe 'json単体取得オプションに於いて' do
731     before do
732       @comic = FactoryGirl.create :comic, :author_id => @author.id
733       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
734       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
735       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
736     end
737     it 'ストーリーを含んでいる' do
738       r = StorySheet.show(@story_sheet.id, @author).to_json StorySheet.show_json_opt
739       j = JSON.parse r
740       i = j
741       i.has_key?('story').should be_true
742     end
743     it '用紙を含んでいる' do
744       r = StorySheet.show(@story_sheet.id, @author).to_json StorySheet.show_json_opt
745       j = JSON.parse r
746       i = j
747       i.has_key?('sheet').should be_true
748     end
749       it '用紙は作家を含んでいる' do
750         r = StorySheet.show(@story_sheet.id, @author).to_json StorySheet.show_json_opt
751         j = JSON.parse r
752         i = j
753         s = i['sheet']
754         s.has_key?('author').should be_true
755       end
756     it '作家を含んでいる' do
757       r = StorySheet.show(@story_sheet.id, @author).to_json StorySheet.show_json_opt
758       j = JSON.parse r
759       i = j
760       i.has_key?('author').should be_true
761     end
762   end
763   
764   describe 'スクコマのjson出力に於いて' do
765     before do
766       #コマを作成しておく。
767       @panel = FactoryGirl.create :panel, :author_id => @author.id
768       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height
769       @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
770       @speech = @sb.build_speech(
771         FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)
772       )
773       @balloon = @sb.build_balloon(
774         FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)
775       )
776       @sb.boost
777       @sb.save!
778       @gc = @panel.ground_colors.create(
779         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)
780       )
781       @gp = @panel.ground_pictures.create(
782         FactoryGirl.attributes_for(:ground_picture, :panel_id => @panel.id, :picture_id => @p.id)
783       )
784       @panel.reload
785       @scroll = FactoryGirl.create :scroll, :author_id => @author.id
786       @scroll_panel = FactoryGirl.create :scroll_panel, :author_id => @author.id, :scroll_id => @scroll.id, :panel_id => @panel.id
787     end
788     context '事前チェックする' do
789       before do
790         Panel.any_instance.stub(:elements).and_return('{}')
791       end
792       it 'コマ要素のjson出力を依頼している' do
793         Panel.any_instance.stub(:visible?).with(any_args).and_return(true)
794         Panel.any_instance.should_receive(:elements).with(any_args).exactly(1)
795         r = @scroll_panel.scroll_panel_as_json @author
796       end
797     end
798     it 'json textを返している' do
799       r = JSON.parse @scroll_panel.scroll_panel_as_json(@author)
800       r.is_a?(Hash).should be_true
801     end
802     it 'scroll,author,panel,コマ要素を含んでいる' do
803       r = JSON.parse @scroll_panel.scroll_panel_as_json(@author)
804       r.has_key?('scroll').should be_true
805       r['scroll'].has_key?('author').should be_true
806       r.has_key?('author').should be_true
807       r.has_key?('panel').should be_true
808       r['panel'].has_key?('author').should be_true
809     end
810     context 'コマ閲覧許可のとき' do
811       before do
812         Panel.any_instance.stub(:visible?).with(any_args).and_return(true)
813       end
814       it 'コマ要素にコマ要素を追加している' do
815         r = JSON.parse @scroll_panel.scroll_panel_as_json(@author)
816         r['panel'].has_key?('elements').should be_true
817         r['panel']['elements'].should_not be_empty
818       end
819     end
820     context 'コマ閲覧不許可のとき' do
821       before do
822         Panel.any_instance.stub(:visible?).with(any_args).and_return(false)
823       end
824       it 'コマ要素にデータを含ませない' do
825         r = JSON.parse @scroll_panel.scroll_panel_as_json(@author)
826         r['panel'].has_key?('elements').should be_false
827       end
828     end
829   end
830   
831   describe 'スクコマリストのjson出力に於いて' do
832     before do
833       @panel = FactoryGirl.create :panel, :author_id => @author.id
834       @scroll = FactoryGirl.create :scroll, :author_id => @author.id
835       @scroll_panel = FactoryGirl.create :scroll_panel, :author_id => @author.id, :scroll_id => @scroll.id, :panel_id => @panel.id
836       ScrollPanel.any_instance.stub(:scroll_panel_as_json).with(@author).and_return('{"s": 5}')
837     end
838     context 'つつがなく終わるとき' do
839       it 'スクコマのjson出力を依頼している' do
840         ScrollPanel.any_instance.should_receive(:scroll_panel_as_json).with(@author).exactly(1)
841         r = ScrollPanel.list_as_json_text [@scroll_panel], @author
842       end
843     end
844     it 'json textを返している' do
845       r = ScrollPanel.list_as_json_text [@scroll_panel], @author
846       j = JSON.parse r
847       j.is_a?(Array).should be_true
848     end
849     it 'スクコマを含んでいる' do
850       r = ScrollPanel.list_as_json_text [@scroll_panel], @author
851       j = JSON.parse r
852       j.first.has_key?('s').should be_true
853     end
854   end
855   
856   describe 't補充値に於いて' do
857     before do
858       @comic = FactoryGirl.create :comic, :author_id => @author.id
859       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
860       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
861     end
862     
863     context 'ストーリー初の用紙なら' do
864       it '0を補充値とする' do
865         @story_sheet = FactoryGirl.build :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
866         @story_sheet.t = nil
867         r = StorySheet.new_t @story_sheet.story_id
868         r.should eq 0
869       end
870     end
871     context 'ストーリーに一個用紙があるとき' do
872       it '1を補充値とする' do
873         FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 0
874         @story_sheet = FactoryGirl.build :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
875         @story_sheet.t = nil
876         r = StorySheet.new_t @story_sheet.story_id
877         r.should eq 1
878       end
879     end
880     context 'ストーリーに2個用紙があるとき' do
881       it '2を補充値とする' do
882         FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 0
883         FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id, :t => 1
884         @story_sheet = FactoryGirl.build :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
885         @story_sheet.t = nil
886         r = StorySheet.new_t @story_sheet.story_id
887         r.should eq 2
888       end
889     end
890   end
891   describe 'シリアライズチェックに於いて' do
892     context 'つつがなく終わるとき' do
893       it '0からシリアライズされているならTrueを返す' do
894         r = StorySheet.serial? [0, 1, 2]
895         r.should be_true
896       end
897       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do
898         r = StorySheet.serial? [0, 2, 1]
899         r.should be_true
900       end
901       it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do
902         r = StorySheet.serial? [ 2, 1, 4, 3, 0]
903         r.should be_true
904       end
905     end
906     context '異常なとき' do
907       it '0から始まらないならFalseを返す' do
908         r = StorySheet.serial? [1, 2, 3]
909         r.should be_false
910       end
911       it '連続していないならFalseを返す' do
912         r = StorySheet.serial? [0, 1, 2, 4]
913         r.should be_false
914       end
915       it '連続していないならFalseを返す' do
916         r = StorySheet.serial? [0, 1, 2, 4, 5]
917         r.should be_false
918       end
919     end
920   end
921   describe 't収集に於いて' do
922     before do
923       @comic = FactoryGirl.create :comic, :author_id => @author.id
924       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
925       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
926       @story_sheet = FactoryGirl.create :story_sheet, :author_id => @author.id, :story_id => @story.id, :sheet_id => @sheet.id
927       @story2 = FactoryGirl.create :story
928       @c2story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
929     end
930     context 'つつがなく終わるとき' do
931       it 'スト紙から同一ストーリーのtだけを収集している' do
932         r = StorySheet.collect_t @story_sheet
933         r.should eq [0]
934       end
935     end
936     context '複数用紙のとき' do
937       it 'スト紙から同一ストーリーのtだけを収集している' do
938         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
939         r = StorySheet.collect_t @story_sheet
940         r.sort.should eq [0, 1]
941       end
942     end
943     context '複数用紙でヨソのストーリーも混じっているとき' do
944       it 'スト紙から同一ストーリーのtだけを収集している' do
945         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
946         r = StorySheet.collect_t @story_sheet
947         r.sort.should eq [0, 1]
948       end
949     end
950   end
951   describe 'tチェックに於いて' do
952     before do
953       @comic = FactoryGirl.create :comic, :author_id => @author.id
954       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
955       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
956       @story_sheet = FactoryGirl.build :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
957     end
958     context 'つつがなく終わるとき' do
959       it 't収集を依頼している' do
960         StorySheet.should_receive(:collect_t).with(any_args).exactly(1)
961         StorySheet.stub(:collect_t).with(any_args).and_return([])
962         StorySheet.stub(:serial?).with(any_args).and_return(true)
963         r = StorySheet.validate_t @story_sheet
964       end
965       it '収集したtをシリアライズチェック依頼している' do
966         StorySheet.stub(:collect_t).with(any_args).and_return([])
967         StorySheet.should_receive(:serial?).with(any_args).exactly(1)
968         StorySheet.stub(:serial?).with(any_args).and_return(true)
969         r = StorySheet.validate_t @story_sheet
970       end
971     end
972     #実データでチェック
973     #依頼チェックだけでは不安なので最低限のチェックを
974     context '新規のとき' do
975       it '一件だけで正常通過している' do
976         @story_sheet = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id, :t => 0
977         r = StorySheet.validate_t @story_sheet
978         r.should be_true 
979       end
980     end
981     context '既存のとき' do
982       it '2件目を作っても正常通過している' do
983         @story_sheet = FactoryGirl.create :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id, :t => 0
984         @story_sheet2 = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id, :t => 1
985         r = StorySheet.validate_t @story_sheet2
986         r.should be_true 
987       end
988     end
989   end
990   describe '挿入シフトに於いて' do
991     before do
992       @comic = FactoryGirl.create :comic, :author_id => @author.id
993       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
994       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
995     end
996     context '依頼チェック' do
997       #テーブルが空で0に挿入
998       it 'Updateを依頼している' do
999         StorySheet.stub(:update_all).with(any_args)
1000         StorySheet.should_receive(:update_all).with(any_args).exactly(1)
1001         @story_sheet = FactoryGirl.build :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1002         @story_sheet.insert_shift
1003       end
1004     end
1005     context 'テーブルに1件(t:0)で0に挿入したとき' do
1006       before do
1007         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1008         @story_sheet2 = FactoryGirl.build :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1009       end
1010       it '既存の行を1にシフトしている' do
1011         @story_sheet2.insert_shift
1012         l = StorySheet.find :all
1013         l.first.t.should eq 1
1014       end
1015       it 'これから挿入するt(0)が欠番になっている' do
1016         @story_sheet2.insert_shift
1017         l = StorySheet.find(:all).map {|s| s.t }
1018         l.include?(0).should_not be_true
1019       end
1020     end
1021     context 'テーブルに2件(t:0,1)で1に挿入したとき' do
1022       before do
1023         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1024         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1025         @story_sheet3 = FactoryGirl.build :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1026       end
1027       it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
1028         @story_sheet3.insert_shift
1029         l = StorySheet.find(:all).map {|s| s.t }
1030         l.sort.should eq [0, 2]
1031       end
1032     end
1033     context 'テーブルに5件(t:0,1,2,3,4)で2に挿入したとき' do
1034       before do
1035         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1036         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1037         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1038         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1039         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1040         @story_sheet6 = FactoryGirl.build :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1041       end
1042       it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
1043         @story_sheet6.insert_shift
1044         l = StorySheet.find(:all).map {|s| s.t }
1045         l.sort.should eq [0, 1, 3, 4, 5]
1046       end
1047     end
1048     context '先ほどのケース+他のストーリー1件で挿入したとき' do
1049       before do
1050         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1051         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1052         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1053         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1054         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1055         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1056         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1057         @story_sheet6 = FactoryGirl.build :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1058       end
1059       it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
1060         @story_sheet6.insert_shift
1061         l = StorySheet.find(:all, :conditions => ['story_id = ?', @story.id]).map {|s| s.t }
1062         l.sort.should eq [0, 1, 3, 4, 5]
1063       end
1064       it '他のストーリーに影響がない' do
1065         ot = @story_sheetc2.t
1066         @story_sheet6.insert_shift
1067         @story_sheetc2.reload
1068         @story_sheetc2.t.should eq ot
1069       end
1070     end
1071   end
1072   describe '少ない方に移動に於いて' do
1073     before do
1074       @comic = FactoryGirl.create :comic, :author_id => @author.id
1075       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1076       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1077     end
1078     context '依頼チェック' do
1079       it 'Updateを依頼している' do
1080         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1081         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1082         StorySheet.stub(:update_all).with(any_args)
1083         StorySheet.should_receive(:update_all).with(any_args).exactly(1)
1084         ot = @story_sheet2.t
1085         @story_sheet2.t = 0
1086         @story_sheet2.lesser_shift ot
1087       end
1088     end
1089     context 'テーブルに2件(t:0,1)で1を0に移動したとき' do
1090       before do
1091         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1092         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1093         @ot = @story_sheet2.t
1094         @story_sheet2.t = 0
1095       end
1096       it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do
1097         #移動させたい行はそのまま残る
1098         @story_sheet2.lesser_shift @ot
1099         l = StorySheet.find(:all).map {|s| s.t }
1100         l.sort.should eq [1, 1]
1101       end
1102       it '既存のt0を1にシフトしている' do
1103         @story_sheet2.lesser_shift @ot
1104         @story_sheet.reload
1105         @story_sheet.t.should eq 1
1106       end
1107     end
1108     context 'テーブルに3件(t:0,1,2)で2を1に移動したとき' do
1109       before do
1110         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1111         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1112         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1113         @ot = @story_sheet3.t
1114         @story_sheet3.t = 1
1115       end
1116       it '既存のt1を2にシフトしてこれから挿入するt(1)が欠番になっている' do
1117         #移動させたい行はそのまま残る
1118         @story_sheet3.lesser_shift @ot
1119         l = StorySheet.find(:all).map {|s| s.t }
1120         l.sort.should eq [0, 2, 2]
1121       end
1122       it '既存のt1を2にシフトしている' do
1123         @story_sheet3.lesser_shift @ot
1124         @story_sheet2.reload
1125         @story_sheet2.t.should eq 2
1126       end
1127     end
1128     context 'テーブルに5件(t:0,1,2,3,4)で3を1に移動したとき' do
1129       before do
1130         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1131         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1132         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1133         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1134         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1135         @ot = @story_sheet4.t
1136         @story_sheet4.t = 1
1137       end
1138       it 'これから挿入するt(1)が欠番になっている' do
1139         #移動させたい行はそのまま残る
1140         @story_sheet4.lesser_shift @ot
1141         l = StorySheet.find(:all).map {|s| s.t }
1142         l.sort.should eq [0, 2, 3, 3, 4]
1143       end
1144       it '既存のt0には変化がない' do
1145         @story_sheet4.lesser_shift @ot
1146         @story_sheet.reload
1147         @story_sheet.t.should eq 0
1148       end
1149       it '既存のt4には変化がない' do
1150         @story_sheet4.lesser_shift @ot
1151         @story_sheet5.reload
1152         @story_sheet5.t.should eq 4
1153       end
1154       it '既存のt1を2にシフトしている' do
1155         @story_sheet4.lesser_shift @ot
1156         @story_sheet2.reload
1157         @story_sheet2.t.should eq 2
1158       end
1159       it '既存のt2を3にシフトしている' do
1160         @story_sheet4.lesser_shift @ot
1161         @story_sheet3.reload
1162         @story_sheet3.t.should eq 3
1163       end
1164     end
1165     context '先ほどのケース+他のストーリー1件で挿入したとき' do
1166       before do
1167         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1168         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1169         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1170         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1171         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1172         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1173         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1174         @ot = @story_sheet4.t
1175         @story_sheet4.t = 1
1176       end
1177       it 'これから挿入するt(1)が欠番になっている' do
1178         @story_sheet4.lesser_shift @ot
1179         l = StorySheet.find(:all).map {|s| s.t }
1180         l.sort.should eq [0, 0, 2, 3, 3, 4]
1181       end
1182       it '既存のt0には変化がない' do
1183         @story_sheet4.lesser_shift @ot
1184         @story_sheet.reload
1185         @story_sheet.t.should eq 0
1186       end
1187       it '既存のt4には変化がない' do
1188         @story_sheet4.lesser_shift @ot
1189         @story_sheet5.reload
1190         @story_sheet5.t.should eq 4
1191       end
1192       it '既存のt1を2にシフトしている' do
1193         @story_sheet4.lesser_shift @ot
1194         @story_sheet2.reload
1195         @story_sheet2.t.should eq 2
1196       end
1197       it '既存のt2を3にシフトしている' do
1198         @story_sheet4.lesser_shift @ot
1199         @story_sheet3.reload
1200         @story_sheet3.t.should eq 3
1201       end
1202       it '他のストーリーに影響がない' do
1203         @story_sheet4.lesser_shift @ot
1204         @story_sheetc2.reload
1205         @story_sheetc2.t.should eq 0
1206       end
1207     end
1208     #例外ケース。
1209     #負のときは0として正常扱い
1210     context 'テーブルに2件(t:0,1)で1を-1に移動したとき' do
1211       before do
1212         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1213         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1214         @ot = @story_sheet2.t
1215         @story_sheet2.t = -1
1216       end
1217       it '既存のt0を1にシフトしてこれから挿入するt(0)が欠番になっている' do
1218         #移動させたい行はそのまま残る
1219         @story_sheet2.lesser_shift @ot
1220         l = StorySheet.find(:all).map {|s| s.t }
1221         l.sort.should eq [1, 1]
1222       end
1223       it '既存のt0を1にシフトしている' do
1224         @story_sheet2.lesser_shift @ot
1225         @story_sheet.reload
1226         @story_sheet.t.should eq 1
1227       end
1228       it '既存のt1は0に補正されている' do
1229         @story_sheet2.lesser_shift @ot
1230         @story_sheet2.t.should eq 0
1231       end
1232     end
1233   end
1234   describe '大きい方に移動に於いて' do
1235     before do
1236       @comic = FactoryGirl.create :comic, :author_id => @author.id
1237       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1238       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1239     end
1240     context '依頼チェック' do
1241       it 'Updateを依頼している' do
1242         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1243         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1244         StorySheet.stub(:update_all).with(any_args)
1245         StorySheet.should_receive(:update_all).with(any_args).exactly(1)
1246         ot = @story_sheet.t
1247         @story_sheet.t = 1
1248         @story_sheet.higher_shift ot
1249       end
1250     end
1251     context 'テーブルに2件(t:0,1)で0を1に移動したとき' do
1252       before do
1253         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1254         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1255         @ot = @story_sheet.t
1256         @story_sheet.t = 1
1257       end
1258       it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
1259         #移動させたい行はそのまま残る
1260         @story_sheet.higher_shift @ot
1261         l = StorySheet.find(:all).map {|s| s.t }
1262         l.sort.should eq [0, 0]
1263       end
1264       it '既存のt1を0にシフトしている' do
1265         @story_sheet.higher_shift @ot
1266         @story_sheet2.reload
1267         @story_sheet2.t.should eq 0
1268       end
1269     end
1270     context 'テーブルに3件(t:0,1,2)で0を1に移動したとき' do
1271       before do
1272         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1273         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1274         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1275         @ot = @story_sheet.t
1276         @story_sheet.t = 1
1277       end
1278       it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
1279         #移動させたい行はそのまま残る
1280         @story_sheet.higher_shift @ot
1281         l = StorySheet.find(:all).map {|s| s.t }
1282         l.sort.should eq [0, 0, 2]
1283       end
1284       it '既存のt1を0にシフトしている' do
1285         @story_sheet.higher_shift @ot
1286         @story_sheet2.reload
1287         @story_sheet2.t.should eq 0
1288       end
1289     end
1290     context 'テーブルに5件(t:0,1,2,3,4)で1を3に移動したとき' do
1291       before do
1292         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1293         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1294         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1295         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1296         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1297         @ot = @story_sheet2.t
1298         @story_sheet2.t = 3
1299       end
1300       it 'これから挿入するt(3)が欠番になっている' do
1301         #移動させたい行はそのまま残る
1302         @story_sheet2.higher_shift @ot
1303         l = StorySheet.find(:all).map {|s| s.t }
1304         l.sort.should eq [0, 1, 1, 2, 4]
1305       end
1306       it '既存のt0には変化がない' do
1307         @story_sheet2.higher_shift @ot
1308         @story_sheet.reload
1309         @story_sheet.t.should eq 0
1310       end
1311       it '既存のt4には変化がない' do
1312         @story_sheet2.higher_shift @ot
1313         @story_sheet5.reload
1314         @story_sheet5.t.should eq 4
1315       end
1316       it '既存のt2を1にシフトしている' do
1317         @story_sheet2.higher_shift @ot
1318         @story_sheet3.reload
1319         @story_sheet3.t.should eq 1
1320       end
1321       it '既存のt3を2にシフトしている' do
1322         @story_sheet2.higher_shift @ot
1323         @story_sheet4.reload
1324         @story_sheet4.t.should eq 2
1325       end
1326     end
1327     context '先ほどのケース+他のストーリー1件で挿入したとき' do
1328       before do
1329         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1330         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1331         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1332         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1333         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1334         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1335         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1336         @ot = @story_sheet2.t
1337         @story_sheet2.t = 3
1338       end
1339       it 'これから挿入するt(3)が欠番になっている' do
1340         #移動させたい行はそのまま残る
1341         @story_sheet2.higher_shift @ot
1342         l = StorySheet.find(:all).map {|s| s.t }
1343         l.sort.should eq [0, 0, 1, 1, 2, 4]
1344       end
1345       it '既存のt0には変化がない' do
1346         @story_sheet2.higher_shift @ot
1347         @story_sheet.reload
1348         @story_sheet.t.should eq 0
1349       end
1350       it '既存のt4には変化がない' do
1351         @story_sheet2.higher_shift @ot
1352         @story_sheet5.reload
1353         @story_sheet5.t.should eq 4
1354       end
1355       it '既存のt2を1にシフトしている' do
1356         @story_sheet2.higher_shift @ot
1357         @story_sheet3.reload
1358         @story_sheet3.t.should eq 1
1359       end
1360       it '既存のt3を2にシフトしている' do
1361         @story_sheet2.higher_shift @ot
1362         @story_sheet4.reload
1363         @story_sheet4.t.should eq 2
1364       end
1365       it '他のストーリーに影響がない' do
1366         @story_sheet2.higher_shift @ot
1367         @story_sheetc2.reload
1368         @story_sheetc2.t.should eq 0
1369       end
1370     end
1371     #例外ケース。
1372     #max超えたときはmaxとして正常扱い
1373     context 'テーブルに2件(t:0,1)で0を2に移動したとき' do
1374       before do
1375         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1376         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1377         @ot = @story_sheet.t
1378         @story_sheet.t = 2
1379       end
1380       it '既存のt1を0にシフトしてこれから挿入するt(1)が欠番になっている' do
1381         #移動させたい行はそのまま残る
1382         @story_sheet.higher_shift @ot
1383         l = StorySheet.find(:all).map {|s| s.t }
1384         l.sort.should eq [0, 0]
1385       end
1386       it '既存のt1を0にシフトしている' do
1387         @story_sheet.higher_shift @ot
1388         @story_sheet2.reload
1389         @story_sheet2.t.should eq 0
1390       end
1391       it '既存のt0は1に補正されている' do
1392         @story_sheet.higher_shift @ot
1393         @story_sheet.t.should eq 1
1394       end
1395     end
1396   end
1397   describe '入れ替えに於いて' do
1398     before do
1399       @comic = FactoryGirl.create :comic, :author_id => @author.id
1400       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1401       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1402       @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1403       @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1404     end
1405     context '新tが旧tより小さいとき' do
1406       it '少ない方に移動を依頼している' do
1407         StorySheet.any_instance.stub(:lesser_shift).with(any_args)
1408         StorySheet.any_instance.should_receive(:lesser_shift).with(any_args).exactly(1)
1409         ot = @story_sheet2.t
1410         @story_sheet2.t = 0
1411         @story_sheet2.update_shift ot
1412       end
1413     end
1414     context '新tが旧tより大きいとき' do
1415       it '大きい方に移動を依頼している' do
1416         StorySheet.any_instance.stub(:higher_shift).with(any_args)
1417         StorySheet.any_instance.should_receive(:higher_shift).with(any_args).exactly(1)
1418         ot = @story_sheet.t
1419         @story_sheet.t = 1
1420         @story_sheet.update_shift ot
1421       end
1422     end
1423   end
1424   describe '順序入れ替えに於いて' do
1425     before do
1426       @comic = FactoryGirl.create :comic, :author_id => @author.id
1427       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1428       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1429     end
1430     context 'オブジェクトが新規でtが空のとき' do
1431       it '末尾追加としてtを補充依頼している' do
1432         @story_sheet = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1433         StorySheet.stub(:new_t).with(any_args).and_return(0)
1434         StorySheet.should_receive(:new_t).with(any_args).exactly(1)
1435         @story_sheet.t = nil
1436         r = @story_sheet.rotate
1437       end
1438     end
1439     context 'オブジェクトが新規でtが設定されているとき' do
1440       it '挿入追加として挿入シフトを依頼している' do
1441         @story_sheet = FactoryGirl.build :story_sheet, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1442         StorySheet.any_instance.stub(:insert_shift).with(any_args)
1443         StorySheet.any_instance.should_receive(:insert_shift).with(any_args).exactly(1)
1444         @story_sheet.t = 0
1445         r = @story_sheet.rotate
1446       end
1447     end
1448     context 'オブジェクトが新規でなくtが設定されているとき' do
1449       it '用紙移動として入れ替えを依頼している' do
1450         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1451         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1452         StorySheet.any_instance.stub(:update_shift).with(any_args)
1453         StorySheet.any_instance.should_receive(:update_shift).with(1).exactly(1)
1454         @story_sheet2.t = 0
1455         r = @story_sheet.rotate 1
1456       end
1457     end
1458     context 'オブジェクトが新規でなくtが空のとき' do
1459       it '入れ替えもシフトもせず、tを空のままにしている' do
1460         #結果、tに欠番が生じてシリアライズチェックでひっかかる
1461       end
1462     end
1463   end
1464   describe '編集許可に於いて' do
1465     before do
1466       @comic = FactoryGirl.create :comic, :author_id => @author.id
1467       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1468       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1469       @story_sheet = FactoryGirl.build :story_sheet, :t => nil, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1470     end
1471     context 'つつがなく終わるとき' do
1472       it 'trueを返す' do
1473         r = @story_sheet.allow?
1474         r.should be_true
1475       end
1476     end
1477     context 'ストーリーで引っかかるとき' do
1478       it 'falseを返す' do
1479         Sheet.any_instance.stub(:usable?).with(any_args).and_return(true)
1480         Story.any_instance.stub(:own?).with(any_args).and_return(false)
1481         r = @story_sheet.allow?
1482         r.should be_false
1483       end
1484     end
1485     context '用紙で引っかかるとき' do
1486       it 'falseを返す' do
1487         Story.any_instance.stub(:own?).with(any_args).and_return(true)
1488         Sheet.any_instance.stub(:usable?).with(any_args).and_return(false)
1489         r = @story_sheet.allow?
1490         r.should be_false
1491       end
1492     end
1493     context 'ストーリーまたは用紙が指定されていなかったとき' do
1494       it 'nilを返す' do
1495         Story.any_instance.stub(:own?).with(any_args).and_return(true)
1496         @story_sheet.sheet_id = nil
1497         r = @story_sheet.allow?
1498         r.should eq nil
1499       end
1500       it 'nilを返す' do
1501         Sheet.any_instance.stub(:usable?).with(any_args).and_return(true)
1502         @story_sheet.story_id = nil
1503         r = @story_sheet.allow?
1504         r.should eq nil
1505       end
1506     end
1507   end
1508   describe '保存に於いて' do
1509     before do
1510       @comic = FactoryGirl.create :comic, :author_id => @author.id
1511       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1512       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1513       @story_sheet = FactoryGirl.build :story_sheet, :t => nil, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1514     end
1515     context 'つつがなく終わるとき' do
1516       it '編集許可チェックを依頼している' do
1517         StorySheet.any_instance.stub(:allow?).with(any_args).and_return(true)
1518         StorySheet.any_instance.should_receive(:allow?).with(any_args).exactly(1)
1519         r = @story_sheet.store
1520       end
1521       it '順序入れ替えを依頼している' do
1522         StorySheet.any_instance.stub(:rotate).with(any_args).and_return(0)
1523         StorySheet.any_instance.should_receive(:rotate).with(any_args).exactly(1)
1524         StorySheet.any_instance.stub(:save).with(any_args).and_return(true)
1525         StorySheet.stub(:validate_t).with(any_args).and_return(true)
1526         r = @story_sheet.store 
1527       end
1528       it '保存を依頼している' do
1529         StorySheet.stub(:new_t).with(any_args).and_return(0)
1530         StorySheet.any_instance.stub(:save).with(any_args).and_return(true)
1531         StorySheet.any_instance.should_receive(:save).with(any_args).exactly(1)
1532         StorySheet.stub(:validate_t).with(any_args).and_return(true)
1533         r = @story_sheet.store
1534       end
1535       it 'tのシリアライズチェックを依頼している' do
1536         StorySheet.stub(:new_t).with(any_args).and_return(0)
1537         StorySheet.any_instance.stub(:save).with(any_args).and_return(true)
1538         StorySheet.stub(:validate_t).with(any_args).and_return(true)
1539         StorySheet.should_receive(:validate_t).with(any_args).exactly(1)
1540         r = @story_sheet.store
1541       end
1542     end
1543     #入れ替えテストと同じテストを実施。こちらはシフトだけでなく本尊も更新されている
1544     context 'テーブルに5件(t:0,1,2,3,4)+他のストーリー1件で2に挿入したとき' do
1545       before do
1546         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1547         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1548         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1549         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1550         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1551         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1552         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1553         @story_sheet6 = FactoryGirl.build :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1554       end
1555       it '既存のt0には変化がない' do
1556         @story_sheet6.store
1557         @story_sheet.reload
1558         @story_sheet.t.should eq 0
1559       end
1560       it '既存のt1には変化がない' do
1561         @story_sheet6.store
1562         @story_sheet2.reload
1563         @story_sheet2.t.should eq 1
1564       end
1565       it '既存のt2を3にシフトしている' do
1566         @story_sheet6.store
1567         @story_sheet3.reload
1568         @story_sheet3.t.should eq 3
1569       end
1570       it '既存のt3を4にシフトしている' do
1571         @story_sheet6.store
1572         @story_sheet4.reload
1573         @story_sheet4.t.should eq 4
1574       end
1575       it '既存のt5を5にシフトしている' do
1576         @story_sheet6.store
1577         @story_sheet5.reload
1578         @story_sheet5.t.should eq 5
1579       end
1580       it '新規のt2が作成されている' do
1581         @story_sheet6.store
1582         @story_sheet6.reload
1583         @story_sheet6.t.should eq 2
1584       end
1585       it '他のストーリーに影響がない' do
1586         @ot = @story_sheetc2.t
1587         @story_sheet6.store
1588         @story_sheetc2.reload
1589         @story_sheetc2.t.should eq @ot
1590       end
1591     end
1592     context 'テーブルに5件(t:0,1,2,3,4)+他のストーリー1件で3を1に移動したとき' do
1593       before do
1594         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1595         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1596         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1597         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1598         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1599         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1600         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1601         @ot = @story_sheet4.t
1602         @story_sheet4.t = 1
1603       end
1604       it '既存のt0には変化がない' do
1605         @story_sheet4.store @ot
1606         @story_sheet.reload
1607         @story_sheet.t.should eq 0
1608       end
1609       it '既存のt4には変化がない' do
1610         @story_sheet4.store @ot
1611         @story_sheet5.reload
1612         @story_sheet5.t.should eq 4
1613       end
1614       it '既存のt1を2にシフトしている' do
1615         @story_sheet4.store @ot
1616         @story_sheet2.reload
1617         @story_sheet2.t.should eq 2
1618       end
1619       it '既存のt2を3にシフトしている' do
1620         @story_sheet4.store @ot
1621         @story_sheet3.reload
1622         @story_sheet3.t.should eq 3
1623       end
1624       it '既存のt3を1にシフトしている' do
1625         @story_sheet4.store @ot
1626         @story_sheet4.reload
1627         @story_sheet4.t.should eq 1
1628       end
1629       it '他のストーリーに影響がない' do
1630         @story_sheet4.store @ot
1631         @story_sheetc2.reload
1632         @story_sheetc2.t.should eq 0
1633       end
1634     end
1635     context 'テーブルに5件(t:0,1,2,3,4)+他のストーリー1件で1を3に移動したとき' do
1636       before do
1637         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1638         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1639         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1640         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1641         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1642         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1643         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1644         @ot = @story_sheet2.t
1645         @story_sheet2.t = 3
1646       end
1647       it '既存のt0には変化がない' do
1648         @story_sheet2.store @ot
1649         @story_sheet.reload
1650         @story_sheet.t.should eq 0
1651       end
1652       it '既存のt4には変化がない' do
1653         @story_sheet2.store @ot
1654         @story_sheet5.reload
1655         @story_sheet5.t.should eq 4
1656       end
1657       it '既存のt1を3にシフトしている' do
1658         @story_sheet2.store @ot
1659         @story_sheet2.reload
1660         @story_sheet2.t.should eq 3
1661       end
1662       it '既存のt2を1にシフトしている' do
1663         @story_sheet2.store @ot
1664         @story_sheet3.reload
1665         @story_sheet3.t.should eq 1
1666       end
1667       it '既存のt3を2にシフトしている' do
1668         @story_sheet2.store @ot
1669         @story_sheet4.reload
1670         @story_sheet4.t.should eq 2
1671       end
1672       it '他のストーリーに影響がない' do
1673         @story_sheet2.store @ot
1674         @story_sheetc2.reload
1675         @story_sheetc2.t.should eq 0
1676       end
1677     end
1678     #ロールバックテスト。入れ替えが直接DBをいじるので、すべてのケースで確実にロールバックを確認する
1679     context 'テーブルに5件(t:0,1,2,3,4)+他のストーリー1件で2に挿入したが保存に失敗したとき' do
1680       before do
1681         StorySheet.any_instance.stub(:save).with(any_args).and_return(false)
1682         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1683         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1684         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1685         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1686         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1687         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1688         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1689         @story_sheet6 = FactoryGirl.build :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1690       end
1691       it '既存のtに変化がない' do
1692         @story_sheet6.store
1693         @story_sheet.reload
1694         @story_sheet.t.should eq 0
1695         @story_sheet2.reload
1696         @story_sheet2.t.should eq 1
1697         @story_sheet3.reload
1698         @story_sheet3.t.should eq 2
1699         @story_sheet4.reload
1700         @story_sheet4.t.should eq 3
1701         @story_sheet5.reload
1702         @story_sheet5.t.should eq 4
1703         @story_sheetc2.reload
1704         @story_sheetc2.t.should eq 0
1705       end
1706       it 'falseを返す' do
1707         r = @story_sheet6.store
1708         r.should be_false
1709       end
1710     end
1711     context 'テーブルに5件(t:0,1,2,3,4)+他のストーリー1件で3を1に移動したがシリアルチェックに失敗したとき' do
1712       before do
1713         StorySheet.stub(:validate_t).with(any_args).and_return(false)
1714         @story2 = FactoryGirl.create :story, :comic_id => @comic.id
1715         @story_sheetc2 = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story2.id, :sheet_id => @sheet.id, :author_id => @author.id
1716         @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1717         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1718         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1719         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1720         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1721         @ot = @story_sheet4.t
1722         @story_sheet4.t = 1
1723       end
1724       it '既存のtに変化がない' do
1725         @story_sheet4.store @ot
1726         @story_sheet.reload
1727         @story_sheet.t.should eq 0
1728         @story_sheet2.reload
1729         @story_sheet2.t.should eq 1
1730         @story_sheet3.reload
1731         @story_sheet3.t.should eq 2
1732         @story_sheet4.reload
1733         @story_sheet4.t.should eq 3
1734         @story_sheet5.reload
1735         @story_sheet5.t.should eq 4
1736         @story_sheetc2.reload
1737         @story_sheetc2.t.should eq 0
1738       end
1739       it 'falseを返す' do
1740         r = @story_sheet4.store @ot
1741         r.should be_false
1742       end
1743       it 'tにエラーメッセージが入っている' do
1744         @story_sheet4.store @ot
1745         @story_sheet4.errors[:t].should_not be_empty
1746         @story_sheet4.valid?.should be_true
1747       end
1748     end
1749     context '編集不可だったとき' do
1750       before do
1751         @story_sheet = FactoryGirl.build :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1752         StorySheet.any_instance.stub(:allow?).and_return(false)
1753       end
1754       it '403Forbidden例外を返す' do
1755         lambda{
1756           @story_sheet.store
1757         }.should raise_error(ActiveRecord::Forbidden)
1758       end
1759     end
1760   end
1761   describe '切り詰め処理つき削除に於いて' do
1762     before do
1763       @comic = FactoryGirl.create :comic, :author_id => @author.id
1764       @story = FactoryGirl.create :story, :comic_id => @comic.id, :visible => 1
1765       @sheet = FactoryGirl.create :sheet, :author_id => @author.id
1766       @story_sheet = FactoryGirl.create :story_sheet, :t => 0, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1767     end
1768     context 'つつがなく終わるとき' do
1769       it '削除される' do
1770         lambda{
1771           @story_sheet.destroy_and_shorten
1772         }.should change(StorySheet, :count ).by(-1)
1773       end
1774       it 'Trueを返す' do
1775         r = @story_sheet.destroy_and_shorten
1776         r.should be_true 
1777       end
1778     end
1779     context '削除に失敗したとき' do
1780       before do
1781         StorySheet.any_instance.stub(:destroy).and_return(false)
1782       end
1783       it 'ロールバックされる' do
1784         lambda{
1785           @story_sheet.destroy_and_shorten
1786         }.should_not change(StorySheet, :count )
1787       end
1788       it 'Falseを返す' do
1789         r = @story_sheet.destroy_and_shorten
1790         r.should be_false
1791       end
1792     end
1793     #連携テスト。切り詰めが直接DBをいじる
1794     context '2件で先頭を削除したとき' do
1795       before do
1796         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1797       end
1798       it '行が削除される' do
1799         lambda{
1800           @story_sheet.destroy_and_shorten
1801         }.should change(StorySheet, :count ).by(-1)
1802       end
1803       it '先頭は削除される' do
1804         @story_sheet.destroy_and_shorten
1805         lambda{
1806           StorySheet.find @story_sheet.id
1807         }.should raise_error(ActiveRecord::RecordNotFound)
1808       end
1809       it '2件目は前に詰められる' do
1810         @story_sheet.destroy_and_shorten
1811         @story_sheet2.reload
1812         @story_sheet2.t.should eq 0
1813       end
1814     end
1815     context '3件で先頭を削除したとき' do
1816       before do
1817         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1818         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1819       end
1820       it '行が削除される' do
1821         lambda{
1822           @story_sheet.destroy_and_shorten
1823         }.should change(StorySheet, :count ).by(-1)
1824       end
1825       it '先頭は削除される' do
1826         @story_sheet.destroy_and_shorten
1827         lambda{
1828           StorySheet.find @story_sheet.id
1829         }.should raise_error(ActiveRecord::RecordNotFound)
1830       end
1831       it '2件目は前に詰められる' do
1832         @story_sheet.destroy_and_shorten
1833         @story_sheet2.reload
1834         @story_sheet2.t.should eq 0
1835       end
1836       it '3件目は前に詰められる' do
1837         @story_sheet.destroy_and_shorten
1838         @story_sheet3.reload
1839         @story_sheet3.t.should eq 1
1840       end
1841     end
1842     context '5件で3件目を削除したとき' do
1843       before do
1844         @story_sheet2 = FactoryGirl.create :story_sheet, :t => 1, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1845         @story_sheet3 = FactoryGirl.create :story_sheet, :t => 2, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1846         @story_sheet4 = FactoryGirl.create :story_sheet, :t => 3, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1847         @story_sheet5 = FactoryGirl.create :story_sheet, :t => 4, :story_id => @story.id, :sheet_id => @sheet.id, :author_id => @author.id
1848       end
1849       it '行が削除される' do
1850         lambda{
1851           @story_sheet3.destroy_and_shorten
1852         }.should change(StorySheet, :count ).by(-1)
1853       end
1854       it '1件目は変化がない' do
1855         @story_sheet3.destroy_and_shorten
1856         @story_sheet.reload
1857         @story_sheet.t.should eq 0
1858       end
1859       it '2件目は変化がない' do
1860         @story_sheet3.destroy_and_shorten
1861         @story_sheet2.reload
1862         @story_sheet2.t.should eq 1
1863       end
1864       it '3件目は削除される' do
1865         @story_sheet3.destroy_and_shorten
1866         lambda{
1867           StorySheet.find @story_sheet3.id
1868         }.should raise_error(ActiveRecord::RecordNotFound)
1869       end
1870       it '4件目は前に詰められる' do
1871         @story_sheet3.destroy_and_shorten
1872         @story_sheet4.reload
1873         @story_sheet4.t.should eq 2
1874       end
1875       it '5件目は前に詰められる' do
1876         @story_sheet3.destroy_and_shorten
1877         @story_sheet5.reload
1878         @story_sheet5.t.should eq 3
1879       end
1880     end
1881     #ロールバックテスト。切り詰めが直接DBをいじるので、すべてのケースで確実にロールバックを確認する
1882   end
1883 end