OSDN Git Service

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