OSDN Git Service

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