OSDN Git Service

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