OSDN Git Service

t30354#:create mylist for rp
[pettanr/pettanr.git] / spec / models / ground_color_spec.rb
1 # -*- encoding: utf-8 -*-
2 require 'spec_helper'
3 #選択色地
4
5 describe GroundColor do
6   before do
7     @admin = FactoryGirl.create :admin
8     @user = FactoryGirl.create( :user_yas)
9     @author = FactoryGirl.create :author, :user_id => @user.id
10     @artist = FactoryGirl.create :artist_yas, :author_id => @author.id
11     @other_user = FactoryGirl.create( :user_yas)
12     @other_author = FactoryGirl.create :author, :user_id => @other_user.id
13     @other_artist = FactoryGirl.create :artist_yas, :author_id => @other_author.id
14     @sp = FactoryGirl.create :system_picture
15     @lg = FactoryGirl.create :license_group
16     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id
17     @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
18     @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
19     @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
20     @panel = FactoryGirl.create :panel, :author_id => @author.id
21     @color = FactoryGirl.create :color
22   end
23   
24   describe '検証に於いて' do
25     before do
26       @gc = FactoryGirl.build :ground_color, :panel_id => @panel.id, :color_id => @color.id
27     end
28     
29     context 'オーソドックスなデータのとき' do
30       it '下限データが通る' do
31         @gc.z = 1
32         @gc.should be_valid
33       end
34       it '上限データが通る' do
35         @gc.z = 99999
36         @gc.should be_valid
37       end
38     end
39     
40     context 'panel_idを検証するとき' do
41       #ネストの保存はnilを許可しなければならないので数値チェックだけ
42       it '数値でなければ失敗する' do
43         @gc.panel_id = 'a'
44         @gc.should_not be_valid
45       end
46     end
47     context 'color_idを検証するとき' do
48       it 'nullなら失敗する' do
49         @gc.color_id = nil
50         @gc.should_not be_valid
51       end
52       it '数値でなければ失敗する' do
53         @gc.color_id = 'a'
54         @gc.should_not be_valid
55       end
56       it '存在する色でなければ失敗する' do
57         @gc.color_id = 0
58         @gc.should_not be_valid
59       end
60     end
61     context 'zを検証するとき' do
62       it 'nullなら失敗する' do
63         @gc.z = nil
64         @gc.should_not be_valid
65       end
66       it '数値でなければ失敗する' do
67         @gc.z = 'a'
68         @gc.should_not be_valid
69       end
70       it '負なら失敗する' do
71         @gc.z = -1
72         @gc.should_not be_valid
73       end
74       it '負なら失敗する' do
75         @gc.z = 0
76         @gc.should_not be_valid
77       end
78     end
79   end
80   
81   describe 'デフォルト値補充に於いて' do
82     it 'defined' do
83       @gc = FactoryGirl.build :ground_color, :panel_id => @panel.id, :color_id => @color.id
84       @gc.supply_default
85     end
86   end
87   
88   describe '上書き補充に於いて' do
89     it 'defined' do
90       @gc = FactoryGirl.build :ground_color, :panel_id => @panel.id, :color_id => @color.id
91       @gc.overwrite
92     end
93   end
94   
95   describe '閲覧許可に於いて' do
96     before do
97       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
98     end
99     context '検査対象がnil(ゲスト)のとき' do
100       context 'クローズドモードのとき' do
101         before do
102           MagicNumber['run_mode'] = 1
103         end
104         it '不許可を返す。' do
105           r = @gc.visible?(nil)
106           r.should be_false
107         end
108       end
109       context 'オープンモードのとき' do
110         before do
111           MagicNumber['run_mode'] = 0
112         end
113         it '公開されたコマの選択色地なら許可する' do
114           Panel.any_instance.stub(:publish?).with(any_args).and_return(true)
115           r = @gc.visible?(nil)
116           r.should be_true
117         end
118         it 'れ以外なら不許可を返す' do
119           Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
120           r = @gc.visible?(nil)
121           r.should be_false
122         end
123       end
124     end
125     context '検査対象が作家のとき' do
126       it '公開されたコマの選択色地なら許可する' do
127         Panel.any_instance.stub(:publish?).with(any_args).and_return(true)
128         r = @gc.visible?(@author)
129         r.should be_true
130       end
131       it 'れ以外なら不許可を返す' do
132         Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
133         r = @gc.visible?(@author)
134         r.should be_false
135       end
136     end
137     context '検査対象が管理者のとき' do
138       it '許可を返す。' do
139         Panel.any_instance.stub(:publish?).with(any_args).and_return(false)
140         r = @gc.visible?(@admin)
141         r.should be_true
142       end
143     end
144     context '検査対象がそれ以外のとき' do
145       it '不許可を返す。' do
146         r = @gc.visible?(1)
147         r.should be_false
148       end
149     end
150   end
151   
152   describe '一覧取得に於いて' do
153     before do
154       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
155     end
156     context 'page補正について' do
157       it '文字列から数値に変換される' do
158         GroundColor.page('8').should eq 8
159       end
160       it 'nilの場合は1になる' do
161         GroundColor.page().should eq 1
162       end
163       it '0以下の場合は1になる' do
164         GroundColor.page('0').should eq 1
165       end
166     end
167     context 'page_size補正について' do
168       it '文字列から数値に変換される' do
169         GroundColor.page_size('7').should eq 7
170       end
171       it 'nilの場合はGroundColor.default_page_sizeになる' do
172         GroundColor.page_size().should eq GroundColor.default_page_size
173       end
174       it '0以下の場合はGroundColor.default_page_sizeになる' do
175         GroundColor.page_size('0').should eq GroundColor.default_page_size
176       end
177       it 'GroundColor.max_page_sizeを超えた場合はGroundColor.max_page_sizeになる' do
178         GroundColor.page_size('1000').should eq GroundColor.max_page_size
179       end
180     end
181     context 'つつがなく終わるとき' do
182       it '一覧取得オプションを利用している' do
183         GroundColor.stub(:list_opt).with(any_args).and_return({:include => :panel})
184         GroundColor.should_receive(:list_opt).with(any_args).exactly(1)
185         r = GroundColor.list
186       end
187     end
188     it 'リストを返す' do
189       pl = GroundColor.list
190       pl.should eq [@gc]
191     end
192     it '時系列で並んでいる' do
193       #公開コマなら(他人のコマであっても)含んでいる
194       opl = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
195       npl = FactoryGirl.create :ground_color, :panel_id => opl.id, :color_id => @color.id, :updated_at => Time.now + 100
196       pl = GroundColor.list
197       pl.should eq [npl, @gc]
198     end
199     it '非公開のコマの選択色地は含まない' do
200       hpl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
201       npl = FactoryGirl.create :ground_color, :panel_id => hpl.id, :color_id => @color.id, :updated_at => Time.now + 100
202       pl = GroundColor.list
203       pl.should eq [@gc]
204     end
205     context 'DBに5件あって1ページの件数を2件に変えたとして' do
206       before do
207         @gc2 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 1, :color_id => @color.id, :updated_at => Time.now + 100
208         @gc3 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 2, :color_id => @color.id, :updated_at => Time.now + 200
209         @gc4 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 3, :color_id => @color.id, :updated_at => Time.now + 300
210         @gc5 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 4, :color_id => @color.id, :updated_at => Time.now + 400
211         GroundColor.stub(:default_page_size).and_return(2)
212       end
213       it '通常は2件を返す' do
214         pl = GroundColor.list
215         pl.should have(2).items 
216       end
217       it 'page=1なら末尾2件を返す' do
218         #時系列で並んでいる
219         pl = GroundColor.list(1)
220         pl.should eq [@gc5, @gc4]
221       end
222       it 'page=2なら中間2件を返す' do
223         pl = GroundColor.list(2)
224         pl.should eq [@gc3, @gc2]
225       end
226       it 'page=3なら先頭1件を返す' do
227         pl = GroundColor.list(3)
228         pl.should eq [@gc]
229       end
230     end
231     context 'DBに5件あって1ページの件数を0件に変えたとして' do
232       before do
233         @gc2 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 1, :color_id => @color.id, :updated_at => Time.now + 100
234         @gc3 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 2, :color_id => @color.id, :updated_at => Time.now + 200
235         @gc4 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 3, :color_id => @color.id, :updated_at => Time.now + 300
236         @gc5 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 4, :color_id => @color.id, :updated_at => Time.now + 400
237         GroundColor.stub(:default_page_size).and_return(2)
238       end
239       it '通常は全件(5件)を返す' do
240         r = GroundColor.list 5, 0
241         r.should have(5).items 
242       end
243     end
244   end
245   
246   describe '一覧取得オプションに於いて' do
247     it 'includeキーを含んでいる' do
248       r = GroundColor.list_opt
249       r.has_key?(:include).should be_true
250     end
251     it '2つの項目を含んでいる' do
252       r = GroundColor.list_opt[:include]
253       r.should have(2).items
254     end
255     it 'コマを含んでいる' do
256       r = GroundColor.list_opt[:include]
257       r.has_key?(:panel).should be_true
258     end
259       it 'コマは作家を含んでいる' do
260         r = GroundColor.list_opt[:include]
261         r[:panel].has_key?(:author).should be_true
262       end
263     it '色を含んでいる' do
264       r = GroundColor.list_opt[:include]
265       r.has_key?(:color).should be_true
266     end
267   end
268   describe 'json一覧出力オプションに於いて' do
269     before do
270       @op = FactoryGirl.create :original_picture, :artist_id => @artist.id
271       @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id
272       @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id
273       @sbt = FactoryGirl.create :speech_balloon_template
274       @comic = FactoryGirl.create :comic, :author_id => @author.id, :visible => 1
275       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1
276       @story = FactoryGirl.create :story, :author_id => @author.id, :comic_id => @comic.id, :panel_id => @panel.id
277       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
278     end
279     it 'コマを含んでいる' do
280       r = GroundColor.list.to_json GroundColor.list_json_opt
281       j = JSON.parse r
282       i = j.first
283       i.has_key?('panel').should be_true
284     end
285       it 'コマは作家を含んでいる' do
286         r = GroundColor.list.to_json GroundColor.list_json_opt
287         j = JSON.parse r
288         i = j.first
289         s = i['panel']
290         s.has_key?('author').should be_true
291       end
292     it '色を含んでいる' do
293       r = GroundColor.list.to_json GroundColor.list_json_opt
294       j = JSON.parse r
295       i = j.first
296       i.has_key?('color').should be_true
297     end
298   end
299   
300   describe '自分のコマで使った選択色地一覧取得に於いて' do
301     before do
302       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
303     end
304     context 'つつがなく終わるとき' do
305       it '一覧取得オプションを利用している' do
306         GroundColor.stub(:list_opt).with(any_args).and_return({:include => :panel})
307         GroundColor.should_receive(:list_opt).with(any_args).exactly(1)
308         r = GroundColor.mylist @author
309       end
310     end
311     it 'リストを返す' do
312       pl = GroundColor.mylist @author
313       pl.should eq [@gc]
314     end
315     it '時系列で並んでいる' do
316       npl = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id, :z => 2, :updated_at => Time.now + 100
317       pl = GroundColor.mylist @author
318       pl.should eq [npl, @gc]
319     end
320     it '他人のコマの選択色地は公開でも含まない' do
321       hpl = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1
322       npl = FactoryGirl.create :ground_color, :panel_id => hpl.id, :color_id => @color.id
323       pl = GroundColor.mylist @author
324       pl.should eq [@gc]
325     end
326     it '自分のコマの選択色地は非公開でも含んでいる' do
327       hpl = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0
328       npl = FactoryGirl.create :ground_color, :panel_id => hpl.id, :color_id => @color.id, :z => 2, :updated_at => Time.now + 100
329       pl = GroundColor.mylist @author
330       pl.should eq [npl, @gc]
331     end
332     context 'DBに5件あって1ページの件数を2件に変えたとして' do
333       before do
334         @gc2 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 1, :color_id => @color.id, :updated_at => Time.now + 100
335         @gc3 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 2, :color_id => @color.id, :updated_at => Time.now + 200
336         @gc4 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 3, :color_id => @color.id, :updated_at => Time.now + 300
337         @gc5 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 4, :color_id => @color.id, :updated_at => Time.now + 400
338       end
339       it '通常は2件を返す' do
340         c = GroundColor.mylist @author, 1, 2
341         c.should have(2).items 
342       end
343       it 'page=1なら末尾2件を返す' do
344         #時系列で並んでいる
345         c = GroundColor.mylist(@author, 1, 2)
346         c.should eq [@gc5, @gc4]
347       end
348       it 'page=2なら中間2件を返す' do
349         c = GroundColor.mylist(@author, 2, 2)
350         c.should eq [@gc3, @gc2]
351       end
352       it 'page=3なら先頭1件を返す' do
353         c = GroundColor.mylist(@author, 3, 2)
354         c.should eq [@gc]
355       end
356     end
357     context 'DBに5件あって1ページの件数を0件に変えたとして' do
358       before do
359         @gc2 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 1, :color_id => @color.id, :updated_at => Time.now + 100
360         @gc3 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 2, :color_id => @color.id, :updated_at => Time.now + 200
361         @gc4 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 3, :color_id => @color.id, :updated_at => Time.now + 300
362         @gc5 = FactoryGirl.create :ground_color, :panel_id => @panel.id, :z => 4, :color_id => @color.id, :updated_at => Time.now + 400
363         Author.stub(:default_ground_color_page_size).and_return(2)
364       end
365       it '通常は全件(5件)を返す' do
366         r = GroundColor.mylist @author, 5, 0
367         r.should have(5).items 
368       end
369     end
370   end
371   
372   describe '単体取得に於いて' do
373     before do
374       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
375     end
376     context 'つつがなく終わるとき' do
377       it '単体取得オプションを利用している' do
378         GroundColor.stub(:show_opt).with(any_args).and_return({:include => :panel})
379         GroundColor.should_receive(:show_opt).with(any_args).exactly(1)
380         r = GroundColor.show @gc.id, @author
381       end
382       it '閲覧許可を問い合わせている' do
383         GroundColor.any_instance.stub(:visible?).with(any_args).and_return(true)
384         GroundColor.any_instance.should_receive(:visible?).with(any_args).exactly(1)
385         r = GroundColor.show @gc.id, @author
386       end
387     end
388     it '指定の選択色地を返す' do
389       GroundColor.any_instance.stub(:visible?).and_return(true)
390       pl = GroundColor.show @gc.id, @author
391       pl.should eq @gc
392     end
393     context '閲覧許可が出なかったとき' do
394       it '403Forbidden例外を返す' do
395         GroundColor.any_instance.stub(:visible?).and_return(false)
396         lambda{
397           GroundColor.show @gc.id, @author
398         }.should raise_error(ActiveRecord::Forbidden)
399       end
400     end
401     context '存在しない選択色地を開こうとしたとき' do
402       it '404RecordNotFound例外を返す' do
403         lambda{
404           GroundColor.show 110, @author
405         }.should raise_error(ActiveRecord::RecordNotFound)
406       end
407     end
408   end
409   describe '単体取得オプションに於いて' do
410     it 'includeキーを含んでいる' do
411       r = GroundColor.show_opt
412       r.has_key?(:include).should be_true
413     end
414     it '2つの項目を含んでいる' do
415       r = GroundColor.show_opt[:include]
416       r.should have(2).items
417     end
418     it 'コマを含んでいる' do
419       r = GroundColor.show_opt[:include]
420       r.has_key?(:panel).should be_true
421     end
422       it 'コマは作家を含んでいる' do
423         r = GroundColor.show_opt[:include]
424         r[:panel].has_key?(:author).should be_true
425       end
426     it '色を含んでいる' do
427       r = GroundColor.show_opt[:include]
428       r.has_key?(:color).should be_true
429     end
430   end
431   describe 'json単体出力オプションに於いて' do
432     before do
433       @gc = FactoryGirl.create :ground_color, :panel_id => @panel.id, :color_id => @color.id
434     end
435     it 'コマを含んでいる' do
436       r = GroundColor.show(@gc.id, @author).to_json GroundColor.show_json_opt
437       j = JSON.parse r
438       i = j
439       i.has_key?('panel').should be_true
440     end
441       it 'コマは作家を含んでいる' do
442         r = GroundColor.show(@gc.id, @author).to_json GroundColor.show_json_opt
443         j = JSON.parse r
444         i = j
445         s = i['panel']
446         s.has_key?('author').should be_true
447       end
448     it '色を含んでいる' do
449       r = GroundColor.show(@gc.id, @author).to_json GroundColor.show_json_opt
450       j = JSON.parse r
451       i = j
452       i.has_key?('color').should be_true
453     end
454   end
455   
456 end