OSDN Git Service

fix spec
[pettanr/pettanr.git] / spec / models / scroll_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #スクロール
4
5 describe Scroll do
6   
7   before do
8     @admin =FactoryGirl.create :admin
9     @user_yas = FactoryGirl.create :user_yas_with_owner
10     @user_rom = FactoryGirl.create :user_rom
11     @author_yas =  @user_yas.author
12   end
13   
14   describe '検証に於いて' do
15     before do
16       @item = FactoryGirl.build :scroll_hello, author: @author_yas
17     end
18     
19     context 'オーソドックスなデータのとき' do
20       it '下限データが通る' do
21         @item.title = 'a'
22         @item.visible = 0
23         expect(@item).to be_valid
24       end
25       it '上限データが通る' do
26         @item.title = 'a'*100
27         @item.visible = 1
28         expect(@item).to be_valid
29       end
30     end
31     
32     context 'titleを検証するとき' do
33       it 'nullなら失敗する' do
34         @item.title = nil
35         expect(@item).to_not be_valid
36       end
37       it '100文字以上なら失敗する' do
38         @item.title = 'a'*101
39         expect(@item).to_not be_valid
40       end
41     end
42     context 'visibleを検証するとき' do
43       it 'nullなら失敗する' do
44         @item.visible = nil
45         expect(@item).to_not be_valid
46       end
47       it '負なら失敗する' do
48         @item.visible = -1
49         expect(@item).to_not be_valid
50       end
51       it '2以上なら失敗する' do
52         @item.visible = 2
53         expect(@item).to_not be_valid
54       end
55     end
56     
57     context 'author_idを検証するとき' do
58       it 'nullなら失敗する' do
59         @item.author_id = nil
60         expect(@item).to_not be_valid
61       end
62       it '数値でなければ失敗する' do
63         @item.author_id = 'a'
64         expect(@item).to_not be_valid
65       end
66       it '存在する作家でなければ失敗する' do
67         @item.author_id = 0
68         expect(@item).to_not be_valid
69       end
70     end
71   end
72   
73   describe 'デフォルト値補充に於いて' do
74     it 'visibleが0になっている' do
75       @item = FactoryGirl.build :scroll_hello, author: @author_yas
76       @item.supply_default
77       expect(@item.visible).to eq 0
78     end
79   end
80   
81   describe '上書き補充に於いて' do
82     it '作家idが設定されている' do
83       @item = FactoryGirl.build :scroll_hello, author: @author_yas
84       @item.overwrite @author
85       expect(@item.author_id).to eq @author.id
86     end
87   end
88   
89   describe '所持判定に於いて' do
90     before do
91       @item = FactoryGirl.build :scroll_hello, author: @author_yas
92     end
93     context 'ロール内作家が取得できるとき' do
94       before do
95       end
96       it 'ロール内作家のidが自身の作家idと一致するなら許可する' do
97         Scroll.stub(:get_author_from_roles).with(any_args).and_return(@author)
98         r = @item.own?([@author])
99         r.should be_true
100       end
101       it 'ロール内作家のidが自身の作家idと一致しないならno' do
102         Scroll.stub(:get_author_from_roles).with(any_args).and_return(@other_author)
103         @item.own?(@other_author).should be_false
104       end
105     end
106     context 'ロール内作家が取得できないとき' do
107       before do
108         Scroll.stub(:get_author_from_roles).with(any_args).and_return(nil)
109       end
110       it 'Falseを返す' do
111         r = @item.own?([@author])
112         r.should be_false
113       end
114     end
115   end
116   
117   describe '閲覧許可に於いて' do
118     before do
119       @item = FactoryGirl.build :scroll_hello, author: @author_yas
120     end
121     context 'オープンモードのとき' do
122       before do
123         MagicNumber['run_mode'] = 0
124       end
125       context 'ゲストのとき' do
126         it '他人のの非公開スクロールでも許可する' do
127         end
128       end
129       context 'yasのとき' do
130         it '自分のスクロールなら許可する' do
131           Scroll.any_instance.stub(:own?).and_return(true)
132           Scroll.any_instance.stub(:visible).and_return(0)
133           r = @item.visible?([@author])
134           r.should be_true
135         end
136         it '他人の非公開スクロールなら許可しない' do
137         end
138         it '他人のスクロールでも公開なら許可する' do
139         end
140       end
141       context 'adminのとき' do
142         it '他人のの非公開スクロールでも許可する' do
143         end
144       end
145     end
146     context 'クローズドモードのとき' do
147       before do
148         MagicNumber['run_mode'] = 1
149       end
150       context 'ゲストのとき' do
151         it '他人のの非公開スクロールでも許可する' do
152         end
153       end
154       context 'yasのとき' do
155         it '自分のスクロールなら許可する' do
156           Scroll.any_instance.stub(:own?).and_return(true)
157           Scroll.any_instance.stub(:visible).and_return(0)
158           r = @item.visible?([@author])
159           r.should be_true
160         end
161         it '他人の非公開スクロールなら許可しない' do
162         end
163         it '他人のスクロールでも公開なら許可する' do
164         end
165       end
166       context 'adminのとき' do
167         it '他人のの非公開スクロールでも許可する' do
168         end
169       end
170     end
171   end
172   
173   describe '単体取得に於いて' do
174     before do
175       @item = FactoryGirl.create :scroll, :author_id => @author.id
176     end
177     it '指定のスクロールを返す' do
178       c = Scroll.show @item.id, @author
179       c.should eq @item
180     end
181     context '閲覧許可が出なかったとき' do
182       it '403Forbidden例外を返す' do
183         Scroll.any_instance.stub(:visible?).and_return(false)
184         lambda{
185           Scroll.show @item.id, @author
186         }.should raise_error(ActiveRecord::Forbidden)
187       end
188     end
189     context '存在しないスクロールを開こうとしたとき' do
190       it '404RecordNotFound例外を返す' do
191         lambda{
192           Scroll.show 110, @author
193         }.should raise_error(ActiveRecord::RecordNotFound)
194       end
195     end
196   end
197   
198   describe '編集取得に於いて' do
199     before do
200       @item = FactoryGirl.create :scroll, :author_id => @author.id
201     end
202     context 'つつがなく終わるとき' do
203       it '単体取得オプションを利用している' do
204         Scroll.stub(:show_opt).with(any_args).and_return({})
205         Scroll.should_receive(:show_opt).with(any_args).exactly(1)
206         r = Scroll.edit @item.id, @author
207       end
208       it '所持判定を問い合わせている' do
209         Scroll.any_instance.stub(:own?).with(any_args).and_return(true)
210         Scroll.any_instance.should_receive(:own?).with(any_args).exactly(1)
211         r = Scroll.edit @item.id, @author
212       end
213     end
214     it '指定のスクロールを返す' do
215       Scroll.any_instance.stub(:own?).and_return(true)
216       c = Scroll.edit @item.id, @author.id
217       c.should eq @item
218     end
219     context '他人のスクロールを開こうとしたとき' do
220       it '403Forbidden例外を返す' do
221         Scroll.any_instance.stub(:own?).and_return(false)
222         lambda{
223           Scroll.edit @item.id, @author
224         }.should raise_error(ActiveRecord::Forbidden)
225       end
226     end
227     context '存在しないスクロールを開こうとしたとき' do
228       it '404RecordNotFound例外を返す' do
229         lambda{
230           Scroll.edit 110, @author
231         }.should raise_error(ActiveRecord::RecordNotFound)
232       end
233     end
234   end
235   
236   describe '削除に於いて' do
237     before do
238       @item = FactoryGirl.create :scroll, :author_id => @author.id
239       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
240       @item_panel = FactoryGirl.create :scroll_panel, :author_id => @author.id, :scroll_id => @item.id, :panel_id => @panel.id
241       @other_scroll = FactoryGirl.create :scroll, :author_id => @author.id
242       @other_scroll_panel = FactoryGirl.create :scroll_panel, :author_id => @author.id, :scroll_id => @other_scroll.id, :panel_id => @panel.id
243     end
244     context 'つつがなく終わるとき' do
245       it '自身を削除する' do
246         lambda {
247           r = @item.destroy_with_scroll_panel
248         }.should change(Scroll, :count).by(-1)
249         lambda {
250           r = Scroll.find @item.id
251         }.should raise_error
252       end
253       it '自身にリンクしているスクコマをすべて削除する' do
254         lambda {
255           r = @item.destroy_with_scroll_panel
256         }.should change(ScrollPanel, :count).by(-1)
257         lambda {
258           r = ScrollPanel.find @item_panel.id
259         }.should raise_error
260       end
261       it 'Trueを返す' do
262         r = @item.destroy_with_scroll_panel
263         r.should be_true
264       end
265     end
266     context '削除に失敗したとき' do
267       before do
268         ScrollPanel.any_instance.stub(:destroy).with(any_args).and_return(false)
269       end
270       it 'Falseを返す' do
271         r = @item.destroy_with_scroll_panel
272         r.should be_false
273       end
274       it 'ロールバックしている' do
275         lambda {
276           r = @item.destroy_with_scroll_panel
277         }.should_not change(Scroll, :count)
278         lambda {
279           r = @item.destroy_with_scroll_panel
280         }.should_not change(ScrollPanel, :count)
281       end
282     end
283   end
284 end